请教有关内核页表的问题
ULK3(中文版)的“内核寻址“一章里的“内核页表“(74页左右),不太明白里面提到的“临时内核页表“有和作用?且,为何将内核页表分开“当RAM小于896MB“和“当RAM大于4096MB“来描述?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
ULK3(中文版)的“内核寻址“一章里的“内核页表“(74页左右),不太明白里面提到的“临时内核页表“有和作用?且,为何将内核页表分开“当RAM小于896MB“和“当RAM大于4096MB“来描述?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
回复 1# tomkedy
顶
临时内核页表? 初始化时建立的?好久没搞这一块了,印象不是很深刻,大概是因为页表设置不能一步到位。
至于为什么要以896和4096为界分段,后者应该是很好理解的,因为超过4096M就要启动PAE。896M是怎么回事建议你先不要死钻,把这个问题放下,把相关章节看完再来想。很多人(比如我)刚开始看一块时都不怎么容易想得通这个896M。
本帖最后由 amarant 于 2011-05-25 08:09 编辑
临时内核页表是为了在实模式和保护模式切换的时候不会出错。例如在实模式里,运行的代码地址是0x0000 1234 那么突然切换为了保护模式,开启了分页后,因为内核空间的代码是在0xc000 0000之上的。以前所运行的代码地址(0x0000 1234)已经是用户空间的地址了,所以建立一个临时映射,让0x0000 0000 到 0x007f ffff和 0xc000 0000到 0xc07f ffff映射到统一地址。这样就可已在0xc000 1234继续运行刚才的代码了。
为什么建立两页的临时映射呢?因为内核假定内核使用的段用8Mb可以容纳下。用户空间的映射最终会通过zap_low_mappings()解除映射。所以不用建立为所有的内存建立映射。
楼上,你提到的“因为内核假定内核使用的段用8Mb可以容纳下“,是指用8MB的物理内存装下“虚拟地址为1GB的内核地址空间“(即8MB的物理内存对应虚拟地址空间为 0xc0000000 ~ 0xffffffff)?
回复 5# tomkedy
不是的,是指8Mb空间可以把代码加载进去,就是一些初始的代码
ULK中有原话:
回复 1# tomkedy
临时内核页表是用来初始化用的,系统刚起来,开启分页模式,要寻址,必须有个临时页表。
896MB是个“经验值”,因为主要用于临时映射,和非连续内存映射,所以不需要太多。
那这个8MB空间是“真实的物理地址空间“还是在内核临时分页后的“虚拟地址空间“?
本帖最后由 tomkedy 于 2011-05-25 11:56 编辑
顶
回复 8# tomkedy
分頁前是物理地址,分頁後是虛擬地址