level5

何か、OS内部の情報を取得するシステムコールを作成せよ。

psなどでとれる情報でも良いし、そうでないものでも良い。

システムコールを作成

OSの内部情報として、プロセスID情報を取得するシステムコールを作成する。
*****************
test.c
*****************
#include 
#include 

int sys_test(char* comment)
{
  int pid;

  pid = current->pid;
  if(comment)
    printk("syscall_test: %s pid = %d?n", comment, pid);
  return 0;
}
システムコール番号の定義、エントリへの追加等をlevel4と同様に行う。

APへインターフェースの記述を行う

*************
test.h
************
#ifndef __TEST_H
#define __TEST_H

#include 
#include 
#include 

#ifndef __KERNEL__
_syscall1(int, test, char*, comment)
#endif

#endif

APへのインタフェースの記述を行う。
ここでは、APからsyscallを使ってシステムコールを行うのではなく,
''linux/unistd.h''で定義されているsyscallX()マクロを使う方法をとる。
(Xにはシステムコールの引数の数に応じて0〜5が入る)。
syscallX()の引数には「システムコールの戻り値の型、システムコール名、 第1引数の型、第1引数の名前、...」を入れる。


テストプログラムの作成

カーネルのコンパイルを行った後、システムコールを追加したカーネルが動作確 認の為のプログラムを作成する。
******************
test2.c
******************
#include 
#include 

int main(int argc, char** argv)
{
  if(argc == 2)
    test(argv[1]);
  return 0;
}

テストプログラムの実行結果

作成したテストプログラムを実行すると、/var/log/messagesにおいて以下のよ うなメッセージが得られる。
[root@pw039 j03012]% ./a.out foo
[root@pw039 j03012]% tail -1 /var/log/messages
Jan 12 20:09:09 pw039 kernel: syscall_test: foo pid = 1754
これより、作成したシステムコールの動作を確認することができる。

考察

level4と同様の手順を踏んで、システムコールを作成し動作の確認を行った。
test.cにおいて、pid = current->pidでプロセスIDを取得する。

システムコールを作成
APへインターフェースの記述を行う
テストプログラムの作成
テストプログラムの実行結果
考察

level4 top levle6