Some Days You Get the Bear

IT系エンジニアの、日々の気づきや考えたこと。

ioctl のつくり方

Linux ドライバで、ioctl をつくっている。

ハマったところ。

・コマンドは _IO、_IOW、_IOR、_IOWR の用意されたマクロを使ってつくる。

 単なるユニーク値でいいんだろー、と思ってやってたら、思わぬところでつまづいた。
 前述のマクロを使わないでいたら、
 あるコマンドだけが*1ドライバルーチンを呼ばずに「Bad Address」を返してきた。
 上記マクロには「引数のサイズ」を指定するので、そのへんが絡んでるんかもな?
 
カーネルなのに。

 カーネルなんだから、いつもの組込みのノリで「なんでもできるんだろー」と思ってたら、
 なんでもできるけど、そう簡単にはできない、というのがわかった。
 ioctl() の引数だって、
 わざわざカーネル空間にコピってこないといけないし(copy_from_user())、
 メモリアクセスするのだって、
 カーネル空間の仮想アドレスにマッピングしないといけない。
 (ioremap_nocache(), ioremap() / iounmap()) 
 意外とめんどくさいでござる。
 
・/dev って。
 
 platform_driver_register() って、引数の構造体に .name ってあるから、
 これ呼べば /dev/xxxx ができるんかと思ってた。
 が、ほかのおまじないも必要だった。
 
Makefile がチョトちがう。
 
 アプリのMakefile は、いつも我流でちゃちゃっとつくってしまうんだけど。
 カーネルモジュール用の Makefile はお作法があるんじゃね
 (たぶんどっかにルールが書いてあるんだと思う)。
 我流(というかあてすっぽ)では、分割コンパイルさえできなかった。く~っ。

 
それにしても、(ネットで見る)みなさんの知識量がすごすぎる!
みんなどうやって学んで身につけていくんじゃろうか?
週末にさわりまくって(読んで書いて動かしまくって)るんじゃろうか?
自分は技術で食っていくしかない身なのに、
この追いつけていけなさ具合は、ちょー情けないぜっ。。。

*1:1コマンドだけが呼ばれず。他のコマンドはちゃんと呼ばれた。