3
我学习了如何调试linux设备驱动,但是我遇到了一个问题。 我不明白这个模块(在C语言编写crashit.ko)的汇编代码linux内核模块的反汇编代码
#include <linux/module.h>
#include <linux/init.h>
static int __init my_init(void){
int *i;
i = NULL;
printk(KERN_INFO "Hello: init_module loaded at address 0x%p\n",init_module);
printk(KERN_INFO "i = %d\n", *i);
return 0;
}
static void __exit my_exit(void){
printk(KERN_INFO "Hello: cleanup_module moaded at address 0x%p\n",cleanup_module);
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL v2");
这里是模块的上方 crashit.ko拆卸:文件格式ELF32-I386
Disassembly of section .exit.text:
00000000 <cleanup_module>:
0: 68 00 00 00 00 push $0x0
5: 68 00 00 00 00 push $0x0
a: e8 fc ff ff ff call b <cleanup_module+0xb>
f: 58 pop %eax
10: 5a pop %edx
11: c3 ret
Disassembly of section .init.text:
00000000 <init_module>:
0: 68 00 00 00 00 push $0x0
5: 68 31 00 00 00 push $0x31
a: e8 fc ff ff ff call b <init_module+0xb>
f: ff 35 00 00 00 00 pushl 0x0
15: 68 5f 00 00 00 push $0x5f
1a: e8 fc ff ff ff call 1b <init_module+0x1b>
1f: 31 c0 xor %eax,%eax
21: 83 c4 10 add $0x10,%esp
24: c3 ret
我注意到,在反汇编代码中,有三个指令调用:调用b,调用b和调用1b,我不知道他们在做什么,我不知道它们在哪里实现。此外,“呼叫B”呼叫B指令,但我没有看到这一点。 请给我一些解释。