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
테이블 파일 속 목록 중에서
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
system call number를 이용하여 처음에 정의했던 시스템 함수를 호출할 수 있다.
해당 파일은 우분투 속 어느 위치에든 자유롭게 만들면 된다.
나는 home/bibi/ 에 추가했던 것 같다.
gcc example.c -o result
./result
dmesg -w
위 커맨드를 입력하면 시스템 콜에서 printk 가 잘 작동된 것을 확인할 수 있다.
'3 - 공부 기록' 카테고리의 다른 글
[TIL] How to avoid overfitting 오버피팅을 막는 방법 (0) | 2022.05.16 |
---|---|
[TIL] Overfitting 오버피팅 (0) | 2022.05.16 |
[TIL] Perceptron 퍼셉트론 (0) | 2022.05.16 |
[Linux/Ubuntu] How To Add Extra Hard Disk to VirtualBox VM 버츄얼박스 디스크 추가 방법 (0) | 2022.04.12 |
[Linux/Ubuntu] Kernel Compile (2) | 2022.04.12 |