2012-02-14 129 views
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指令,但我没有看到这一点。 请给我一些解释。

回答

0

这三个call b <>指令是对printk的两个调用。

当内核模块建立时,printk的地址不知道。毕竟这不是模块的一部分。

内核模块与共享库类似。当它们加载到内核中时,内核动态链接程序解析丢失的符号,并用调用实际函数来替换它们。