内存分页

分段过程下CPU加载内存段的一个改进:
CPU加载内存段的过程
查看段对应的段描述符,如果它的P(第47)位为1,表示段在内存中,访问过该段后,将段描述符的type的A(Accessed)位置为1,如果为0,表示不在内存中, CPU抛出NP(Not Present)异常,去执行中断描述符表中NP异常对应的中断处理程序,该程序将段从外存加载到内存,并将描述符的P位置为1,然后返回。CPU继续检查P位,如果P位为1,就可以访问它,访问过后将A位置为1。

段描述符的A位清0是由谁实现的?
操作系统每次发现段描述符的type的A位是1时,就把它置为0,这样就能得到在一个周期内各个段的使用频率,从而得到使用频率最低的段。

然而这个改进仍然有问题,如果进程段比内存还要大,这个程序就无法执行。还有一个问题是,如果进程的段比较大,每次换如换出的时间就会比较长。
出现进程段比内存大程序就无法执行的原因是什么?(我现在还没完全搞懂,没搞懂的地方是为什么物理地址不连续,就能让这样的程序执行)
因为CPU认为线性地址等于物理地址(内存中的物理地址),而线性地址是由编译器编译出来的,它本身是连续的,所以物理地址也要连续,但我们可用的物理地址不连续,所以只要做到线性地址连续,物理地址不连续就可以了,所以要通过别的映射方式建立线性地址与物理地址之间的映射。

这种映射方式是通过页表实现的。
在分段机制下,访问物理地址是通过段基址+偏移量来实现的,如下图
在这里插入图片描述
而在分页机制下,段基址+偏移量得到的是虚拟地址,我们需要通过页表也虚拟地址转化为物理地址,从而实现访问物理地址。这样就能保证在线性地址连续的情况下,物理地址不需要连续。如下图:
在这里插入图片描述
分页机制的原理
思想:第1段线性地址一定与第2段线性地址连续,第1段线性地址映射到一段物理地址,第2段线性地址映射到一段物理地址,实现这两段物理地址可以不连续。
作用:1、将线性地址转换为物理地址 2、用大小相等的页代替大小不等的段(比如将一个段分成多个页,但是这些页大小相等,如果一个段对应1.5个页,那0.5个页依然用一个页表示)。如下图:
在这里插入图片描述
分页机制下加载进程的过程
宏观:每个进程都有单独的4GB虚拟空间,首先进程的段按照页的大小映射到虚拟空间中的未分配页上,然后虚拟空间的这些页映射到物理内存的未分配页上。

一个很有意义的等式:任意进制的数字都可以分成高位部分和低位部分数量的乘积,若将低位部分理解为单位大小,高位部分则是这种单位的数量。(如2^32,若将第0~9位划分为单位大小,2的10次方,需要的数量是2的20次方)
在这里插入图片描述

页表存储在内存中,其中每个页表项是4字节,用来存地址,为了节省页表空间,势必要将页的大小增大,才能节省页表项的数量。CPU中采用的页大小是4KB,这样页表的大小是1MB(1048576)。
页表项中的物理地址是4k的整数倍,故用十六进程表示的地址,低3位都是0(因为0x1000=4KB)。

那么,如何使用页表将线性地址转换成物理地址?

如图5-10,右边第11~0位表示页的大小,也就是这12位可以作为页内寻址。左边31 ~ 12位用来表示页的数量,这20位来索引一个页。

任意一个地址最终会落到一个物理页中。32位地址空间共有1M(1048756)个物理页,首先要做的是定位到某个具体物理页,然后给出物理页内的偏移量就可以访问到1字节的内存了。所以,用20位二进制就可以表示物理页,标准页是4KB,12位二进制便可表达4KB内的任意地址。

所以,虚拟地址的高20位用来定位一个物理页,低12位用来在该物理页内寻址。

那么,如何用线性地址找到页表中对应的页表项?
首先要知道两件事
1、分页机制打开前要将页表地址加载到控制寄存器cr3中。因为分页机制还没打开,所以这个页表地址是物理地址,所以页表中页表项的地址也是物理地址。
2、虽然内存分页机制的作用是将虚拟地址转换成物理地址,但其转换过程相当于在关闭分页机制下进行,过程中所涉及到的页表及页表项的寻址,都是物理地址

所以,只要提供页表项的物理地址就能够访问到页表项,
1、用线性地址的高20位作为页表项的索引,每个页表项占4字节,所以要乘以4,用cr3寄存器中的页表地址加上此偏移量就是该表项的物理地址,
2、从该表项中得到映射的物理页地址,然后用线性地址的低12位与该物理页地址相加,所得的地址之和便是最终的物理地址。
(那页表项中的低12位是个啥?好像啥也不是哈哈哈哈)

二级页表
为什么要使用二级页表?一级页表有什么缺点?
一级页表如果全满的话,是4MB,一级页表中所有表项必须提前建好,因为操作系统要占用4GB虚拟地址空间的高1GB,用户进程要占用低3GB,每个进程都有自己的页表,进程一多,占用空间很大。

所以,我们要解决的是:不要一次性地将全部表项建好,需要时动态创建表项
二级页表
上面是二级页表的结构,页表和页目录表的大小都是4KB,一个表项是4字节,所以最多有1024个表项。页目录表中存放1024个页目录项(PDE,存的是页表地址),页表中存放1024个PTE(页表项,存的是物理页地址),总共1024 * 1024 * (4KB) = 4GB。
PDE: Page Directory Entry
PTE: Page Table Entry

二级页表线性地址定位到物理地址:
1、页目录有1024个PDE,需要高10位(31 ~ 22)来定位,页目录物理地址在cr3寄存器中,页目录地址+偏移量4得到对应的页表物理地址;
2、页表中有1024个PTE,需要中间10位(21~12)来定位,用得到的页表地址+偏移量
4得到对应的物理页地址;
3、剩下的12位作为偏移量,用来定位到物理页中的物理地址(一个页4KB=2^12)。
由于PDE和PTE都是4字节,所以给出PDE和PTE的索引后,还要乘以4,得到物理页地址和偏移量后,二者相加就得到了物理地址。

PDE和PTE的格式:
在这里插入图片描述
P,Present,若为1,表示在物理内存中,否则不在。
RW,Read/Write 读写位,为1表示可读可写
US,User/Supervisor,普通用户/超级用户位,为1,表示处于User级,任已级别特权的程序都可以访问该页;为0,表示处于S级,特权级为3的程序不允许访问该页。
PWT,Page-level Write-Through,意为页级通写位,若为1表示该页不仅是普通内存,还是高速缓存。
PCD,Page-level Cache Disable,页级高速缓存禁止位,若为1表示该页启用高速缓存。
A,Accessed位,访问位,为1表示被CPU访问过
D,Dirty,脏位,当CPU对一个页面执行写操作时,置为1,仅针对页表项有效(因为页表项都写了,页目录项写不写都一样)
PAT,Page Attribute Table,页属性表位,能够在页面一级的粒度上设置内存属性,比较复杂,置为0即可。
G,Global,全局位,为1,表示是全局页,若为全局页,该页将在高速缓存TLB中一直保存,给出虚拟地址就直接给出物理地址,无需转换。
AVL,Available位,表示可用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理,美食推荐管理,酒店推荐管理,周边推荐管理,分享圈管理,我的收藏管理,系统管理。用户可以在微信小程序上注册登录,进行每日签到,防疫查询,可以在分享圈里面进行分享自己想要分享的内容,查看和收藏景点以及美食的推荐等操作。因而具有一定的实用性。 本站后台采用Java的SSM框架进行后台管理开发,可以在浏览器上登录进行后台数据方面的管理,MySQL作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得旅游社交小程序管理工作系统化、规范化。 管理员可以管理用户信息,可以对用户信息添加修改删除。管理员可以对景点推荐信息进行添加修改删除操作。管理员可以对分享圈信息进行添加,修改,删除操作。管理员可以对美食推荐信息进行添加,修改,删除操作。管理员可以对酒店推荐信息进行添加,修改,删除操作。管理员可以对周边推荐信息进行添加,修改,删除操作。 小程序用户是需要注册才可以进行登录的,登录后在首页可以查看相关信息,并且下面导航可以点击到其他功能模块。在小程序里点击我的,会出现关于我的界面,在这里可以修改个人信息,以及可以点击其他功能模块。用户想要把一些信息分享到分享圈的时候,可以点击新增,然后输入自己想要分享的信息就可以进行分享圈的操作。用户可以在景点推荐里面进行收藏和评论等操作。用户可以在美食推荐模块搜索和查看美食推荐的相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值