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