操作系统三个简单的步骤-转换堆栈内存地址

时间:2019-06-16 14:17:05

标签: memory operating-system

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

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

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

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

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

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

  3. 有3KB的左边用于获取正确的偏移量:
    3KB-最大段大小= 3KB-4KB = -1KB

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

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

1 个答案:

答案 0 :(得分:1)

  

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

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

当然,仅仅因为一个段的最大可能大小是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”最好(没有分段错误),因为比分段限制(2 KiB)小1 KiB。

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