我正在编写我的第一个Linux内核模块,它实际上是一个RAM磁盘驱动程序加上一些额外的function。 当我试图insmod模块, “分段错误”发生。
这里是相应的内核日志,实际上是两个内核的oops消息。 在阅读了很多相关的教程之后,我仍然对这个日志有一些疑问:
1)在呼叫追踪列表中,function有无问号,问号“?”的特殊含义是什么? 为那个function?
2)我对呼叫跟踪的理解是:除底部函数以外的每个函数都应该由它下面的函数调用。 但为此:
为什么tcflush不能用于scanf?
什么是Linux内置的驱动程序加载顺序?
相同的Linux驱动程序在不同的芯片上
编程Linuxnetworking驱动程序以支持closuresTCP校验和卸载
内部Linux内核接口
[ 397.855035] [<c05a603b>] ? exact_lock+0x0/0x16 [ 397.855035] [<f787c252>] ? diag_init+0x252/0x4bd [b2bntb_diag] [ 397.855035] [<c0451e35>] ? __blocking_notifier_call_chain+0x42/0x4d [ 397.855035] [<f787c000>] ? diag_init+0x0/0x4bd [b2bntb_diag]
diag_init是我写的模块init函数。 它不会调用任何名为exact_lock或__blocking_notifier_call_chain函数,这两个函数在调用跟踪中如何出现?
顺便说一句,我正在运行的Linux内核版本2.6.35.6。
[ 397.850955] ------------[ cut here ]------------ [ 397.851544] WARNING: at lib/kobject.c:168 kobject_add_internal+0x3a/0x1e2() [ 397.851601] Hardware name: VirtualBox [ 397.851639] kobject: (f4580258): attempted to be registered with empty name! [ 397.851678] Modules linked in: b2bntb_diag(+) fuse vBoxvideo drm sunrpc ip6t_REJECT nf_conntrack_ipv6 ip6table_filter ip6_tables ipv6 vBoxsf uinput snd_intel8x0 snd_ac97_codec vBoxguest ac97_bus snd_seq snd_seq_device ppdev snd_pcm parport_pc parport microcode snd_timer joydev snd e1000 i2c_piix4 soundcore i2c_core snd_page_alloc [last unloaded: mperf] [ 397.852707] Pid: 1958,comm: insmod Tainted: GW 2.6.35.6-45.fc14.i686 #1 [ 397.852749] Call Trace: [ 397.852828] [<c043938d>] warn_slowpath_common+0x6a/0x7f [ 397.852970] [<c05b054d>] ? kobject_add_internal+0x3a/0x1e2 [ 397.853130] [<c0439415>] warn_slowpath_fmt+0x2b/0x2f [ 397.853182] [<c05b054d>] kobject_add_internal+0x3a/0x1e2 [ 397.853235] [<c05b098b>] kobject_add+0x5b/0x66 [ 397.853292] [<c064e8e3>] device_add+0xda/0x4b6 [ 397.853346] [<c05b7bc7>] ? kvasprintf+0x38/0x43 [ 397.853394] [<c05b08e0>] ? kobject_set_name_vargs+0x46/0x4c [ 397.853467] [<c051b9bc>] register_disk+0x31/0x109 [ 397.853528] [<c05a6234>] ? blk_register_region+0x20/0x25 [ 397.853579] [<c05a6b08>] add_disk+0x9f/0xf0 [ 397.853627] [<c05a5bff>] ? exact_match+0x0/0xd [ 397.853678] [<c05a603b>] ? exact_lock+0x0/0x16 [ 397.853731] [<f787c252>] diag_init+0x252/0x4bd [b2bntb_diag] [ 397.853785] [<c0451e35>] ? __blocking_notifier_call_chain+0x42/0x4d [ 397.853836] [<f787c000>] ? diag_init+0x0/0x4bd [b2bntb_diag] [ 397.853889] [<c0401246>] do_one_initcall+0x4f/0x139 [ 397.853967] [<c0451e51>] ? blocking_notifier_call_chain+0x11/0x13 [ 397.854086] [<c04621a4>] sys_init_module+0x7f/0x19b [ 397.854142] [<c07a7374>] syscall_call+0x7/0xb [ 397.854177] ---[ end trace 6dc509801197bdc3 ]--- [ 397.855035] ------------[ cut here ]------------ [ 397.855035] kernel BUG at fs/sysfs/group.c:65! [ 397.855035] invalid opcode: 0000 [#1] SMP [ 397.855035] last sysfs file: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/PNP0C0A:00/power_supply/BAT0/energy_full [ 397.855035] Modules linked in: b2bntb_diag(+) fuse vBoxvideo drm sunrpc ip6t_REJECT nf_conntrack_ipv6 ip6table_filter ip6_tables ipv6 vBoxsf uinput snd_intel8x0 snd_ac97_codec vBoxguest ac97_bus snd_seq snd_seq_device ppdev snd_pcm parport_pc parport microcode snd_timer joydev snd e1000 i2c_piix4 soundcore i2c_core snd_page_alloc [last unloaded: mperf] [ 397.855035] [ 397.855035] Pid: 1958,comm: insmod Tainted: GW 2.6.35.6-45.fc14.i686 #1 /VirtualBox [ 397.855035] EIP: 0060:[<c0520d15>] EFLAGS: 00010246 cpu: 0 [ 397.855035] EIP is at internal_create_group+0x23/0x103 [ 397.855035] EAX: f4580258 EBX: f4580258 ECX: c09d4344 EDX: 00000000 [ 397.855035] ESI: f60521f0 EDI: c09d4344 EBP: f45b7ef0 ESP: f45b7ed0 [ 397.855035] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 397.855035] Process insmod (pid: 1958,ti=f45b6000 task=f3a68ca0 task.ti=f45b6000) [ 397.855035] Stack: [ 397.855035] 00000000 f45b7ee4 c05b08e0 8eecb04c f4580200 f4580200 f60521f0 f4580200 [ 397.855035] <0> f45b7ef8 c0520e1c f45b7f00 c0498de9 f45b7f18 c05a261a f4580250 f4580200 [ 397.855035] <0> 00000001 00000000 f45b7f38 c05a6b0f c05a5bff c05a603b f4580200 0fc00000 [ 397.855035] Call Trace: [ 397.855035] [<c05b08e0>] ? kobject_set_name_vargs+0x46/0x4c [ 397.855035] [<c0520e1c>] ? sysfs_create_group+0x11/0x15 [ 397.855035] [<c0498de9>] ? blk_trace_init_sysfs+0x10/0x12 [ 397.855035] [<c05a261a>] ? blk_register_queue+0x3b/0xac [ 397.855035] [<c05a6b0f>] ? add_disk+0xa6/0xf0 [ 397.855035] [<c05a5bff>] ? exact_match+0x0/0xd [ 397.855035] [<c05a603b>] ? exact_lock+0x0/0x16 [ 397.855035] [<f787c252>] ? diag_init+0x252/0x4bd [b2bntb_diag] [ 397.855035] [<c0451e35>] ? __blocking_notifier_call_chain+0x42/0x4d [ 397.855035] [<f787c000>] ? diag_init+0x0/0x4bd [b2bntb_diag] [ 397.855035] [<c0401246>] ? do_one_initcall+0x4f/0x139 [ 397.855035] [<c0451e51>] ? blocking_notifier_call_chain+0x11/0x13 [ 397.855035] [<c04621a4>] ? sys_init_module+0x7f/0x19b [ 397.855035] [<c07a7374>] ? syscall_call+0x7/0xb [ 397.855035] Code: 8d 65 f4 5b 5e 5f 5d c3 55 89 e5 57 56 53 83 ec 14 0f 1f 44 00 00 85 c0 89 c3 89 55 e0 89 cf 74 0a 85 d2 75 08 83 78 18 00 75 11 <0f> 0b 83 78 18 00 be ea ff ff ff 0f 84 c5 00 00 00 8b 17 85 d2 [ 397.855035] EIP: [<c0520d15>] internal_create_group+0x23/0x103 SS:ESP 0068:f45b7ed0 [ 397.865682] ---[ end trace 6dc509801197bdc4 ]--- [root@localhost ntb]#
Linux 4.5 GPIO通过Xilinx Zynq平台上的Devicetree中断
如何防止MMAPcaching值?
在linux中,所有内核进程共享相同的内核堆栈,每个用户进程都有自己的堆栈,正确的?
何时使用linux内核的add_timer vs queue_delayed_work
device_create与现有的设备名称
第一个oopss消息实际上是来自内核的警告。 警告的重要部分就在这里:“企图以空名登记!”。 这意味着没有提供kobject中的描述性名称字符串字段。 具体来说,由于在警告的调用跟踪中我们看到了register_disk,我假设你忘记了正确初始化在注册期间传递的结构的名称字段。 这是警告部分。
下一个oopss消息是一个实际的崩溃 – sysfs文件系统中的一些代码试图从你在注册过程中给出的名字中创建一个组名称,这个代码碰到了一个内核运行时断言,领域。
所以这就是它崩溃的原因。 关于您的问题 – 您在跟踪中看到的一些功能实际上是从代码中使用的内联函数(和/或宏)调用的。 所以你的代码叫他们,虽然不是名字。
关于问号,内核堆栈跟踪机制报告它的符号名称查找地址是否“可靠”。 不是100%确定这意味着什么,但是如果不是,则会在符号名称中获得问号。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。