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コマンドだけが呼ばれず。他のコマンドはちゃんと呼ばれた。