【问题标题】:Determine context based on instruction pointer根据指令指针确定上下文
【发布时间】:2013-07-30 04:24:15
【问题描述】:

我正在开发一个模拟器,其指令跟踪来自 QEMU 模拟器。轨迹中的指令指针是虚拟指令指针。

我对 32 位 Linux 操作系统的基本理解是,在 4GB 的地址空间中,较低的 3GB 即 0-3GB 是为应用程序保留的,而较高的 1GB 即 3GB-4GB 是为内核保留的。

我的基本理解正确吗??

为了确定指令的上下文,即内核或应用程序,我使用了一个简单的检查 ip>3G。这有效吗?

还有一点,这个简单的方法是不是很容易扩展到64位操作系统??

【问题讨论】:

    标签: linux linux-kernel virtual-address-space


    【解决方案1】:

    我假设你在谈论 x86。

    内核中有不同的虚拟内存分割选项,可以在其配置文件中设置。看看arch/x86/Kconfig 中的 VMSPLIT_* 选项。

    3G/1G、2G/2G、1G/3G都可以。

    要可靠地检查地址是属于用户空间还是内核空间,可以将其与TASK_SIZE值进行比较:

    static int
    is_user_space_address(unsigned long addr)
    {
        return (addr < TASK_SIZE);
    }
    

    至少适用于 32 位和 64 位 x86 系统。

    【讨论】:

    • 感谢您的回答。我能知道 32 位和 64 位 Linux 内核的 TASK_SIZE 的默认值吗??
    • @prathmesh.kallurkar,我想,没有默认值,因为实际值取决于内核配置。在最常见的配置中,TASK_SIZE 在 32 位 x86 系统上为 0xc0000000,在 x86-64 上为 0xffff880000000000。但同样,从正在运行的系统中获取实际值或以某种方式从编译的内核中提取它会更可靠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2021-07-28
    • 2017-07-06
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多