什么是操作系统页表项?
以x86的机器为例,当允许paging的时候:
1、页表分了两级,32位地址被划分为10,10,12
2、CR3寄存器装了***级页表(也叫页目录)的物理地址,这个地址一定是对齐到一个页框的边界的。这个对应的页框将装着***级页目录,也就是说,页目录用掉了4KB,其中含有1024个页目录项,每个项占4Byte。每个项有20位是下一级的一个页表的位置。而另外的12位用于存放一些控制位。
3、为了定位一个虚拟地址,先拆出前10位,配合CR3找到相应的页目录项,然后得到了对应页表的地址,在没有错误的情况下再把线性地址的中间10位拿出来找到相应的页表项,然后就读出了20位的这个线性地址对应的页框,再加上12位就得到了物理地址。
在分页系统中,为每个进程配置了一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。
因为题中说逻辑空间32页,所以对应最多为32个页表项; 逻辑空间每页的大小和物理空间每页大小是相同的,所以物理块数=物理空间大小/页大小=1M/1K=2^9,故每个页表项至少有9位; 物理块跟页表项关系。
页面大小和页表项之间有必然的联系么?
一、理解这样一个概念,操作系统为了方便管理内存,将内存划分成很若干个页,每个页表项就代表一个页的地址(页的地址,不是内存地址)。
二、4B大小的页表项,意味着支持***的页表数是2的32次方=4294967296 (4B=32bit),一个页的大小4K,那么4B大小的页表项,表示操作系统支持4294967296*4K = 16GB大的内存。
三、现在问题是页表占用一定的内存。
(一)现在假设有2GB(一定要小于16GB)内存。
1、那么它一共有2GB/4KB=512K个页,也就是说页表项有512K项,而每个页表项的大小4B,那么页表在内存中占用的大小是:512K*4B=2MB,意味着,只要2MB就可以表示512K个页(每个页是4KB,总内存大小是2G),它页表本身占用了2MB/4K=512个页。
2、这一题 就是问你1个页可以表示多少个页表项,4KB/4B=1024个页表项。页面大小与页表项没有绝对的关系,但它们有这样关系:
(二)页面大小 * 2 ^(页表项大小)=操作系统***支持内存大小(虚拟内存)
1、本题是 4K * 2^(4B) = 16GB
2、页表占用内存 = 操作系统内存/页面大小 * 页表项大小,本题是,假设操作系统内存为2GB。 2GB/4KB*4B = 2MB
3、页表占用的页数是=页表占用内存/页面大小,这题同上假设2MB/4K=512个页。
扩展资料
一、地址结构
1、逻辑地址:CPU所生成的地址。CPU产生的逻辑地址被分为 :p (页号) 它包含每个页在物理内存中的基址,用来作为页表的索引;d (页偏移),同基址相结合,用来确定送入内存设备的物理内存地址。
2、物理地址:内存单元所看到的地址。逻辑地址空间为2^m,且页大小为2^n,那么逻辑地址的高m-n位表示页号,低n位表示页偏移。
3、逻辑地址空间:由程序所生成的所有逻辑地址的集合。
4、物理地址空间:与逻辑地址相对应的内存中所有物理地址的集合,用户程序看不见真正的物理地址。
5、注:用户只生成逻辑地址,且认为进程的地址空间为0到max。物理地址范围从R+0到R+max,R为基地址,地址映射-将程序地址空间中使用的逻辑地址变换成内存中的物理地址的过程。由内存管理单元(MMU)来完成。
6、分页逻辑地址 =P(页号).d(页内位移)
7、分页物理地址=f(页帧号).d(同上)
8、P = 线性逻辑地址/页面大小
9、d= 线性逻辑地址-P*页面大小
二、基本分页存储管理方式
用固定大小的页(Page)来描述逻辑地址空间,用相同大小的页框(frame)来描述物理内存空间,由操作系统实现从逻辑页到物理页框的页面映射,同时负责对所有页的管理和进程运行的控制。
三、分级页表
1、一个32位逻辑地址空间的计算机系统,页大小为4KB,那么页表有一百万条目。假设每个条目占4B,则需要4MB物理地址空间来存储页表本身。利用多级页表,可以减少页表所占用的空间。
2、一个逻辑地址(32位系统,页大小 4K) 可以被分为 :一个20位的页号 +一个12位的偏移。如果对页表进行再分页,那么页号分解为:一个10位的页号 +一个10位的偏移。因此,一个逻辑地址表示如下 :p1 是用来访问外部页表的索引, p2 是外部页表的页偏移。
参考资料来源:百度百科-页表
内存管理技术一:页表
操作系统分为用户模式和内核模式,riscv架构也分为特权架构和非特权架构。特权架构指的是因为定时器中断,异常和系统调用等情况,进程从用户模式切换到内核模式时,对一些特权架构的寄存器进行一系列的操作,也是用户态和内核态可以进行分离的实现原理。
Satp(Supervisor Address Translation and Protection Register) 寄存器是虚拟地址转换的一个非常重要的寄存器,下图展示了stap寄存器的内容。
如果直接将虚拟地址一一对应映射到物理地址,那么对于页表机制的空间需求太大了。
比如全中国14亿人,如果每个人的信息都是中国浙江嘉兴海宁奕斯伟xxx,那么14亿人占据的信息大小就会非常大。而如果对信息进行分类,比如同属中国,保留34个省,再保留下面的县,那么需要保存的数据量将会变得非常小(类似于填写快递收货地址)。页表的分页机制就是类似这种原理。
先来看虚拟地址的组成:
再来看转换后的物理地址:
页表项(page table entry)是页表中存储的内容,是寻址的媒介与核心。sv32中,页表包含了2^10个PTEs,每个页表项为4个字节。下图展示了PTE的组成。
V位表示PTE是否有效,如果V=0,则PTE中的其他位是无效的。R,W,X分别表示页的可读,可写,可执行权限。当这三位都为0时,PTE中的PPN表示的是指向下一级页表的物理页号。下图表示的是,XWR在不同的权限位时,PTE的含义。
RSW保留供supervisor模式下使用,此处可以暂时忽略。
每个lead PTE(即表示虚拟地址对应物理页号的PTE)都包含A(access)和D(dirty)位。其中A位表示虚拟页在上次A被清零之后是否被读/写/执行过。D位表示虚拟页在D位上次被清零之后是否被写过。正常情况下将A和D位置1来提高效率。对于non-leaf PTE,D,A,U位被保留用作未来的标准使用,并且必须被软件清零。
Sv32虚拟地址va被转化成物理地址pa的过程如下:
32位操作系统的页表转换只有sv32一种,已经在2.3.4中详细讲述。64位操作系统根据satp寄存器的MODE位可以分为sv39和sv48等多种页表转换方式,但原理其实和sv32差不多。sv39采用的是三级页表,sv48为四级页表,下图分别展示了在sv39和sv48时的虚拟地址,物理地址和页表项pte。
下图来自MIT的xv6操作系统课程对sv39三级页表映射方案从虚拟地址到物理地址地址转换的总结。
产生page f***lt的情况有很多种,比如因为懒加载机制,并没有给当前虚拟地址分配物理地址;根据地址转换的安全性检查,也会产生page f***lt;或者pte因为物理存储机制被存放至磁盘空间,也需要page f***lt进行swap等等。本章节将会讲述产生page f***lt的原因,后续章节中会讲述xvisor是如何具体处理page f***lt的。下图展示了在地址转换的过程中出现page f***lt的情形:
内核空间的处理比较简单,也不容易出现page f***lt的情况,只要处理vmalloc即可。对于用户空间来说,page f***lt的处理要考虑的情况比较多。首先要对虚拟地址的合法性进行检查。如果一个地址不在合法的VMA区间内,就判定为bad area,并处罚segmentation f***lt。如果在地址合法的情况下,首先考虑是否是因为用户控件的malloc懒加载机制。
因为malloc是动态分配内存机制,并且为了节省内存,内核并不会立刻为其分配物理内存,而是只是对vma进行信息记录。当地址真正被使用到的时候,处罚page f***lt,通过mmap建立对应的heap和stack内存区域的映射。在x86的实现机制中,还有一种情况(riscv的linux需要考证),就是在pte页表项的P位为0时,表明该页表项是存在的。只是从内存空间拷贝至了外部磁盘空间,需要调用swap_page将页面的内容拷贝回内存。
MIT操作系统课程
兰新宇:linux内核和虚拟化博客
riscv特权架构文档
微信读书:qemu/kvm源码解析与应用
《系统虚拟化》
一个页表项有多大???
(1)32bit地址空间,可寻址的地址为4G,如果按字节寻址,可寻址的内存大小为4GB。每个页面4KB,那么按页面寻址,则需要4GB/4KB=2^20个地址(页面个数),即用20位来寻址。页表项=页面数=20位。页表项应该是1M个,而不是4B。每个页表项如果是1B,则用内存空间是1MB。教材上是对的,你的参照书错了。页表项一般不为一字节,在WINDOWS系统中,按4KB分页。页表是4KB大小,放入一个物理页面中。页表项是32位,有1024个页表项,前20位表示对应的物理页面,后12放各种标志位。(2)多级页表和一级页表是一样的,是不过是用递归来实现地址的不断划分。多级页表中的页表都是存在内存中。如果是内存分页系统,一般是存在内存的一个物理页中。从页表寄存器中得到一级页表的物理地址,再根据地址格式,从一级页表的物理地址中读出数据所在的二级页表的的地址,依此递推,直到取出最后级页表,读出数据所在内存中的页面,再加上地址格式中的偏移量,就得出了真正的物理地址。
希望对你有所帮助。
查看原帖
什么是页表项?
以x86的机器为例,当允许paging的时候:
页表分了两级,32位地址被划分为10,10,12
CR3寄存器装了***级页表(也叫页目录)的物理地址,这个地址一定是对齐到一个页框的边界的。这个对应的页框将装着***级页目录,也就是说,页目录用掉了4KB,其中含有1024个页目录项,每个项占4Byte。这每个4byte就是你所要问的东西了。每个项有20位是下一级的一个页表的位置(为什么是20位呢?因为intel设计的页表是对其到4KB的边界的,于是只要20位地址,再左移12位就得到了这个地址)。而另外的12位用于存放一些控制位,常见的有present,user, dirty, accessed,r/w等,具体的查intel的开发者手册,上面讲的很详细。页表项和页目录项内容差不多,稍有区别。
为了定位一个虚拟地址(在x86里应该是分段后的地址,叫线性地址),先拆出前10位,配合CR3找到相应的页目录项,然后得到了对应页表的地址,在没有错误的情况下再把线性地址的中间10位拿出来找到相应的页表项,然后就读出了20位(还没左移12位,页框肯定是对齐到4KB的边界的)的这个线性地址对应的页框,再加上12位就得到了物理地址。
页表项的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于页表项长度和页面大小、页表项的信息别忘了在本站进行查找喔。