->back to toppage

課題内容 - Level.5 -

何か、OS内部の情報を取得するシステムコールを作成せよ。
psなどでとれる情報でもよいし、そうでないものでも良い。


報告内容

実装手順

実装手順は、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など)、今回のようなシステムコールの実装になった。



参考文献



<-previous problem    go to top    next problem->