1. 간단한 시스템콜 소스코드 추가
$ cd /usr/src/linux-5.5.16
$ sudo vi kernel/hello.c
시스템 콜 핸들러 함수는 리눅스 커널에서 제공하는 SYSCALL_DEFINE1과 같은 매크로 함수로 선언되어 있다.
SYSCALL_DEFINEx(시스템 콜 이름, 1st 인자 타입, 1st 인자 이름, 2nd 인자 타입, 2nd 인자 이름,...)
x는 매개변수 개수를 나타낸다.
2. 시스템콜 테이블에 엔트리 추가
$ cd /usr/src/linux-5.5.16
$ sudo vi arch/x86/entry/syscalls/syscall_64.tbl
'436 common hello __x64_sys_hello' 추가
<시스템콜번호> <ABI> <시스템콜이름> <엔트리포인트>
위와 같은 형태로 선언 해야한다.
3. 헤더파일에 시스템콜 선언
$ cd /usr/src/linux-5.5.16
$ sudo vi include/linux/syscalls.h
‘#ifndef CONFIG_ARCH_HAS_SYS_CALL_WRAPPER' 밑에 아래와 같은 선언을 한다.
asmlinkage int sys_hello(int x, int y);
만약 구조체와 복잡한 변수가 존재한다면 같이 선언해주는것이 편하다.
4. Makefile 수정
$ cd /usr/src/linux-5.5.16
$ sudo vi kernel/Makefile
'oby-y' 곳에 아래와 같이 추가한다.
hello.o
5. 재컴파일
Module을 제외한 Kernel 이미지만 재컴파일 하도록 한다.
$ cd /usr/src/linux-5.5.16
$ sudo make bzImage –j3
(Number of after j = number of allocated CPU cores)
$ sudo cp arch/x86/boot/bzImage /boot/vmlinuz-5.5.16
$ reboot
or
$ cd /usr/src/linux-5.5.16
$ make
$ sudo make install
$ reboot
6. 테스트
$ vi test.c
$ gcc test.c
$ ./a.out
$ dmesg
'개인 공부 > 리눅스' 카테고리의 다른 글
Centos 7, gcc 버전 업데이트 (0) | 2021.03.16 |
---|---|
Centos 7, SPEC2006 설치 - 1 (0) | 2021.03.11 |
Ubuntu 라이브러리 생성 (0) | 2021.01.07 |
커널 컴파일(Ubuntu) (0) | 2020.12.18 |
커널 컴파일(CentOS) (0) | 2020.12.17 |