CPU对内存管理二

来源:互联网 发布:手机免费sip软件 编辑:程序博客网 时间:2024/06/03 23:38

说的是页寻址机制,是上节MMU里如何将线性地址转化为物理地址的


32位操作系统管理的内存是4G,4G的大小是2的32次方得来的

将32位前10位分割,中间10位分割,后面12位再为一份

前面的10位成为一级页表,2的10次方,从0开始,一级页表中有元素1024个,每个元素为二级页表的首地址,意思是一级页表所占内存是1024*4(地址是4个字节)=4k,意思是有1024个二级页表

通过将前面10位换算为10进制混算为0-1023中间一个数,找到后面第几个二级页表

中间的二级页表,2的十次方,从0开始,二级页表中有1024个元素,每个元素为页的首地址,意思是一级页表所占内存是1024*4=4k,意思是所有的二级页表所占内存1024*1024*4=4M,意思是一个二级页表对应有1024个页,意思是共有1024*1024*1024=1G个页

通过换算中间10位为0-1023中间的一个数,然后找到我们存放数据具体在哪个页中

然后换算最后12位为0-4095中间一个数,找到在页中的具体位置

线性地址:CPU地址总线的地址,CPU支持线性地址,我们编译器里看到的都是线性地址

物理地址:内存中真正可以存储的地址

每个进程可以用不同的4G(线性地址),但总共的内存还是4G

每个进程必然会有一个线程,每个线程必然会有一个线程,每个线程必然会有一个堆栈1M,所以每个进程有且只有一个一级页表

CR3寄存器,里面放着当前进程的一级页表的首地址

CPU执行的过程就是通过CR3找到当前进程的一级页表的首地址,找到二级……页……数据

问题一:共有物理内存4G,有1G个页,页里的每个元素是物理地址,那所有页所占内存4G,所有二级页表所占内存1024(总共的二级页表数)*1024(每个二级页表中的元素数)*4(每个元素所占内存)=4M,一级页表所占内存1*1024*4=4k,那共占内存4k+4M+4G大于操作系统管理的内存

答:确实是这样,如果我们即将用完二级页表中的页,那内存大于了4G,就会对4G取余,回到4G的最上面,可能会崩,但是我们一般用的内存不多,而且一级页表中的512到1023是2G,是操作系统用的,我们用不到,所以也不会出现上述问题而蹦的情况

问题二:一级页表二级页表和页中村的地址是线性地址还是物理地址

答:物理地址。CPU的线性地址过来了,通过页表中的物理地址解析才能找到真正存放的位置,我们反推,如果一级页表中存放的是线性地址,那意味着还要建一个页表来存放物理地址。但是线性地址的后12位可以说是物理地址,因为数据存放在最后的页中,后12位找到了在页中的具体位置,和数据存放的物理地址挂上了钩

问题三:每个进程都有4G的内存可以用,那我当前进程用的地址是这个,下个进程用的地址也是这个,会不会将我上个进程的那个地址中的数据改写

答:不会。因为通过页寻址的机制,多个进程中的线性地址即使一样,但是找的物理地址却不一样,找空闲的物理地址给你下个进程用,除非是内存共享,多个进程用的是同一个物理内存,但这是你想要的结果呀

问题四:页寻址的好处

答:有两点,1.对物理地址的保护,可以说是一种安全模式。2.节省内存

解析:在之前doc的操作系统里,用户可以随意访问到系统使用的内存,会造成容易改写系统所占内存,导致蓝屏,页寻址中一级页表后面512到1023都为0,用户无法访问到,除非用CR0寄存器,那是编驱动的人使用的

2.如果我需要1M的内存,那只需要开辟一级页表空间4K,二级页表一个且是二级页表一个4K,二级页表中256个元素,每个元素4K构成1M,开辟的空间为4K+4K+1M,不用开辟多余的二级页表

0 0