gpt4 book ai didi

linux-device-driver - Linux内核模块的反汇编代码

转载 作者:行者123 更新时间:2023-12-03 03:58:36 25 4
gpt4 key购买 nike

我学习了如何调试 Linux 设备驱动程序,但我遇到了问题。我不明白这个模块的汇编代码(crashit.ko用C语言编写)

#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

我注意到在反汇编代码中,有三个指令call:call b、call b和call 1b,我不知道它们做什么,也不知道它们在哪里实现。此外,“call b”call b 指令,但我没有看到这一点。请给我一些解释。

最佳答案

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

当内核模块构建时,printk 的地址是未知的。它毕竟不是模块的一部分。

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

关于linux-device-driver - Linux内核模块的反汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9279105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com