system callの登録

カーネル3.8.8のソースを準備します.まず,syscalls_32.tblの最後に以下のように,追加したいsystem callsの名前を書きます.この時の番号は覚えておく(ここでは,351).次に, syscalls.hの最後に,プロトタイプを書いておきます.

$ cd /usr/src/linux-3.8.8
$ sudo vim arch/x86/syscalls/syscall_32.tbl

351   i356   kanako   sys_kanako # 最後に追加

$ sudo vim include/linux/syscalls.h

asmlinkage long sys_kanako(void); # 最後に追加

system callの中身

sys.cの最後に,system callの中身を書いていきます.今回はprintk()を使って,コンソールログにメッセージを出力させました.

$ sudo vim kernel/sys.c

asmlinkage long sys_kanako(void){
    printk("Cinderella of tea plantation\n")
    return 0;
}

コンパイル・インストール

sudo fakeroot make-kpkg --initrd --revision=1.0.mysyscall kernel-image kernel-headers
sudo dpkg -i linux-image-3.8.8_1.0.mysyscall_i386.deb
sudo dpkg -i linux-headers-3.8.8_1.0.mysyscall_i386.deb
sudo reboot

確認

syscall()で登録したsystem callを呼び出します.実行後,dmesgコマンドを使うと,正しくメッセージが出力されることがわかります.

#include<linux/unistd.h>
#define __KANAKO__ 351 # はじめに決めた番号

int main(void){
    syscall(__KANAKO__);
    return 0;
}
$ dmesg

[ 3197.037948] Cinderella of tea plantation

参考:Adding a new system call in Linux kernel 3.8.2