我正在阅读OSTEP关于内存分段的第16章。
在本节的示例中,它将15KB虚拟地址转换为物理地址:
| Segment | Base | Size | Grow Positive |
| Code | 32KB | 2K | 1 |
| Heap | 34KB | 2K | 1 |
| Stack | 28KB | 2K | 0(negative) |
将15KB虚拟地址转换为物理地址(在教科书中):
15KB转换为bit => 11 1100 0000 00000
前2位(11)确定了该段,即堆栈。
有3KB的左边用于获取正确的偏移量:
3KB-最大段大小= 3KB-4KB = -1KB
物理地址= 28KB -1KB = 27KB
我的问题是,在第4步中,为什么最大段为4KB,不是2KB?
答案 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章开始)。