[라즈베리파이] SystemCall

HEEJOON MOON·2022년 6월 8일
0

Kernel programming

  • stdio.h와 같은 User header file은 user program 용
  • Kernel은 /usr/include/linux와 /usr/include/asm의 헤더파일만을 include

Kernel Subroutines in Linux

Interrupt

  • cli()/sti() : clear/set interrupt enable
  • save_flags(unsigned long flat), restore_flags(unsigned long flag)
    : status register의 내용을 저장하고 복원
    : 두 매크로 함수는 반드시 같은 함수 안에서 호출되어야 함
  • int request_irq() : IRQ에 대한 인터럽트 핸들러를 등록
  • void free_irq() : request_irq()에서 등록한 interrupt handler를 해제

Memory Allocation

System call 실습

kernel 수정

1) unistd.h에 system call 번호 정의
$ vi arch/arm/include/upai/asm/unistd.h

2) call.S에 System call 처리 함수 등록
$ vi arch/arm/kernel/call.S

3) System call 처리함수 구현
$ vi include/linux/syscalls.h -> 헤더파일에 먼저 선언
$ vi kernel/mysyscall.c -> 소스 구현

< mysyscall.c>
#include <linux/unistd.h>
#include <linux/errno.h>
#include <linux/sched.h>
asmlinkage int sys_mysyscall(int n, int m){
	printk("[Hello world!] %d * %d = %d \n", n, m, n*m); // 커널에 출력
    return n * m;
}

4) kernel 재컴파일
$ vi kernel/Makefile -> Makefile에 mysyscall.o 추가
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage –j4 -> 커널 rebuild

Library 및 Application 코딩

1) System call Library -> application에서 사용될 수 있도록 라이브러리 추가
$ mkdir ../syscall; cd ../syscall -> syscall이라는 라이브러리 생성
$ vi newsyscall.c -> syscall 함수 구현

<newsyscall.h>
#include "home/ubuntu/working/linux/arch/arm/include/uapi/asm/unistd.h"
int mysyscall(int n, int m){
	return syscall(__NR_mysyscall, n, m);
}
<application -> syscall_app.c>
#include <stdio.h>
int main(){
	mysyscall(3,5);
    return 0;
}
profile
Robotics, 3D-Vision, Deep-Learning에 관심이 있습니다

0개의 댓글