system callの登録
カーネル3.8.8のソースを準備します.まず,syscalls_32.tblの最後に以下のように,追加したいsystem callsの名前を書きます.この時の番号は覚えておく(ここでは,351).次に, syscalls.hの最後に,プロトタイプを書いておきます.
1
2
3
4
5
6
7
8
9
|
$ 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()を使って,コンソールログにメッセージを出力させました.
1
2
3
4
5
6
|
$ sudo vim kernel/sys.c
asmlinkage long sys_kanako(void){
printk("Cinderella of tea plantation\n")
return 0;
}
|
コンパイル・インストール
1
2
3
4
|
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コマンドを使うと,正しくメッセージが出力されることがわかります.
1
2
3
4
5
6
7
|
#include<linux/unistd.h>
#define __KANAKO__ 351 # はじめに決めた番号
int main(void){
syscall(__KANAKO__);
return 0;
}
|
1
2
3
|
$ dmesg
[ 3197.037948] Cinderella of tea plantation
|
参考:Adding a new system call in Linux kernel 3.8.2