バカバカしいことで随分長い間、2週間ぐらい悩んでいたように思う.
自作のmoduleをkernelに組み込むには、insmod xxx.koあるいはrmmod xxx.koで挿入/撤去が自在にできた.何の問題もなかった.
Linuxのmoduleでusbcoreというのがある.usbcoreはlsmodするとこのように表示される.
$ lsmod | grep usb
usbcore 195460 4 uhci_hcd,ehci_hcd,ehci_pci,usbhid
usb_common 12440 1 usbcore
usbcoreという名の通り、USBの物理層寄りの処理をしているmoduleだと思う.USBの動作を解析したくて、usbcore moduleの内部にprintk()を追加してdmesgで表示させるようにしてmoduleの再ビルドをやってみた.module単体ビルドのやりかたはこちらに書いた.ビルドは出来た.
ところが、usbcoreというのはLinuxマシンが稼動している間は常時kernelに組み込まれて動いているmoduleなので、今動いているusbcoreをrmmod usbcoreで撤去できないのであった.撤去できないところに新しいusbcore.koを挿入できるわけもなく、新しいusbcoreを動かすことができなかった.
そこで、rebootすりゃぁ新しいusbcore.koが起動時に組み込まれるに違いないと思ったのだが、printk()の出力がdmesgに出て来やしない.コンソールログレベルの問題でもなかった.usbcoreにはprintk()を全面的に抑圧するoptionでもあるのかと思ったのだがそれに類する解説は見つからなかった.暗礁に乗り上げた.
判った(意外な)事実はこうだった.
・自作のmoduleの場合と、usbcoreのようなkernel御用達のmoduleでは、扱いが異なる
・自作のmoduleの場合は、
cp xxx.ko /lib/modules/3.16.0-4-amd64
このように特定の場所にxxx.koを置いて、
insmod xxx.ko
でkernelに挿入すればrebootしなくても自作moduleを使えるようになる.USBのhotplugを利用するようなmoduleの場合は、
depmod
もやったほうがいいだろう.・ところが、usbcoreのようなkernel御用達のmoduleの場合は、boot時にRAMDISKにロードされるバイナリファイルに新usbcore.koを組み込んでやらなければ、新usbcoreは動かないのであった.なるほどrebootしてもムダなわけである.そのバイナリファイルとはこれだ.
/boot/initrd.img-3.16.0-4-amd64
これを知るまでにほとんど2週間かかった、やれやれ.
ちなみにわたしの環境はこれ.
kona-Linux3.0 (debian,ubuntu系)
Linux version 3.16.0-4-amd64
結論として、usbcore moduleの単体ビルド~組み込みまでの流れは、以下のようにするのが正解だった.
cd ............./usb/core
make -C /lib/modules/3.16.0-4-amd64/build M=`pwd`
mv usbcore.ko /lib/modules/3.16.0-4-amd64/kernel/drivers/usb/core/
update-initramfs -ut
最後の行のupdate-initramfsというのが、initrd.img-3.16.0-4-amd64にusbcore.koを組み込む役目である.update-initramfsがどのmoduleをRAMDISKに組み込もうとするのか、その定義は/etc辺りにあるファイルなのだろうが、わたしにはそこまでは判らない.
追記:
printk("abc"); →改行なし
printk(KERN_INFO "abc"); →強制的に改行するぞ!そんなの聞いてないよw
かしこ
人気ブÍグランキングへ
知らないといけないことが多すぎますな~。
返信削除歴史的経緯がわからないと改良もできなくなってくるとこの後の世代交代で、多大なロストや事故が起きそうです。
この上ディープラーニングとか上位層に組み込まれてくると人間の手に負える気がしないです。
Linuxソースを書いているコミュニティの人々が、高齢化という問題に直面しているそうです.やがて終わるのかぁ~
削除ソフトと言えば123dと言うfree3DCAD、パイプに楕円穴を開けて笛を作ろうとしていますが、裏側の穴を開けて(分割と押し出し)いると、パキッとヒビ(stl不整合)が入ります、不思議?
返信削除