NetBSDにシステムコールを追加してみます。
環境
- DELL Latitude E6540
- Intel Core i7-4610M (Haswell)
- BIOS (Legacy boot)
- NetBSD 7.1
システムコールの追加
まずはsys/kern/syscalls.master
に、追加するシステムコールのプロトタイプ情報を追記します。
今回は何もしないnop
システムコールを追加します。
引数はとらず、即座に0を返します。
481 STD RUMP { int|sys||nop(void); }
追記後、sys/kern/makesyscalls.sh
を実行します。
これがおおかたの作業をやってくれるようです。
# sh makesyscalls.sh syscalls.conf syscalls.master
nop
システムコールのなかみを忘れずに定義しておきます。
ここでは新しいファイルsys/kern/sys_nop.c
を追加しました。
#include <sys/syscallargs.h>
#include <sys/systm.h>
int sys_nop(struct lwp* _lwp, const void* _args, register_t* _regs)
{
printf("nop called\n");
return 0;
}
nopとは言うものの、デバッグ用にprintf()
しています。
sys/systm.h
のインクルードはそのためです。
関数プロトタイプは、makesyscalls.sh
を実行したときにsys/sys/syscallargs.h
に追記されたものに合わせます。
今回は新しいファイルを追加したので、ビルドするファイルのリストにそのファイルを追加しておきます。
編集するファイルはsys/conf/files
です。
file kern/sys_nop.c
ビルド
NetBSDカーネルのビルドを参照してください。
いちどconfigure
からやり直すとうまくいくようです。
動作確認
libcにラッパーを用意していないので、syscall(2)
で呼び出すことにします。
sys/kern/syscalls.master
にnop
を追加したときのシステムコール番号を指定します。
#include <stdio.h>
#include <sys/syscall.h>
int main(void)
{
int ret = syscall(481);
printf("%d\n", ret);
return 0;
}
コンパイルして実行し、以下のような出力があれば成功です。
nop called
0