您的位置:首页 > 其它

80386的内存分页机制

2010-05-10 23:34 225 查看
在“实模式”下寻址,“段寄存器+偏移地址”经过转换后,得到的地址就是“物理地址”,也就是“物理内存中的实际地址”;但是,在“保护模式”下,“段寄存器+偏移地址”转换后,得到的地址是“线性地址”,而不是“物理地址”。
在单任务的DOS系统中,一个应用程序可以使用所有的的空闲内存。程序退出后,操作系统回收所有的碎片内存并且合并成一个大块内存继续供下一个程序使用。
80386处理器的分页机制很好的解决了“内存碎片”的问题。80386处理器把4KB大小的一块内存当做一“页”内存,每页物理内存可以根据“页目录”和“页表”,随意映射到不同的线性地址上。这样,可以将物理地址不连续的内存的映射连到一起,在线性地址上视作连续的。
在80386处理器中,除了和CR3寄存器(指定当前页目录的地址)相关的指令使用的是物理地址,其它所有的指令都是用线性地址寻址的。
是否启用内存分页机制,是由80386处理器新增的CR0寄存器的第31位PG决定的,如果PG为0,则分页机制不启用,此时,所有指令寻址的地址就是实际的物理地址;当PG为1时,80386处理器进入内存分页管理模式,所有的线性地址要经过页表的映射后,才能得到最后的物理地址。
内存分页管理只能在保护模式下才可以实现,实模式不支持分页机制。但不管在哪种模式下,所有寻址指令使用的都是线性地址,程序不关心数据最后究竟存放在物理内存的哪个地方。
页表规定的不仅仅是地址的映射,同时还规定了页的访问属性,如是否可写、可读和可执行等。
页表可以指定一个页面并不真正映射到物理内存中。这样,访问这个页的指令会引发页异常错误。这时,处理器会自动跳转到页异常处理程序中去。操作系统可以在页异常处理程序中,将硬盘上的虚拟内存读到内存中,并修改页表重新映射,然后,重新执行引发异常的指令。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: