2019独角兽企业重金招聘Python工程师标准>>>
一、分页
先入为主理解的分页和系统中内存内应的分页
1.弄过数据库数据查找展示,有个数据分页展示的概念,这个的目的是为了速度、和展示效果上的提升
2.内存的分页又是怎么回事哪?
(1)加载程序那么内存分配是必不可少的;
(2)配的几种方法:单一连续、固定分配、动态分配(最先适应、下次适应、最优适应、最坏适应、快速适应)
(3)然动态分配是最理想的状态,但是动态分配有个问题:
程序的加载内存的碎片化比较严重
碎片化后占用内存大的程序分配内存是比较困难的
处理器分页的目的是为了解决分页中的碎片化,但是太复杂了就由处理器来做这件事情了
二、认识简单分页的模型
1.实模式的寻址:段选择器:偏移量
2.保护模式寻址:段选择子:偏移量 得到真实的基地址+偏移量
段选择子=》GDTR/LDTR得到描述符的基地址+选择子*2^3偏移=》真正的描述符=》真实基地址
3.段式分页的寻址模式:
首先分页模式是建立在保护模式下的
保护模式的寻址方式还是用的但是现在他映射的是一个虚拟的内存4G空间
每个页的大小是固定的4KB,占4个字节(页的物理地址,应该是起始地址)
那么这个页表在内存4G的空间中,占位的描述空间有4M
问题1:从上面的描述中页对应的才是真实的物理地址,如何映射?
也就是段如何映射到页?用了多个页又是如何映射连接起来的;
段部件输出的是线性地址(虚拟地址),因为页的大小是4KB;
地址低12位是偏移量,高20位其实是一个描述符表占位(4字节);用于记录当前用的页的位置
问题2:从上面可以看出段和页的映射关系?
可以随意映射;页的映射也可以是间隔开来,也就是碎片的可以连接起来了
问题3:空闲页是如何标示的?
三、页目录、页表、页
就好像书本一样,章节-》目录-》书名(书的分类)
页还是以前的页;2^20
页表首先不和页是固定对应的关系;但是每个页表有1024个页;2^10
页目录有1024个页表的物理地址;
问题1:这些信息保存在哪里?怎么加载的?
每个任务都有自己的页目录和页表;
处理器内部,有一个控制寄存器CR3,存放着当前的任务页目录的物理地址(页目录基址寄存器)
每个任务都有自己的任务状态(TSS)当任务切换时CR3也随着更新,指向新任务的页目录位置
四、例子
书上的例子:段的起始地址:0x00800000 界限:0x5000 z字节单位
现在寻址偏移量:0x1050
没开启分页前的地址:基地址+偏移量=真实的物理地址
开启分页后:处理器页部件专门负责线性地址到物理地址的转换(段部件送的地址+后的虚拟地址)
首先将段部件送来的地址分为三部分:高10位 中间10位 低12位
页目录 页表 偏移量
页目录的物理地址CR3中
(1)页目录索引*4+CR3的地址-》页目录中页表的物理地址
(2)页表的物理地址+页表索引*4-》页的物理地址-》真是的物理地址+偏移量