2017/07/30

[zybo]PetaLinuxでDigilentのチュートリアルが動かん (13)

前回(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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。