System Call 구현
Kernel 소스 다운 및 사전 작업
- 현재 리눅스의 커널 정보 확인
- 아래 사이트에서 설치할 linux kernel 다운
- 해당 글에서는 4.18.18 사용
- https://www.kernel.org/
- root 계정 접속 후
/usr/src
에 받은 linux kernel 소스 압축 해제
- 모든 작업은
/usr/src/linux-4.18.18
에서 진행되기 때문에 밑에 글부터는 해당 위치를 "base_dir"로 명시 "base_dir"/include/linux/syscall.h
에 실습에 사용할 함수 정의
"base_dir"/arch/x86/entry/syscalls/syscall_64.tbl
에 System Call Table 등록- # x32-specific ... 위에 추가
- 만약 32bit라면 syscall_32.tbl 맨 아래에 추가
- System Call 함수 구현
- "base_dir"/kernel/addcall.c 작성
#include <linux/unistd.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
asmlinkage long sys_addcall(void)
{
printk(KERN_EMERG "Hello World\n");
return 0;
}
- "base_dir"/kernel/Makefile/에 object파일인 addcall.o 작성
obj-y = fork.o exec_domain.o panic.o \
cpu.o exit.o softirq.o resource.o \
sysctl.o sysctl_binary.o capability.o ptrace.o user.o \
signal.o sys.o umh.o workqueue.o pid.o task_work.o \
extable.o params.o \
kthread.o sys_ni.o nsproxy.o \
notifier.o ksysfs.o cred.o reboot.o \
async.o range.o smpboot.o ucount.o addcall.o
obj-$(CONFIG_MODULES) += kmod.o
obj-$(CONFIG_MULTIUSER) += groups.o
ifdef CONFIG_FUNCTION_TRACER
Kernel Compile & Booting
- Kernel Compile을 위한 관련 패키지 설치
$ sudo apt-get update
$ sudo apt-get install build-essential libncurses5 libncurses5-dev bin86 kernel-package libssl-dev bison flex libelf-dev
- 설정없이 진행하기 위해 현재 사용중인 커널의 config 파일 복사
- make menuconfig를 사용해 아래 순서대로 커널 설정
- 컴파일 시간을 줄이기 위하여 컴퓨터의 모든 코어 사용를 사용하여 컴파일
$ grep -c processor /proc/cpuinfo # core 수 확인
$ make-kpkg --J 2 --initrd --revision=1.0 kernel_image # kernel compile
- 컴파일한 kernel 설치
$ dpkg -i linux-image-4.18.18_1.9_amd64.deb
- reboot 명령어로 재부팅
- 재부팅 후 새로 설치한 컬러로 부팅되었는지 확인
Test Application을 이용한 결과 확인
반응형
'Linux > Embedded' 카테고리의 다른 글
Character Device Driver 실습 (0) | 2022.09.15 |
---|---|
Arg(인자처리) Module Programming (0) | 2022.09.15 |
Basic Module Programming (0) | 2022.09.13 |