개인 공부/리눅스

Ubuntu 시스템콜 추가

RyoTTa 2021. 1. 7. 00:57
반응형

1. 간단한 시스템콜 소스코드 추가

 

 $ cd /usr/src/linux-5.5.16

 $ sudo vi kernel/hello.c

매개변수 x, y를 곱하여 값을 전달해주고 로그를 출력하는 시스템콜 코드

 시스템 콜 핸들러 함수는 리눅스 커널에서 제공하는 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' 추가

syscall_64.tbl

 <시스템콜번호> <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);

syscalls.h

 만약 구조체와 복잡한 변수가 존재한다면 같이 선언해주는것이 편하다.

 

4. Makefile 수정

 

 $ cd /usr/src/linux-5.5.16
 $ sudo vi kernel/Makefile

 

 'oby-y' 곳에 아래와 같이 추가한다.

 hello.o

Makefile

 

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

 

Kernel Recompile

 

6. 테스트

 

 $ vi test.c
 $ gcc test.c
 $ ./a.out
 $ dmesg

 

test.c
bash
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