Mun*_*yay 6 operating-system memory-management
我对MMU(内存管理单元)地址转换过程的理解
-> 逻辑地址:由 cpu.programmer 关注这个地址生成。
-> 虚拟地址:驻留在硬盘中,作为一个页面。
-> 物理地址:驻留在 RAM 中。这是实际地址。
1:cpu生成逻辑地址并发送给MMU。
2:MMU 将逻辑地址转换为虚拟地址,然后再转换为物理地址,并将物理地址发送到 RAM。
3:当RAM已满时,将没有使用的页面迅速返回到硬盘,为其他页面(进程)分配内存。
我的问题是:1)重定位寄存器的值在哪里添加?2) 谁决定重定位寄存器的值?3)Base register 和Limit register 怎么做,怎么用?4)逻辑地址在哪里关闭?
如果任何机构可以回答它,我将不胜感激。请求,让我知道它在这个主题中的任何误解。-谢谢
我可以告诉你这在 x86 上是如何工作的。
非 64 位模式下的所有程序都使用由以下两项组合的地址运行:(segment selector为简洁起见,“选择器”在文本中经常被省略,这可能会造成混淆)和offset. 这selector:offset对称为logical address.
选择器部分并不总是在代码中明确指定或操作,因为 CPU 具有包含具有特定指令或特定指令编码的选择器的段寄存器的“默认”关联。在 32 位模式下操作选择器也不常见,但在 16 位代码中经常需要。
在virtual address从逻辑地址或者“直接”(在形成real或8086 virtual模式)或“间接”(在protected模式)。
"Direct" virtual address= selector* 16 + offset。
"Indirect" virtual address= SegmentDescriptorTable[ selector].Base + offset.
SegmentDescriptorTable 是Global Descriptor Table(AKA GDT) 或本地描述符表 (AKA LDT)。它由操作系统设置并描述不同内存段的位置和大小。selector用于选择表中的段。Base表的条目告诉段的开始(虚拟地址)。该Limit条目告诉段大小(通常;细节稍微复杂一些)。
当程序尝试访问内存偏移量导致访问超出段末尾时(CPU 比较offset和Limit),CPU 生成一个exception并且操作系统通常通过终止程序来处理它。
顺便说一句,在real/v86模式下,即使虚拟地址直接从 形成selector:offset,仍然有 16 位Limit强加给偏移量,这就是为什么您需要使用不同的选择器来访问超过 64KB 的内存。
Base段描述符中的条目可用于将段与内存的其余部分隔离(Limit此处有帮助)或将整个段放置或移动到任意虚拟地址,而无需修改程序中的任何(或太多)内容属于(如果我们要移动一个段,显然数据必须在内存中移动)。基本上,它可以用于搬迁目的。在real/v86用于重新定位目的的模式中,selector已更改。
该virtual address可进一步转换为physical addressCPU是否在运行protected mode,并已成立page tables。如果没有页表,则物理地址与虚拟地址相同。转换是在物理内存块和被调用的地址范围pages(通常为 4KB)中完成的。
x86 CPU 上没有专用的重定位寄存器。可以通过调整来实现搬迁:
至于virtual address : reside in the hard disk , as a pages,我不确定你到底想说什么,但仅仅因为有虚拟到物理地址转换,并不意味着也有虚拟磁盘内存。除了虚拟磁盘内存之外,翻译还有其他用途。并且地址驻留在 CPU 中以及您(和操作系统的)代码将它们写入的任何位置,不一定在磁盘上。