【问题标题】:Operating Systen three easy pieces - translate stack memory address操作系统三个简单的部分——翻译堆栈内存地址
【发布时间】:2019-10-30 08:37:13
【问题描述】:

我正在阅读 OSTEP 关于内存分段的第 16 章。

在本节的一个示例中,它将 15KB 虚拟地址转换为物理地址:

| Segment        | Base      | Size   | Grow Positive   |    
| Code           | 32KB      | 2K     | 1               |  
| Heap           | 34KB      |   2K   | 1               |  
| Stack          | 28KB      |   2K   | 0(negative)     |  

将 15KB 虚拟地址转换为物理地址(在教科书中):

  1. 15KB 转换为位 => 11 1100 0000 00000

  2. 前 2 位 (11) 确定段,即堆栈。

  3. 剩下 3KB 用于获得正确的偏移量:
    3KB - 最大段大小 = 3KB - 4KB = -1KB

  4. 物理地址 = 28KB -1KB = 27KB

我的问题是,在第 4 步中,为什么最大段是 4KB——不是 2KB 吗?

【问题讨论】:

    标签: memory operating-system


    【解决方案1】:

    在第4步,为什么最大段是4KB--不是2KB吗?

    对于那本书的那部分;他们假设硬件使用(14 位)虚拟地址的最高 2 位来确定正在使用哪个段。这为段内的​​偏移量留下了“14-2 = 12 位”,因此硬件不可能支持大于 4 KiB 的段(因为偏移量是 12 位,而 2**12 是 4 KiB)。

    当然,仅仅因为段的最大可能大小为 4 KiB 并不意味着您不能拥有更小的段(例如 2 KiB 的段)。对于向下扩展的段,我假设书中描述的硬件类似于“if(max_segment_size - offset >= segment_limit) { segmentation_fault(); }”,所以如果段的限制是 2 KiB 并且“max_segment_size - offset = 4 KiB - 3 KiB = 1 KiB” 它' d 没问题(没有分段错误),因为比分段限制 (2 KiB) 少 1 KiB。

    注意:因为没有现代 CPU 和现代操作系统使用分段(并且因为分段在其他 CPU 上的工作方式不同 - 例如,使用段寄存器而不是“最高 N 位选择段”);我很想快速浏览第 16 章而不加太多注意力。重要的部分是“分页”(从本书第 18 章开始)。

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 2014-05-27
      • 1970-01-01
      • 2020-09-26
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多