2009年11月19日木曜日

システムコールの追加

Linux2.6.25カーネルにシステムコールの追加をするのでメモメモ.
ちなみにその時にx86? bit数?とかかなり初歩的なことが分かっていないことが発覚したので,それについても近いうちにまとめます.

●システムコールの追加のためにすること
1)システムコール番号の登録
2)システムコールテーブルに登録
3)追加するシステムコールのオブジェクトファイル名をMakefileに追記
4)ヘッダファイルの作成
5)システムコール本体の作成
6)カーネルの再構築

以下,詳しくやることを書いていきます.

1)システムコール番号の登録
 include/asm/unistd_32.h に
 #define __NR_システムコール名 システムコール番号
 を追加.
 /usr/include/asm/unistd_32.hにも同様に追記する
/*62bitb版OSの場合は,unistd_64.hに追記する*/
/*OSのbit数は$uname -iで調べました*/

2)システムコールテーブルに登録
 arch/x86/kernel/syscall_table_32.S に
 .long sys_システムコール名
 を追加.

3)追加するシステムコールのオブジェクトファイル名をMakefileに追記
 arch/x86/kernel/Makefile のobj-yの項目に
 システムコール名.o
 を追加.

4)ヘッダファイルの作成
4-1)カーネル空間用
 include/linux/システムコール名.h を作成

#ifndef NR_システムコール名_H
#define NR_システムコール名_H

#include <linux/unistd.h>
#include <linux/linkage.h>

#define システムコール名(arg1) syscall(__NR_システムコール名, arg1)

#endif

4-2)ユーザ空間用
 /usr/include/linux/システムコール名.h を作成
4-1で作成したヘッダファイルの#include <linux/linkage.h>#include <linux/syscall.h>に変更したものを作成する

5)システムコール本体の作成
システムコール名.cというファイルを以下のように作成し,arch/x86/kernel/以下に保存する.

#include <linux/システムコール名.h>

asmlinkage 関数型 sys_システムコール名 (引数){
 /* システムコールの内容を記述 */
}


6)カーネルの再構築
make bzImage && make install をした後に再起動!

システムコールをユーザモードプロセスから利用する場合は,ファイル内に#include <linux/システムコール名.h>を記述して利用する


これでいけるハズ