#define __NR_exit 1 #define __NR_fork 2 ...
となっているところがあるので、それの末尾に
#define __NR_(システムコール名) (空き番号)
を挿入。この時の空き番号がシステムコール番号になるので憶えておくこと。
.data ENTRY(sys_call_table) .long SYMBOL_NAME(sys_ni_call) /* 0 */ .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork) ...
次のようなテーブルがあるので、既にあるシステムコールのコメントを元に
先程のシステムコール番号と一致する場所に
.long SYMBOL_NAME(sys_(システムコール名))
を挿入。
また、Linux2.6.XXの場合、entry.Sにはシステムテーブルに関するテーブルが無
く、
その代わりに linux/arch/i386/kernel/syscall_teble.S にそれに近いことが記
述されているので
システムコール番号と一致する場所に
.long sys_(システムコール名)
を挿入することで設定出来る。
obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o\ ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ pci-dma.o i386_ksyms.o i387.o bluesmoke.o dmi_scan.o
のようになっている箇所があるのでここに (システムコール名).o を追記。
"(システムコール名).h"というファイルを次の書式で linux/include/linux ディ レクトリに記述。
#ifndef __LINUX_(システムコール名を大文字で)_H #define __LINUX_(システムコール名を大文字で)_H #include#include #include (※) #endif
※ここには_syscallX(Xはシステムコールのとる引数の数が入る、0の場合は省略)
という関数が入る。
例えばX=2の場合の書式はこうなる。
_syscall2((システムコールの関数型),(システムコールの名前),(引数1の変数 型),(引数1の名前),(引数2の変数型),(引数2の名前));
これは、システムコールを呼び出すための関数(=ライブラリ関数)を作るための マクロである。
"(システムコール名).c"というファイルを次の書式で linux/arch/i386/kernel ディレクトリに記述。
#includeasmlinkage (関数型) sys_(システムコール名)(引数) { /*システムコール実行部*/ }
ここまで完了したらカーネルを再構築することで追加したシステムコールが使用 可能になる。
ちなみに今回の実験で使用するシステムコールとそれの検証用のプログラムは以 下の通り。
#与えられたint数値の三倍の値を返すシステムコール sys_arg_triple()
○arg_triple.h #ifndef __LINUX_ARG_TRIPLE_H #define __LINUX_ARG_TRIPLE_H #include#include _syscall1(int, arg_triple, int, arg1); #endif ○arg_triple.c #include asmlinkage int sys_arg_triple(int arg1) { int j = 3; j = j * arg1; return j; } ○syscalltest.c #include #include #include int main() { int i = 3; printf("test arg_triple(%d) = %d ?n", i, arg_triple(i)); return 0; }
システムコールをテストするプログラムには必ずシステムコールのヘッダファイ ルを include させること。
[j03063@pw039 ~/info4]% ls syscalltest.c [j03063@pw039 ~/info4]% gcc -o test.out syscalltest.c [j03063@pw039 ~/info4]% ./test.out Incorrectly built binary which accesses errno or h_errno directly. Needs to be fixed. test arg_triple(3) = 9 [j03063@pw039 ~/info4]%
設定や書式が悪かったのか、エラーが発生している。
時間が無かったので原因究明はしていない。
ただ、システムコール自体は正常に動いている模様。