在内存管理中一级页目录表与二级页目录表怎么寻址到,或者说怎么改动其内容?

时间:2022-07-15 08:37:38
在内存管理中,保护模式,我看了书,大概也都明白了,可最近编程过程中,我却发现了有不协调不明白的地方,页目录表我一直认为程序工作在线性地址上,在没有开启页模式时线性地址就是物理地址,开启页模式了就有了物理地址与线性地址之分,我一直觉得没什么问题,可最近我发现开启页模式后,物理地址被屏蔽了,你永远就触及不到它了,任何一个程序中的地址都是线性地址,而不是物理地址,问题来了,如果一个任务在开始时页目录表都填好了,那没什么,但如果任务切换后,上一个任务的物理内存中的页目录表要换入硬盘(虚拟内存),而新的页目录表是怎么填写,怎么改动的?页目录表是线性地址转译的基石,但现在要改的是页目录表本身,它不可能用线性地址去改动它,因为它是物理地址,而线性地址无法命中物理地址的呀!!!那么保护模式的一切寻址会因此而崩溃

13 个解决方案

#1


你在开分页前把页目录的物理地址在你认为不错的线性地址的页表中指定这个物理地址,开了分页后修改这个线性地址即可
32位windows的0xC0000000-0xC03FFFFF就被映射到当前进程的页表和页目录所在的物理地址

#2


还不太懂,楼上你好,可你只讲了页表工作的一项,能系统讲下WINDOWS内存分配中,页目录表修改的全部工作过程吗?谢谢了

#3


去看windows research kernel源代码的NtAllocateVirtualMemory

#4


先谢谢了,不好意思,呵呵,我是个大菜鸟,初学,没人教,还都是自学,没资料,全靠《WIN32汇编语言程序设计教程》这本书学汇编,想从最基础开始一步步学精,但还不知道从什么正确的方向快捷的入手,全是自己揣摩去碰,所以碰的都是问题,你说那资料我没有,能说个地址,我下载一下好吗?谢谢

#5


http://d.download.csdn.net/down/2007880/guobing0816

#6


可以把页表所在的物理地址映射到一个预定义好的虚拟地址上,然后以该虚拟地址就可以访问了
初学保护模式的就不要去看OS源码了,会弄晕的

#7


句体怎么映射,可映射本身需要页表呀,这样会无穷无尽的映射下去。

#8


显然不会,mmu在翻译地址时用的页表直接从物理地址存取,不依赖操作系统对页表指定的虚拟地址

#9


楼上没理解我说什么,映射时不用页目录表,因为页目录表在CR3中,可修改页目录表时,必须有另一个己存在完好的页目录表,也就是说在任务切换时TSS中的CR3物理地址装入CR3寄存器(这时不用页目录表的线性地址),应是一个完整的页目录表,可每个任务有自己的页目录表(是不一样的),对页目录表内容的改动要用线性地址,同时总要有一个新的页目录表来指引,那么页目录表将是无穷无尽的啦,也就是说页目录表的创建与维护将不可能,页目录表会是一成不变的,只要一开启页模式后就再也触及不到页目录表了,还有什么切换的概念

#10


这里无需使用新的页目录表来指引,用原来的就行。而且现在的操作系统都不会使用TSS来完成任务切换(尽量避免)。

#11


不会吧,页目录表改动自己呀,在改的过程中,自己是不完整的,也就是无法使用的,就像手心摸手背,摸不到的

#12


什么叫页目录改动自己,改动它们的是cpu,页目录和页表的内容也放在物理内存中,操作系统在分配内存修改页目录和页表时,就直接写入它们映射到的线性地址,比如0xC0000000-0xC03FFFFF,这个和写入其他线性地址的过程是完全一样的,某些地址写入后要清除cpu缓存才会生效

在切换进程时,修改cr3的值,往后映射关系就变了,中间没有循环依赖的现象

#13


谢谢了,我明白了有个快表缓存,CPU在改本身正使用目录表所在页时,它调用的是快表中过去时刻的目录表

#1


你在开分页前把页目录的物理地址在你认为不错的线性地址的页表中指定这个物理地址,开了分页后修改这个线性地址即可
32位windows的0xC0000000-0xC03FFFFF就被映射到当前进程的页表和页目录所在的物理地址

#2


还不太懂,楼上你好,可你只讲了页表工作的一项,能系统讲下WINDOWS内存分配中,页目录表修改的全部工作过程吗?谢谢了

#3


去看windows research kernel源代码的NtAllocateVirtualMemory

#4


先谢谢了,不好意思,呵呵,我是个大菜鸟,初学,没人教,还都是自学,没资料,全靠《WIN32汇编语言程序设计教程》这本书学汇编,想从最基础开始一步步学精,但还不知道从什么正确的方向快捷的入手,全是自己揣摩去碰,所以碰的都是问题,你说那资料我没有,能说个地址,我下载一下好吗?谢谢

#5


http://d.download.csdn.net/down/2007880/guobing0816

#6


可以把页表所在的物理地址映射到一个预定义好的虚拟地址上,然后以该虚拟地址就可以访问了
初学保护模式的就不要去看OS源码了,会弄晕的

#7


句体怎么映射,可映射本身需要页表呀,这样会无穷无尽的映射下去。

#8


显然不会,mmu在翻译地址时用的页表直接从物理地址存取,不依赖操作系统对页表指定的虚拟地址

#9


楼上没理解我说什么,映射时不用页目录表,因为页目录表在CR3中,可修改页目录表时,必须有另一个己存在完好的页目录表,也就是说在任务切换时TSS中的CR3物理地址装入CR3寄存器(这时不用页目录表的线性地址),应是一个完整的页目录表,可每个任务有自己的页目录表(是不一样的),对页目录表内容的改动要用线性地址,同时总要有一个新的页目录表来指引,那么页目录表将是无穷无尽的啦,也就是说页目录表的创建与维护将不可能,页目录表会是一成不变的,只要一开启页模式后就再也触及不到页目录表了,还有什么切换的概念

#10


这里无需使用新的页目录表来指引,用原来的就行。而且现在的操作系统都不会使用TSS来完成任务切换(尽量避免)。

#11


不会吧,页目录表改动自己呀,在改的过程中,自己是不完整的,也就是无法使用的,就像手心摸手背,摸不到的

#12


什么叫页目录改动自己,改动它们的是cpu,页目录和页表的内容也放在物理内存中,操作系统在分配内存修改页目录和页表时,就直接写入它们映射到的线性地址,比如0xC0000000-0xC03FFFFF,这个和写入其他线性地址的过程是完全一样的,某些地址写入后要清除cpu缓存才会生效

在切换进程时,修改cr3的值,往后映射关系就变了,中间没有循环依赖的现象

#13


谢谢了,我明白了有个快表缓存,CPU在改本身正使用目录表所在页时,它调用的是快表中过去时刻的目录表