linux
9/16(火) カーネル読書会@ミラクル・リナックスに参加しました。 「Debianパッケージ作成の入門の入門」ということで Debian JP Project やまねさんが実際にパッケージを作りながらのお話でした。 ふだんなにげなく apt-getコマンドで簡単にインストールし…
エントリーが滞ってしまってますが>< 9/12(金) 中野サンプラザで開催された Japan Linux Conference 2008 (以下、LCと呼びます)に出席してみました。 イベントは 11(木)とあわせて 2日間あったのだけど 後半 1日に出席しました。 というわけで、聴講したプ…
Linuxデバイスドライバについては とりあえずひとつの区切りとして 仮想デバイス制御までを、まとめたエントリーを 近々書きたいと思っています。 いままで断片的に書いたものも含めて。 モジュールのロード モジュールの登録 デバイス番号の作成 デバイスノ…
サーバに無駄なアクセスをしない、という zsh連番生成をワンライナで書けない悔しさもあるし 車輪を再発明してるかもしれないけど スクリプト(っていっても、ただのコマンドの羅列)にしました。 #!/bin/zsh CHANGELOG_2_6="http://www.kernel.org/pub/linu…
コンパイルが通るはずが通らないときに いちいち調べるのもめんどいなぁ、と思って ChangeLogの形式が決まってるんだから 収集しておいて、自分でインデクシングしてトレースしてけばいい? って思ったので、Linuxカーネルの ChangeLogを 全部取り込むことに…
http://www.kernel.org/pub/linux/kernel/
Linuxカーネル 2.6.0 の tty_structには、flipメンバがあった。 やっぱ最近消えたのかなぁ...。 I found flip member in tty_struct (tty.h) in Linux kernel 2.6.0 source codes. Was flip member deleted recently...??
we can obtain "Linux Device Drivers, Third Edition" in PDF format, for free. http://www.oreilly.com/catalog/linuxdrive3/book/index.csp 英語ですが、オライリーのサイトで Linuxデバイスドライバ 第3版を PDFで入手できます。
while executing tty-open method, I encountered a kernel BUG message. This message seems to be reported in BUG_ON() in add_timer() function. I should learn about Linux's timer mechanism. If I could not resolve this problem, I would write ab…
Linuxデバイスドライバ 第3版の TTYドライバサンプルをコンパイルすると tty_struct構造体の flipってメンバはないよ、っておこられる。 TTYドライバ側からユーザ空間にデータをコピーするために使う ピンポンバッファのようなのだけど。 Linuxカーネル 2.6.…
シンボリックリンクになっていて カーネルソースのディレクトリを指している。 Makefileをワンライナにするなら obj-m := hoge_module.o とだけ書いておいて $ make -C /lib/modules/`uname -r`/build M=`pwd` modules を実行すればよい。
で定義されている。 struct semaphore型の変数を操作する。 セマフォを初期化する void sema_init(struct semaphore *sem, int val); val : セマフォに割り当てる初期値 セマフォを取得する セマフォを取得する関数は、3種類ある。 void down(struct semapho…
で定義されている関数を使う。 unsigned long copy_to_user(void __user *to, const void *from, unsigned long count); unsigned long copy_from_user(void *to, const void __user *from, unsigned long count);
ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp); ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp); ・引数 filp : ファイルポインタ buff : 書き込むデータを保持しているユーザ…
void tty_register_device(struct tty_driver *driver, unsigned index, struct device *dev); driverには、登録した ttyドライバのポインタ変数を使う。 index は、デバイスのマイナー番号。 devは、このデバイスが関連づけられる struct deviceへのポイン…
次の関数を使って、ttyドライバを ttyコアに登録する。 int tty_register_driver(struct tty_driver *driver);
ttyドライバを操作する関数ポインタの構造体。 struct tty_operations { int (*open)(struct tty_struct * tty, struct file * filp); void (*close)(struct tty_struct * tty, struct file * filp); int (*write)(struct tty_struct * tty, const unsigned …
次の関数を使って、tty_driverを作成する。 struct tty_driver *alloc_tty_driver(int lines); 引数linesには、このドライバがサポートする ttyデバイス数を指定する。 作成に失敗したら、NULLが返るのでエラー処理すること。
を使う。 このヘッダファイルで定義されている struct tty_driverがメインの構造体。
root権限でアクセスできるファイル /proc/tty/driver/serial を見る。 # cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 1: uart:16550A port:000002F8 irq:3 tx:0 rx:0 CTS|DSR 2: uart:unknown …
$ cat /proc/tty/drivers /dev/tty /dev/tty 5 0 system:/dev/tty /dev/console /dev/console 5 1 system:console /dev/ptmx /dev/ptmx 5 2 system /dev/vc/0 /dev/vc/0 4 0 system:vtmaster serial /dev/ttyS 4 64-95 serial pty_slave /dev/pts 136 0-1048…
は からインクルードされていて コマンド番号の設定を助けるマクロを定義している。 たとえば... __IO(type,nr) 引数なしのコマンド用 _IOR(type,nr,datatype) ドライバからのデータ読み出し用 _IOW(type,nr,datatype) データ書き込み用 _IOWR(type,nr,datat…
Linuxデバイスドライバの学習を進めていて メモリ操作の仕組みとか、プロセススケジューリングのあたりを しっかりおさえたい、ということで購入。 どんどん進もう。 詳解 Linuxカーネル 第3版作者: Daniel P. Bovet,Marco Cesati,高橋浩和,杉田由美子,清水…
Linuxデバイスドライバ 第3版 最終章がTTYドライバなんだけど あんまり複雑なことをしなくても サックリと試せて、導入にはいいかも、と 朝の通勤電車で読んでみて思った。 実際に動かすのが楽しくて、勉強しやすいし。 仮想デバイスで printk( )を使って 出…
メモ register_chrdev_region() alloc_chrdev_region() unregister_chrdev_region() MKDEV() MAJOR() MINOR() cdev_init() cdev_add() cdev_del() cdev_alloc() デバイス番号の割り当てと解放 ソース (hoge_chrdev.c) とりあえずこんな感じ。 #include <linux/init.h> #inc</linux/init.h>…
カーネルがもつリングバッファの内容を表示する。 リングバッファサイズは、デフォルトで 16KB。 printk( )の出力は、カーネルのリングバッファに書き出されるよ。
ftp://ftp.oreilly.com/pub/examples/linuxdrive3/examples.tar.gz
モジュールのロード/アンロードで使われているらしい module_init(), module_exit() をみる。 /usr/src/linux-2.6.16/include/linux/init.h をみる /** * module_init() - driver initialization entry point * @x: function to be run at kernel boot time …
エントリポイント登録例 - fs.hの例 エントリポイント登録の様子が fs.hにあったので書いておく。 この方法は、定石のようす。 static struct file_operations __fops = { \ .owner = THIS_MODULE, \ .open = __fops ## _open, \ .release = simple_attr_clo…
/proc/interruptsをみてみる。 ふむふむふむふむ。 まんなかの、CPU0の数字はなんだろう? $ cat /proc/interrupts CPU0 0: 2297185731 XT-PIC timer 1: 73621421 XT-PIC i8042 2: 0 XT-PIC cascade 5: 1 XT-PIC parport0 8: 1 XT-PIC rtc 9: 1015928 XT-PIC…