前回(12)で/devにファイルを作ってくれるようになったが、rmmodの方を何もしていないことに気付いた。
本を真似して追加。
device_destroy(char_class, char_dev);
class_destroy(char_dev);
が、rmmodすると、エラーというか、派手に失敗した。
# rmmod zybo_gpio Unable to handle kernel paging request at virtual address 0f400020 pgd = de690000 [0f400020] *pgd=00000000 Internal error: Oops - BUG: 5 [#1] PREEMPT SMP ARM Modules linked in: zybo_gpio(O-) uio_pdrv_genirq CPU: 1 PID: 1062 Comm: rmmod Tainted: G O 4.9.0-xilinx-v2017.2 #1 Hardware name: Xilinx Zynq Platform task: de4a4140 task.stack: de78c000 PC is at class_unregister+0x8/0x4c LR is at char_exit_module+0x20/0x54 [zybo_gpio] pc : [] lr : [ ] psr: 000e0013 sp : de78df38 ip : dd61cb6c fp : 00000000 r10: 00000000 r9 : de78c000 r8 : c0106e24 r7 : 00000081 r6 : be83db60 r5 : 000000f4 r4 : 0f400018 r3 : 0f400018 r2 : 0000003b r1 : c7c1fb00 r0 : 0f400018 Flags: nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none Control: 18c5387d Table: 1e69004a DAC: 00000051 Process rmmod (pid: 1062, stack limit = 0xde78c210) Stack: (0xde78df38 to 0xde78e000) df20: bf008b40 000000f4 df40: be83db60 bf008570 bf008980 00000880 be83db60 c0177650 dd735900 6f62797a df60: 6970675f b6f3006f 00000001 de4a4140 00000000 c0a33838 de4a4140 00000000 df80: c0a33838 0000005b de4a4140 c0131bdc de78c000 00106e24 0002165c 6f62797a dfa0: 6970675f c0106c60 0002165c 6f62797a be83db60 00000880 000ba9b0 be83de18 dfc0: 0002165c 6f62797a 6970675f 00000081 be83df0e 00000002 000b87b8 00000000 dfe0: be83db58 be83db48 000214b4 b6e17a60 600e0010 be83db60 f4f71bdc 6efff6d7 [ ] (class_unregister) from [ ] (char_exit_module+0x20/0x54 [zybo_gpio]) [ ] (char_exit_module [zybo_gpio]) from [ ] (SyS_delete_module+0x164/0x1d4) [ ] (SyS_delete_module) from [ ] (ret_fast_syscall+0x0/0x3c) Code: e8bd4010 eaf8ae6e e92d4070 e1a04000 (e5903008) ---[ end trace 7dde3b5d13b2d080 ]--- Segmentation fault
classの登録・削除をコメントアウトするとrmmodしても問題ないので、追加した部分に問題があることになる。
PCがclass_unregisterになっているから、class_destroy()だろうか?
いや、device_destroy()したあと、先にclass_unregister()してやらないといけないみたいだ。。。が、それでも同じだ。
insmodしたときに、out-of-treeとか出てるので、それだろうか。。。
わからんが、気になるので調べよう。
treeは、デバイスツリーかと思っていたのだが、kernelのソースツリーなのか。
https://www.kernel.org/doc/Documentation/kbuild/modules.txt
確かにこのドライバはkernelのソースツリーには入っていない。
では、別に問題ないのかな?
じゃあ、さっぱりわからんな。
Linuxのドライバのサンプルを探すところからやらねば。
2017/07/31 0:02追記
あ、class_destroy()の引数を間違えているではないか。。。
誤:class_destroy(char_dev);
正:class_destroy(char_class);
そうよね、classの削除なんだから、classを引数に取るよね。。。
gistを修正した。
まあ、いつもに比べると傷は浅いな(失敗慣れしすぎ)。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。