NetBSDにシステムコールを追加する

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.masternopを追加したときのシステムコール番号を指定します。

#include <stdio.h>
#include <sys/syscall.h>

int main(void)
{
    int ret = syscall(481);
    printf("%d\n", ret);

    return 0;
}

コンパイルして実行し、以下のような出力があれば成功です。

nop called
0