2007年06月26日Tue [10:11] Linux  

Kernel-2.6.21でのrequest_irq&free_irq

納品の時期ですっかりBlogのことを忘れてた。
というわけで久しぶりに更新。

Kernel2.6.20を今まで使っていて、今回2.6.21に変更したら
担当ドライバをinsmodしたときにNULLポインタにアクセスして
カーネルパニックを起こすようになっちゃった。
そんなわけで、コードの見直しを迫られたわけですが、
どうやら、request_irq近辺で落ちているらしい。
で、コンソールにデバッグ出力させたら、どうやらrequest_irqで
登録するhandlerがなぜか呼ばれていると。
このドライバでは、ユーザがinit処理を呼び出してから割り込みが
発生するという前提の下、作られていたわけで
insmod時に割り込みハンドラが呼ばれたせいでinit処理していない変数を
参照したためにNULLポインタアクセスエラーになったという落ちでした。

で、request_irqの何が変わったんだということを調べると

↓Open.

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

2007年05月18日Fri [14:29] Linux  

セマフォを使う(その2)

というわけで、その1では概念だけを説明したので
今回はセマフォの関数の覚書。

↓Open.

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

2007年05月18日Fri [10:53] Linux  

セマフォをつかう(その1)

/procファイルを使うででてきたセマフォについてめもっておいてみる。
まずはセマフォの簡単な概念から。
簡単に言えばある処理を、一定の数以上の同時処理を防ぐということ。

↓Open.

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

2007年05月17日Thu [15:38] Linux  

キャラクタデバイスの登録

デバイス番号の割り当て(静的)
int register_chrdev_region(dev_t first, unsigned int count, char *name)
引数1登録するdev_t。メジャー番号とマイナー番号を持っている。
引数2登録する数。
引数3登録するデバイス名

デバイス番号の割り当て(動的)
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)
静的とほとんど同じ。
引数1に渡したアドレスに動的に割り当てられるdev_tが入れられる。
firstminorははじめのマイナー番号。

デバイス番号の解放
void unregister_chrdev_region(dev_t first, unsigned int count)
引数1は割り当てたdev_tを渡す。
引数2は解放する数。

cdev初期化
void cdev_init(struct cdev * cdev, struct file_operations *fops)
引数1はcdev。キャラクタ型デバイスを表す構造体。
引数2はファイルオペレーション構造体。ドライバを用いて呼び出す処理を割り当てる。

cdev登録
int cdev_add(struct cdev *cdev, dev_t num, unsigned int count)
引数1はcdev。上で初期化したやつを入れてやればいい。
引数2はdev_t。デバイスのメジャー番号とマイナー番号を格納しているらしい。
引数3はデバイス番号の数。

cdev削除
void cdev_del(struct cdev *cdev)
引数1はcdev。上で登録したやつを入れればいい。



↓Open.

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

2007年05月12日Sat [09:48] Linux  

init_moduleとcleanup_module

デバイスドライバについて復習してみる。
というわけで、まずはinit_moduleとcleanup_moduleから。

↓Open.

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