运行时可加载内核模块如何知道核心内核函数的地址?

时间:2011-06-01 02:35:28

标签: c linux-kernel kernel

我会对Linux和NT(或其他任何问题)的答案感兴趣

修改

感谢Laurion的回答。

此处提供更多信息:

2 个答案:

答案 0 :(得分:3)

运行时加载程序通常会在加载模块时修复对导入函数的引用。它查看导入函数的表并放入正确的地址。该模块通过间接表使用导入的函数。

答案 1 :(得分:0)

之前为Windows内核(和windows用户空间)编写了一个加载器:它以相同的方式工作。基本上所有二进制文件都有称为IAT的东西(例如,http://msdn.microsoft.com/en-us/magazine/cc301808.aspx这是永恒的经典论文)。当加载器为DLL分配内存时,它将复制DLL,并读取DLL所需的所有符号的DLL(按名称),然后在Windows核心DLL的导出部分中查找名称(例如, ,kernel32.dll),并用读取的地址填写。在DLL可以继续执行之前,必须读取所有需要的文件并进行地址填充。

Linux也以同样的方式工作.....无论是用户空间还是内核。 ELF结构称它为重定位表。

http://www.bravegnu.org/gnu-eprog/linker.html

希望有帮助:-)(x86 arch的详细信息类似)。