2007年05月18日Fri [10:52] 未分類  

/procファイルを使う

/procファイルって何?
 ソフトウェアが作成する特殊なファイルシステムらしい。
 カーネルが情報を外部にエクスポートするために使用するらしい。

デバイスドライバの情報を簡単に外部(ユーザ空間)に出せるって考えればいいのかな?
デバッグなんかでprintkでコンソールに情報を出すのもいいけど
タイミングがシビアなドライバだとprintkの処理による処理落ちで内部処理が
変わってきちゃうからそんなのとかの回避に使うといいみたい。

まずは関数から
エントリーを作成する関数がこれ。
struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode,
struct proc_dir_entry *base, read_proc_t *read_proc, void *data)

長い。
引数1:nameは作成するファイル名。
引数2:modeはファイルの保護マスク。保護マスクって何?デフォルトモードは0らしい。
引数3:baseはファイルが作成されるディレクトリ。NULLだと/procになる。
引数4:read_procは/proc読み出すときに呼ばれる関数を指定。
引数5:dataは謎。カーネルは無視するけどread_procには渡されるとか。

で、引数4のread_procってのは
int (*read_proc) (char *page, char **start, off_t offset, int count, int *eof, void *data)
って関数を使うらしい。
引数1:pageはデータを書き込む先のバッファ
引数2:startは対照のデータがpageのどこをさしているかを示す
引数3:offsetはアクセスしている位置
引数4:countはread出来る最大文字数
引数5:eofはデータがすべて書かれたときに返す値
引数6:dataは内部処理に使うらしい


エントリーの逆も必要なわけで。
void remove_proc_entry(const char *name, struct proc_dir_entry *base)
引数1:nameは生成のときのnameと一緒
引数2:baseも生成のときのbaseと一緒

で、今回は読み取り関数だけを使用する場合だけど、書き込みも出来るらしい。
それの覚書はまた今度。

で、いつもどおり続きに動くかわからないサンプルコード。
いいかげんな関数の説明より、実装例を見たほうがたぶん簡単。

↓Open.

Comment:0 | Trackback:0 | Edit | Page Top.↑

2007年05月12日Sat [18:39] 未分類  

insmodの時に引数を渡したい

モジュールパラメータというらしい。
これを使えば、処理の切り分けやら、メッセージのオンオフを
わざわざ再コンパイルしてロードしなおさなくても良くなる。

↓Open.

Comment:0 | Trackback:0 | Edit | Page Top.↑