Linux System Call 추가

연구 중에 시스템에 대한 low-level 정보가 필요한데, 리눅스 시스템에서 제공하지 않는 기능이기에 직접 구현해야 했다. 창현이 형이 system call을 추가해서 해결하기를 추천해주셨다. Linux system call을 추가하는 방법을 알아보았다. 창현이 형의 블로그와 다른 분의 블로그를 참고했다. [1, 2]

리눅스 커널 소스 코드를 다운받는다.

$wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.11.10.tar.gz
$tar -xvf ./linux-3.11.10.tar.gz

추가하고자 하는 시스템 콜을 작성한다. (gumdaeng_syscall)
/path/to/kernel/source/kernel/gumdaeng_syscall.c

#include <linux/kernel.h>
asmlinkage long sys_gumdaeng_syscall(void)
{
    printk(KERN_EMERG "GUMDAENG_SYSCALL\n");
    return 1;
}

Makefile을 수정한다. gumdaeng_syscall.o를 추가함.
/path/to/kernel/source/kernel/Makefile

obj-y     = fork.o exec_domain.o panic.o \
        cpu.o exit.o itimer.o time.o softirq.o resource.o \
        sysctl.o sysctl_binary.o capability.o ptrace.o timer.o user.o \
        signal.o sys.o kmod.o workqueue.o pid.o task_work.o \
        rcupdate.o extable.o params.o posix-timers.o \
        kthread.o wait.o sys_ni.o posix-cpu-timers.o mutex.o \
        hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \
        notifier.o ksysfs.o cred.o reboot.o \
        async.o range.o groups.o lglock.o smpboot.o gumdaeng_syscall.o
...

다음으로 시스템 콜 테이블에 시스템 콜을 등록한다.
시스템 콜 테이블은 다음 경로에 있으며, 자세한 설명은 [1]을 참고하면 된다.
314번 시스템 콜로 gumdaeng_syscall을 등록함.
/path/to/kernel/source/kernel/arch/x86/syscalls/syscall_64.tbl

#
# 64-bit system call numbers and entry vectors
#
# The format is:
# <number> <abi> <name> <entry point>
#
# The abi is "common", "64" or "x32" for this file.
#
0   common  read            sys_read
1   common  write           sys_write
2   common  open            sys_open
3   common  close           sys_close
...
312 common  kcmp            sys_kcmp
313 common  finit_module        sys_finit_module
314 common  gumdaeng_syscall    sys_gumdaeng_syscall

#
# x32-specific system call numbers start at 512 to avoid cache impact
# for native 64-bit operation.
#
512 x32 rt_sigaction        compat_sys_rt_sigaction
513 x32 rt_sigreturn        stub_x32_rt_sigreturn
514 x32 ioctl           compat_sys_ioctl
...

System call을 추가한 커널을 컴파일한다. bzImage, module을 컴파일한 다음에 설치한다[3].

$make bzIamge -j13
$make modules -j13
$sudo make INSTALL_MOD_STRIP=1 modules_install
$sudo cp .config /boot/config-3.11.10
$sudo cp ./arch/x86_64/boot/bzImage /boot/vmlinuz-3.11.10
$sudo mkinitramfs –o /boot/initrd.img-3.11.10 3.11.10
$sudo update-grub

재부팅한 다음에 다음과 같이 시스템 콜을 호출하는 프로그램을 만들고 실행한다.

#include <sys/syscall.h>
#define __NR_gumdaeng_syscall 314

int main()
{
    syscall(__NR_gumdaeng_syscall);
    return 0;
}
$gcc ./syscall_test.c -o syscall_test
$./syscall_test
$dmesg | grep GUMDAENG
[  176.108533] GUMDAENG_SYSCALL

References:
[1] 박창현, Adding a System call for Linux 3.10 x86_64, http://heartinpiece.blogspot.kr/2014/01/adding-system-call-for-linux-310-x8664.html
[2] 리눅스 시스템 콜 추가, http://harryp.tistory.com/69
[3] 허태경, Kernel Compile and Multi-booting using Grub2, https://gumdaeng.com/2014/07/04/kernel-compile-and-multi-booting-using-grub2/

Advertisements
Tagged with: ,
Posted in 2) Computer Engineering

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 98,786 hits
%d bloggers like this: