1

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

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

我的基本理解正确吗?

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

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

4

1 回答 1

2

我假设您在谈论 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 系统。

于 2013-07-30T08:06:33.743 回答