当前位置: 技术问答>linux和unix
读过内核进来~~访问虚拟内存的方法!
来源: 互联网 发布时间:2016-04-29
本文导语: 缺页的情况: 1.计算得到的目录表项为0的话。说明该页表不在内存中,便产生一个缺页中断分配一个物理页4KB(存放页表)并且把分配的物理地 址赋值给该目录表项。于是可以进一步访问所在的页表了。 2.页表的物理...
缺页的情况:
1.计算得到的目录表项为0的话。说明该页表不在内存中,便产生一个缺页中断分配一个物理页4KB(存放页表)并且把分配的物理地
址赋值给该目录表项。于是可以进一步访问所在的页表了。
2.页表的物理地址找到了,但是计算出来的所在页表项的值为0。说明该页不在内存中。便产生一个缺页中断分配一个物理页4KB(存
放数据)并且把分配的物理地址赋值给该页表项。于是可以进一步访问所在的页了。
3.不会再中断了,根据页表项算出的物理地址 加上 偏移量就是该线性地址的物理地址了。
问题:
1.页表项里有什么内容?
2.页表项的值为0,说明该页不在内存中,那就要从虚拟内存中找,是用什么方法这么快速找到?是基于硬件还是软件算法实现的?(页表项里好像没有指向在虚拟内存上的帧吧?)
1.计算得到的目录表项为0的话。说明该页表不在内存中,便产生一个缺页中断分配一个物理页4KB(存放页表)并且把分配的物理地
址赋值给该目录表项。于是可以进一步访问所在的页表了。
2.页表的物理地址找到了,但是计算出来的所在页表项的值为0。说明该页不在内存中。便产生一个缺页中断分配一个物理页4KB(存
放数据)并且把分配的物理地址赋值给该页表项。于是可以进一步访问所在的页了。
3.不会再中断了,根据页表项算出的物理地址 加上 偏移量就是该线性地址的物理地址了。
问题:
1.页表项里有什么内容?
2.页表项的值为0,说明该页不在内存中,那就要从虚拟内存中找,是用什么方法这么快速找到?是基于硬件还是软件算法实现的?(页表项里好像没有指向在虚拟内存上的帧吧?)
|
1. 每个页表项(页目录项)由4个字节(32bits)构成!
bit31-bit12: 下一级表的物理地址,低12位固定为0,因为页总是page对齐的;
bit11-bit9:
...
自己google看看,或者查看内核源代码!
2.页表项的值为0,应该是该内存地址在物理上还不存在,需要新分配一个页。另外有一种情况是:该项不为0,但是页表项的present字段为0,说明该页表项对应的页不在内存中,被操作系统交换出去了。这是需要用缺页请求将其换入;一个页不在内存中,不是指他的虚拟内存,而是指虚拟内存所关联的物理内存不在内存中!所以,你说的“页表项的值为0,说明该页不在内存中,那就要从虚拟内存中找”这句话貌似是有些问题的, 实际上是: 虚拟内存永远都是有的,一般不会说虚拟内存不够或者没有,而是说物理内存没有,这时侯需要从系统空闲物理内存中分配一个页,然后将虚拟内存到物理内存建立起来! 然后通过虚拟内存访问OK了。这个过程中,是软件和硬件结合完成的!
good luck!
bit31-bit12: 下一级表的物理地址,低12位固定为0,因为页总是page对齐的;
bit11-bit9:
...
自己google看看,或者查看内核源代码!
2.页表项的值为0,应该是该内存地址在物理上还不存在,需要新分配一个页。另外有一种情况是:该项不为0,但是页表项的present字段为0,说明该页表项对应的页不在内存中,被操作系统交换出去了。这是需要用缺页请求将其换入;一个页不在内存中,不是指他的虚拟内存,而是指虚拟内存所关联的物理内存不在内存中!所以,你说的“页表项的值为0,说明该页不在内存中,那就要从虚拟内存中找”这句话貌似是有些问题的, 实际上是: 虚拟内存永远都是有的,一般不会说虚拟内存不够或者没有,而是说物理内存没有,这时侯需要从系统空闲物理内存中分配一个页,然后将虚拟内存到物理内存建立起来! 然后通过虚拟内存访问OK了。这个过程中,是软件和硬件结合完成的!
good luck!
|
这个问题很多书有讲。
页表项的内容硬件相关。大体包括权限,是否已映射等。象arm平台有
大页小页的概念,也需要相应的标志位。
页表映射的页如果在交换空间,则页表项里会有地址信息(没记错的话是复用页表的地址段),
不需要进行查找操作。
如果是分配新的物理帧,则也有高效的分配算法(通常从 free_page_list获取,不够会释放出一些内存先)
页表项的内容硬件相关。大体包括权限,是否已映射等。象arm平台有
大页小页的概念,也需要相应的标志位。
页表映射的页如果在交换空间,则页表项里会有地址信息(没记错的话是复用页表的地址段),
不需要进行查找操作。
如果是分配新的物理帧,则也有高效的分配算法(通常从 free_page_list获取,不够会释放出一些内存先)