linux

第90回 カーネル読書会にいってきた

9/16(火) カーネル読書会@ミラクル・リナックスに参加しました。 「Debianパッケージ作成の入門の入門」ということで Debian JP Project やまねさんが実際にパッケージを作りながらのお話でした。 ふだんなにげなく apt-getコマンドで簡単にインストールし…

Japan Linux Conference 2008いってきました

エントリーが滞ってしまってますが>< 9/12(金) 中野サンプラザで開催された Japan Linux Conference 2008 (以下、LCと呼びます)に出席してみました。 イベントは 11(木)とあわせて 2日間あったのだけど 後半 1日に出席しました。 というわけで、聴講したプ…

とりあえず仮想デバイスのところまで

Linuxデバイスドライバについては とりあえずひとつの区切りとして 仮想デバイス制御までを、まとめたエントリーを 近々書きたいと思っています。 いままで断片的に書いたものも含めて。 モジュールのロード モジュールの登録 デバイス番号の作成 デバイスノ…

ChangeLog収集スクリプトにしたよ (i wrote a tiny zsh script to get Linux kernel 2.6.x ChangeLog)

サーバに無駄なアクセスをしない、という zsh連番生成をワンライナで書けない悔しさもあるし 車輪を再発明してるかもしれないけど スクリプト(っていっても、ただのコマンドの羅列)にしました。 #!/bin/zsh CHANGELOG_2_6="http://www.kernel.org/pub/linu…

ChangeLog集めはzsh連番生成 + wgetでキマリ! (to get ChangeLog, it's good to use zsh + wget)

コンパイルが通るはずが通らないときに いちいち調べるのもめんどいなぁ、と思って ChangeLogの形式が決まってるんだから 収集しておいて、自分でインデクシングしてトレースしてけばいい? って思ったので、Linuxカーネルの ChangeLogを 全部取り込むことに…

ChangeLogを集めとこ (Let's get ChangeLog(s)!!)

http://www.kernel.org/pub/linux/kernel/

2.6.0の tty_structには flipがあった (I found flip in tty_struct, Linux kernel 2.6.0.)

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...??

Linux Device Drivers, Third Edition

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で入手できます。

kernel BUG at include/linux/timer.h:83!

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…

tty_struct構造体の flipってどこへ? (where did "flip" in tty_structure go?)

Linuxデバイスドライバ 第3版の TTYドライバサンプルをコンパイルすると tty_struct構造体の flipってメンバはないよ、っておこられる。 TTYドライバ側からユーザ空間にデータをコピーするために使う ピンポンバッファのようなのだけど。 Linuxカーネル 2.6.…

/lib/modules/`uname -r`/build

シンボリックリンクになっていて カーネルソースのディレクトリを指している。 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);

read と write

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 : 書き込むデータを保持しているユーザ…

登録した ttyドライバが制御するデバイスを登録する

void tty_register_device(struct tty_driver *driver, unsigned index, struct device *dev); driverには、登録した ttyドライバのポインタ変数を使う。 index は、デバイスのマイナー番号。 devは、このデバイスが関連づけられる struct deviceへのポイン…

ttyドライバを ttyコアに登録する

次の関数を使って、ttyドライバを ttyコアに登録する。 int tty_register_driver(struct tty_driver *driver);

tty_operations構造体

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を作成する

次の関数を使って、tty_driverを作成する。 struct tty_driver *alloc_tty_driver(int lines); 引数linesには、このドライバがサポートする ttyデバイス数を指定する。 作成に失敗したら、NULLが返るのでエラー処理すること。

ttyドライバで使う構造体

を使う。 このヘッダファイルで定義されている 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 …

ttyドライバのリストを確認

$ 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カーネル 第3版

Linuxデバイスドライバの学習を進めていて メモリ操作の仕組みとか、プロセススケジューリングのあたりを しっかりおさえたい、ということで購入。 どんどん進もう。 詳解 Linuxカーネル 第3版作者: Daniel P. Bovet,Marco Cesati,高橋浩和,杉田由美子,清水…

TTYドライバ

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>…

dmesg

カーネルがもつリングバッファの内容を表示する。 リングバッファサイズは、デフォルトで 16KB。 printk( )の出力は、カーネルのリングバッファに書き出されるよ。

Linuxデバイスドライバ 第3版のサンプルコード

ftp://ftp.oreilly.com/pub/examples/linuxdrive3/examples.tar.gz

module_init(), module_exit() をみる

モジュールのロード/アンロードで使われているらしい 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 …

file_operations登録方法をみる

エントリポイント登録例 - fs.hの例 エントリポイント登録の様子が fs.hにあったので書いておく。 この方法は、定石のようす。 static struct file_operations __fops = { \ .owner = THIS_MODULE, \ .open = __fops ## _open, \ .release = simple_attr_clo…

物理IRQの割り当てを確認する

/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…