【问题标题】:Which type of memory model (i.e. flat / segmentation) is used by linux kernel?linux内核使用哪种类型的内存模型(即平面/分段)?
【发布时间】:2016-09-30 06:25:46
【问题描述】:

我正在阅读有关 x86 保护模式工作的信息,因为我已经看到了平面内存模型和分段内存模型。

如果linux内核使用的是平面内存模型,那么它如何保护非特权应用程序对关键数据的访问?

【问题讨论】:

  • 使用page table。另请参阅:paging.
  • 谢谢,但是分配给进程的堆栈、数据、代码段呢?
  • 阅读 ruthafjord 的最新编辑:段在技术上用于转换为线性地址,然后在页表中查找。
  • 意思是使用分段记忆模型?

标签: linux linux-kernel x86 operating-system kernel


【解决方案1】:

Linux 通常都不使用。在 x86 上,Linux 为用户空间进程和内核提供了单独的页表。用户空间页表不包含用户到内核内存的映射,这使得用户空间进程无法直接访问内核内存。

从技术上讲,x86 上的“虚拟地址”首先通过分段(并从逻辑地址转换为线性地址),然后通过页表从线性地址重新映射到物理地址。除特殊情况外,分段不会更改 64 位模式下生成的物理地址(分段仅用于存储当前权限级别等特征,并强制执行 SMEP 等功能)。

一个众所周知的“不寻常情况”是大多数编译器在 x86 上实现的线程本地存储,它使用 FS 和 GS 段来定义每个逻辑处理器到地址空间的偏移量。其他段不能有非零基数,因此不能通过分段移动地址。

【讨论】:

  • 这是否意味着,每次使用系统时,它都使用“虚拟地址”,然后在这些地址上进行分段,最后,硬件根据页面将虚拟地址映射到物理地址桌子。但是,在特定段的页面没有出现在内存中时,会发生交换吗?我不明白上面答案中的 64 位模式行
  • 这绝对令人困惑。 x86 上的行为取决于处理器的模式(真实/受保护/长模式,又名 16 位、32 位、64 位模式。以及一些更微妙的分页模式)。最容易认为 x86 缺少分段(分段仅用于微妙的行为)。
  • 例如,在实模式(16位模式)下,x86只使用分段。幸运的是,大多数操作系统不必处理这个问题,因为引导加载程序会在 32 位模式下交出控制权。
  • 为了更直接地回答您的问题,是的,在 64 位模式下,虚拟地址首先通过分段传递,然后再通过页表重新映射。在我看来,这对于 SMEP 之类的功能很有用,我相信它是通过段寄存器控制的。
  • 线程本地存储使用 FS 或 GS​​ 段寄存器,在 64 位模式下可以有非零偏移。例如mov eax, [fs:0x28] 从线程本地存储块中的偏移量 0x28 加载。 stackoverflow.com/questions/32245103/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2011-01-07
  • 2015-08-26
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多