关于页表的一点儿疑问

flying_music 2017-02-13 04:35:42
书上说页表项里的地址指针要么指向实际内存中页的地址,要么指向虚拟内存也就是磁盘的页首地址,但是磁盘的地址和内存地址的位数应该不一样吧,比如32位系统的地址总线不该是48位吗,那页表中放的是这个48位的地址吗,还是一个偏移量?这一块儿具体是怎么实现的?
希望大神帮忙解答一下,给个链接也好
...全文
146 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2017-02-14
  • 打赏
  • 举报
回复
引用 3 楼 cyfcsd 的回复:
[quote=引用 1 楼 adlay 的回复:] 32 位系统如果没有启用 PAE, 地址也只有 32 位. 硬件会自动将高位当做 0. 因为内存页最小是 4KB, 所以每一个页地址的低位都是 0, 自然把所有位都表示出来. 各种寻址方式下页表的结构可以参考: http://blog.adintr.com/298
你说的我明白了,但这还是在访问内存啊,我是不明白操作系统是如何进行页面置换的,就是怎么把磁盘上的虚拟页面置换到内存当中,因为这整个过程的地址就只有32位,这32位怎么说也只能确定4G大小的空间啊,怎么用这32位去磁盘上找对应的页面呢?磁盘可能有好几百个G啊[/quote] 磁盘自然不是通过寻址来寻的, 要通过磁盘的IO来访问. 操作系统为每一个进程维护着一个表, 当程序访问的内存不在物理内存中时, CPU 会产生一个缺页异常, 跳转到操作系统提供的异常处理函数中去, 操作系统在这个函数里面查找维护的那个表, 如果对应的内存是被换到了硬盘中, 就从硬盘里面读取数据到物理内存中, 然后从异常中返回, 程序重新访问该地址就有对应的物理内存了, 然后继续运行.
flying_music 2017-02-14
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
32 位系统如果没有启用 PAE, 地址也只有 32 位. 硬件会自动将高位当做 0. 因为内存页最小是 4KB, 所以每一个页地址的低位都是 0, 自然把所有位都表示出来. 各种寻址方式下页表的结构可以参考: http://blog.adintr.com/298
你说的我明白了,但这还是在访问内存啊,我是不明白操作系统是如何进行页面置换的,就是怎么把磁盘上的虚拟页面置换到内存当中,因为这整个过程的地址就只有32位,这32位怎么说也只能确定4G大小的空间啊,怎么用这32位去磁盘上找对应的页面呢?磁盘可能有好几百个G啊
www_adintr_com 2017-02-13
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
32 位系统如果没有启用 PAE, 地址也只有 32 位. 硬件会自动将高位当做 0. 因为内存页最小是 4KB, 所以每一个页地址的低位都是 0, 自然把所有位都表示出来. 各种寻址方式下页表的结构可以参考: http://blog.adintr.com/298
自然把所有位都表示出来 => 自然用不着把所有位都表示出来
www_adintr_com 2017-02-13
  • 打赏
  • 举报
回复
32 位系统如果没有启用 PAE, 地址也只有 32 位. 硬件会自动将高位当做 0. 因为内存页最小是 4KB, 所以每一个页地址的低位都是 0, 自然把所有位都表示出来. 各种寻址方式下页表的结构可以参考: http://blog.adintr.com/298

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧