【问题标题】:Need complete picture of virtual address space需要完整的虚拟地址空间图
【发布时间】:2011-02-28 23:52:23
【问题描述】:

这张图片很好地展示了虚拟地址空间。但它只说了一半。它仅提供用户地址空间的完整图片,即.. 降低 50%(或在某些情况下为 75%)。

剩下的 50%(或 25%)被内核占用了呢?我知道内核也有很多不同的东西,比如内核模块、设备驱动程序、核心内核本身。一定有某种布局吧?

它的布局是什么?如果你说它依赖于操作系统。我想说,有两个主要的操作系统 Windows 和 Linux。请给其中任何一个答案。

alt text http://img690.imageshack.us/img690/2543/virtualadressspace.gif

【问题讨论】:

  • 我有坏消息要告诉你。你想要的东西无法提供。它不仅取决于操作系统,还取决于正在使用的操作系统版本。此外,您的用户地址空间图也不完整,很大程度上取决于您使用的编译器及其版本。
  • 只有两个主要的操作系统?
  • @Carl:只要你完全忽略数十亿美元的大型机行业,就只有两个主要的操作系统。或者价值数十亿美元的移动系统产业。或者价值数十亿美元的嵌入式系统产业。或者价值数十亿美元的安全系统产业。或者...
  • 并且在 sparc 用户态和内核上存在不同的地址空间。

标签: windows assembly linux-kernel driver kernel


【解决方案1】:

我有更糟糕的消息要告诉你,作为一项安全功能,还有一项功能可以显式随机化操作系统的内核地址布局。在最新的 Windows、OpenBSD 以及作为 Linux 的一个选项中,这是默认开启的。

【讨论】:

    【解决方案2】:

    就像用户在这里所说的那样,您的图片不完整。它往往看起来特定于单线程操作系统。特别是进程中可能有数百个线程(因此 - 共享相同的地址空间),每个人都有自己的堆栈。

    另外,我相信地址空间的实际情况可能会因操作系统版本和一些细微的变化而有很大差异。

    【讨论】:

      【解决方案3】:

      从您的问题或图像中并不完全清楚,但对于“系统地址空间”,您可能指的是 2GB-4GB 之间的区域。这确实占用了理论 4GB 空间的一半,但这是有正当理由的。

      通常使用 32 位,您可以寻址 4 GB 的内存 (2^32=4294967296),因此拥有 4 GB 的地址空间而不是 2 GB 似乎是合乎逻辑的。原因如下: 假设你有 2 个指针,在 C/C++ 中是这样的:

      char *ptr1;
      char *ptr2;
      

      我现在想知道这两个指针有什么区别,像这样:

      offset = ptr2 - ptr1;
      

      'offset'的数据类型应该是什么? 如果我们不知道 ptr1 是否在 ptr2 之前出现,反之亦然,则偏移量可以是正数或负数。现在,如果 ptr1 或 ptr2 都在 0 - 2GB 范围内,则偏移量始终在 -2147483648 和 +2147483647 之间,正好适合 4 字节有符号整数。

      但是,如果 ptr1 和 ptr2 能够访问完整的 4 GB 地址空间,则偏移量将介于 -4294967296 和 +4294967295 之间,这不再适合 4 字节有符号整数。

      如果您确定自己从未在应用程序中进行此类计算,或者您确定如果减去 2 个指针,它们之间的距离永远不会超过 2 GB(或者您的向量总是小于 2 GB ),您可以告诉链接器(Windows、Visual Studio)您的应用程序是 LARGEADDRESSAWARE。该链接器标志在可执行文件中设置了一个位,如果 32 位 Windows 正确启动(在 XP 上您必须使用 /3GB 标志启动),Windows 会为您提供 3GB 而不是 2GB(仅适用于 LARGEADDRESSAWARE 可执行文件)。 剩下的 1GB 仍然用于操作系统数据结构(但我没有关于它们的详细信息)。

      如果您运行的是 64 位 Windows,那么事情会变得更加有趣,因为 LARGEADDRESSAWARE 可执行文件将获得 4GB 内存。显然,操作系统数据结构现在存储在 64 位地址空间中的某个位置,在应用程序使用的 4GB 之外。

      希望这能澄清一点。

      【讨论】:

        【解决方案4】:
        猜你喜欢
        • 2021-03-18
        • 2014-03-14
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-03
        • 2020-04-16
        相关资源
        最近更新 更多