【问题标题】:OS X 10.8 - Address space layout post syscallOS X 10.8 - 系统调用后的地址空间布局
【发布时间】:2013-09-18 15:37:19
【问题描述】:

出于实验原因,我在我的 OS X 10.8.2(运行 x86 LP64 内核)机器上完全禁用了交换,我知道这是个坏主意。

当我从任何应用程序执行系统调用时,地址空间布局是什么样的? IE。现在,随着整个地址空间被连线(没有交换),我可以确定地从内核访问任何有效的用户地址并假设包含该地址的页面驻留在内存中吗?

我的理解是肯定的,但是读后我有点困惑,无论用户空间是 64 位还是 32 位 OS X 内核始终以 32 位模式运行,并且整个进程地址空间被切换出来,整个 4G 被占用核心。这适用于 10.8.2 吗?如果是这种情况,那么我将无法从内核空间访问任何有效的用户空间地址,对吧?

【问题讨论】:

    标签: macos osx-mountain-lion kernel iokit xnu


    【解决方案1】:

    即使在 64 位模式下,内核空间保留在地址空间的顶部(即 0xffffff8000xxxxxx),即使没有交换,您也无法访问用户空间内存,除非您处于内核模式代表该用户空间进程。原因是地址都是虚拟的,而您依靠 CR3(控制寄存器)告诉 MMU 哪些物理页属于哪个进程。因此,虽然原则上您可以在内核模式下访问所有内存,但如果没有 CR3,您将无法确定哪些页面属于哪个进程。

    因此,在系统调用中,您可以将数据移入和移出用户模式内存(为此有 copyin/copyout,类似于 Linux 的 copy_[from/to]_user)——而且它们还可以处理页面错误,以防万一页面实际上是交换的,就像正常情况一样。但这仅适用于活动用户空间内存 - 即活动进程。当然,有一些黑客可以访问其他进程的 CR3,但不鼓励这样做(除非您正在创作高质量的恶意软件)。

    【讨论】:

      【解决方案2】:

      首先,32 位内核/64 位用户空间安排是 10.7(在客户端)或 10.6(在服务器上)之前的情况。 10.5 及更早版本仅附带 32 位内核,10.6 和 10.7 附带 32 位和 64 位内核(默认取决于硬件),而 10.8 及更高版本仅具有 64 位内核。

      其次,对于 64 位内核,OSX 确实使用分离的内核/用户虚拟地址布局。您是正确的,在用户空间和内核之间切换时,32 位的几乎交换了整个 4GB。

      至于直接取消引用用户空间指针 - 即使禁用交换也是一个坏主意,而且我永远不会发布这样的代码。如果你只是在胡闹,你应该没问题。 (这很糟糕的一个原因是内存映射可以从另一个线程更改)

      【讨论】:

      • 感谢您的精彩回答,消除了我的疑虑。我无法弄清楚如何接受答案并关闭问题!
      • 分数 (0) 下方有一个小复选框轮廓,答案是向上/向下箭头。
      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 2016-01-16
      • 2011-03-26
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多