納品の時期ですっかりBlogのことを忘れてた。
というわけで久しぶりに更新。
Kernel2.6.20を今まで使っていて、今回2.6.21に変更したら
担当ドライバをinsmodしたときにNULLポインタにアクセスして
カーネルパニックを起こすようになっちゃった。
そんなわけで、コードの見直しを迫られたわけですが、
どうやら、request_irq近辺で落ちているらしい。
で、コンソールにデバッグ出力させたら、どうやらrequest_irqで
登録するhandlerがなぜか呼ばれていると。
このドライバでは、ユーザがinit処理を呼び出してから割り込みが
発生するという前提の下、作られていたわけで
insmod時に割り込みハンドラが呼ばれたせいでinit処理していない変数を
参照したためにNULLポインタアクセスエラーになったという落ちでした。
で、request_irqの何が変わったんだということを調べると
というわけで久しぶりに更新。
Kernel2.6.20を今まで使っていて、今回2.6.21に変更したら
担当ドライバをinsmodしたときにNULLポインタにアクセスして
カーネルパニックを起こすようになっちゃった。
そんなわけで、コードの見直しを迫られたわけですが、
どうやら、request_irq近辺で落ちているらしい。
で、コンソールにデバッグ出力させたら、どうやらrequest_irqで
登録するhandlerがなぜか呼ばれていると。
このドライバでは、ユーザがinit処理を呼び出してから割り込みが
発生するという前提の下、作られていたわけで
insmod時に割り込みハンドラが呼ばれたせいでinit処理していない変数を
参照したためにNULLポインタアクセスエラーになったという落ちでした。
で、request_irqの何が変わったんだということを調べると
Comment:0 | Trackback:0 | Edit | Page Top.↑
Comment:0 | Trackback:0 | Edit | Page Top.↑
Comment:0 | Trackback:0 | Edit | Page Top.↑
デバイス番号の割り当て(静的)
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。上で登録したやつを入れればいい。
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。上で登録したやつを入れればいい。
Comment:0 | Trackback:0 | Edit | Page Top.↑
デバイスドライバについて復習してみる。
というわけで、まずはinit_moduleとcleanup_moduleから。
というわけで、まずはinit_moduleとcleanup_moduleから。
Comment:0 | Trackback:0 | Edit | Page Top.↑



