【问题标题】:Can kernel functions have different virtual addresses内核函数可以有不同的虚拟地址吗
【发布时间】:2011-12-11 23:30:30
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c windows linux compiler-construction kernel


    【解决方案1】:

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

    对于操作系统内核,与引导所花费的其余时间相比,额外的开销是微不足道的;事实上,Windows 内核实际上动态链接了它的许多组件。所以内核显然是一个随机化加载地址的地方。

    【讨论】:

    • 谢谢。内核可以在运行时在不同位置卸载和重新加载模块。它会尝试对内核库进行相对映射,但是一旦加载,虚拟地址会改变吗?(我想不会,因为其他模块是依赖于这些地址。但是如果这些地址保存在需要查询的表中,则运行时加载/卸载可以工作。因此,内核可以保持虚拟地址在运行时移动。但是系统可能无法在某些关键情况下做到这一点无法在运行时卸载的内核例程)你知道我们是否可以找出是否有任何虚拟地址被固定到 phy 内存?
    • @agent.smith,请打开一个不同的问题,而不是在评论中询问复杂的后续问题。此外,您似乎有多个问题要问;请务必将这些问题作为单独的问题提出,因为有些人可能只知道部分问题的答案,而不是全部问题
    【解决方案2】:
    1. 内核函数如何映射到地址范围内?

    它们根本不一定映射到用户空间。直到我停止在这方面练习之前,他们都被软打断。

    【讨论】:

    • 是的。所以,如果我考虑 4GB 地址空间,那么大约一半的空间包含内核代码/数据和一半的用户空间 progs。内核代码在所有用户空间 progs 中保持不变。当您想调用任何内核例程时,可以使用软件中断,因为您无法访问该地址范围。我想知道的是那些内核虚拟地址是如何给出的。
    • @agent.smith 如果你接受我说的话,这个问题毫无意义。内核有自己的地址空间,它不同于任何进程的用户模式空间,因此不可能出现内核地址如何映射到用户空间的问题。
    猜你喜欢
    • 2018-02-23
    • 2011-04-02
    • 2011-06-17
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多