본문 바로가기
3 - 공부 기록

[Linux/Ubuntu] System Call

by seonshine-bibi 2022. 4. 12.
반응형
sudo su

 

 

1. Define system call function

 

vim linux-5.x4.x67/kernel/my_sys_call_file_name.c
#include <linux/kernel.h>

asmlinkage long sys_mycall(void) {
	printk("System Call Example!\n");
    return 0;
}

 

 

예시를 위해 간단한 C코드를 작성하여 저장한다.

 

 

 

2. Add the file to Makefile

 vim linux-5.4.67/kernel/Makefile

 

Makefile에서 obj-y 항목 가장 뒤에

띄어쓰기 + my_sys_call_file_name.o

를 써주고 저장한다.

 

 

 

3. Add system call number

 

system call number를 등록해야한다.

 

64-bit 시스템의 경우 ↓

 

 vim linux-5.4.67/arch/x86/entry/syscalls/syscall_64.tbl

 

32-bit 시스템의 경우 ↓

 

 vim linux-5.4.67/arch/x86/entry/syscalls/syscall_32.tbl

 

 

system call number 추가

 

 

테이블 파일 속 목록 중에서

common 에 해당하는 부분이 끝나는 가장 아래에

+1 한 번호로 호출 번호를 추가한다.

(번호는 시스템마다 다를 것이므로 common 항목의 가장 마지막 번호 +1 인 번호로 추가하면 된다.)

 

 

 

4. Register system call table

 

 vim linux-5.4.67/include/linux/syscalls.h

 

이전에 작성했던 C 코드의 함수 헤더를 시스템 호출 헤더 파일 중

asmlinkage long ~~~~ ();

위와 같은 목록의 가장 하단 부분(#endif의 바로 윗 줄)에 써준다.

 

 

 

5. Kernel compile

 

1~4번의 과정 후에 커널을 다시 컴파일 해야 한다.

컴파일 전 update 와 upgrade를 진행한다.

 

apt-get install gcc
apt-get install libncurses5-dev
apt-get update
apt-get upgrade

 

그리고 컴파일을 진행한다.

 

make menuconfig
make

make modules_install
make install

 

make 에서 많은 시간이 걸린다.

 

make 도중에 virtual machine이 멈추고 꺼지는 상황이 여러 번 있었다.

virtual machine 디스크 용량을 키워주니 해결되었다.

 

커널 컴파일을 위해 40GB 이상은 필요할 것이라고 들어서

나는 넉넉하게 60GB 이상으로 잡았다.

 

 

6. grub 변경

 

vim /etc/default/grub

 

 

grub_default 를 변경한다.

 

update-grub

 

변경 후에는 업데이트를 해주어야 적용이 된다.

 

 

7. System call usage

 

example.c

 

system call number를 이용하여 처음에 정의했던 시스템 함수를 호출할 수 있다.

해당 파일은 우분투 속 어느 위치에든 자유롭게 만들면 된다.

나는 home/bibi/ 에 추가했던 것 같다.

 

gcc example.c -o result

./result

 

함수 실행의 결과값 확인

 

dmesg -w

 

위 커맨드를 입력하면 시스템 콜에서 printk 가 잘 작동된 것을 확인할 수 있다.

 

 

시스템 콜 실행

반응형