内核函数可以有不同的虚拟地址

时间:2011-10-20 17:10:07

标签: c windows linux compiler-construction kernel

这更像是一个知识问题,而不是实际的实施。我想知道系统启动后是否有任何内核函数可以有不同的虚拟地址。我对可执行文件编译的理解是虚拟地址是为其二进制文件分配的,但虚拟到物理是在运行时通过操作系统完成的。(分页。我知道那些东西。所以,不需要2解释) 但是在内核函数的情况下,每当我重新启动系统时,我都会看到它们具有不同的虚拟地址。 1.内核函数如何映射到地址范围内? 2.它们是否可以在运行时映射到不同的虚拟地址。 (我想知道它是如何可能的)3。dll的地址映射如何?是在编译时给出了虚拟地址还是在运行时分配了相对地址? (我认为这是如何完成的。)4。有没有办法找到任何内核虚拟地址是否固定到物理内存。

谢谢

2 个答案:

答案 0 :(得分:4)

传统上,在编译时为可执行文件分配固定的虚拟地址映射。然而,近年来,很明显这对安全性来说是不利的 - 攻击者可以利用他们对内存中事物的确切知识作为漏洞利用的一部分。为了帮助缓解这种情况,可以使用与位置无关或可重定位的可执行文件来允许加载地址随机化(至少在Linux上)。但是,这有一个缺点 - 启动程序需要更多时间,因为动态加载程序必须执行重定位(或者在运行时从位置无关的机器代码中存在额外的开销)。

对于OS内核,与其余的启动时间相比,额外的开销是微不足道的;实际上,Windows内核实际上动态地链接了它的许多组件。所以内核是随机化加载地址的明显位置。

答案 1 :(得分:1)

  
      
  1. 如何在地址范围内映射内核函数?
  2.   

它们根本不一定映射到用户空间。直到我停止在这个区域练习,他们才被软中断接触到了。