実装手順
実装手順は、Level4で行ったシステムコールの実装と全く同じものを使う。
実装するシステムコールは、syscalltotalという名前でLevel4のtestの後
(284番目)に追加し、実装されているシステムコールの総数をint型で
返す機能を持つとする。
各ソースの修正箇所は以下の通りである。
システムコール番号対応表修正
linux-2.6.16.18/kernel/sys.c
...
#define __NR_pselect6 280
#define __NR_ppoll 281
#define __NR_unshare 282
/* added system calls */
#define __NR_test 283
#define __NR_syscalltotal 284
#define __NR_syscalls 285
...
システムコールテーブル修正
linux-2.6.16.18/arch/powerpc/kernel/systbl.S
...
SYSCALL(inotify_rm_watch)
SYSCALL(spu_run)
SYSCALL(spu_create)
COMPAT_SYS(pselect6)
COMPAT_SYS(ppoll)
SYSCALL(unshare)
SYSCALL(test)
SYSCALL(syscalltotal)
システムコール実装
linux-2.6.16.18/kernel/sys.c
...
int sys_syscalltotal()
{
return __NR_syscalls;
}
システムコール呼び出しプログラム
実行要プログラム「sct.c」
#include<stdio.h>
#include</usr/src/linux-2.6.16.18/include/asm-powerpc/unistd.h>
#include<errno.h>
#include<string.h>
_syscall0(int, syscalltotal);
int main(){
printf("system call total = %d\n",syscalltotal());
}
実行結果
作成したsct.cをコンパイルし、実行すると以下のような出力が得られる。
unix_kernel/syscalltest> ./sct
system call total = 286
unix_kernel/syscalltest>
考察
osの内部情報としてはカレントプロセスのプロセスIDやリーダープロセスのIDを
とることもできる。だが、他のシステムコールでその機能は実装されているため
(getpidなど)、今回のようなシステムコールの実装になった。