如何在linux kernel 中加入system call

建立一個叫helloworld.c的程式,這個就是我們的system call。

  • kernel 底下 建立 helloworld.c
#include <linux/linkage.h>
#include <linux/kernel.h>

asmlinkage int sys_helloworld(void);

asmlinkage int sys_helloworld(void)
{
    printk(KERN_EMERG "hello world!");
    return 1;
}
  • include/linux/syscalls.h 增加
asmlinkage int sys_helloworld(void);

syscall_32.tbl,在最後加上

350     i386    helloworld              sys_helloworld

注意:編號不一定為350,如果希望用在64bit的kernel上,請把syscall_32.tbl改成syscall_64.tbl,並把這行改成:

350     common  helloworld              sys_helloworld

kernel/Makefile,加這一行:

obj-y                   += helloworld.o
#include <syscall.h>
#include <sys/types.h>

int main(void) {
    int a=syscall(350);
    return 0;
}

編譯及執行測試程式:

gcc -o test test.c
./test
ldd test
    linux-vdso.so.1 =>  (0x00007fff1c720000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a69a50000)
    /lib64/ld-linux-x86-64.so.2 (0x000055ae57f4d000)

用 qemu 需要把 libc.so.6 & ld-linux-x86-64.so.2 放進 qemu 系統裡面

scp -P 5555 /lib/x86_64-linux-gnu/libc.so.6 root@localhost:/lib
scp -P 5555 /lib64/ld-linux-x86-64.so.2 root@localhost:/lib64

不然編譯要 -static

gcc -o -static test test.c
  • dmesg 可以看到
<0>[  327.782077] hello world!