上一章讲的段机制,在现有的CPU硬件环境中,属于用的比较少的,现在绝大部分CPU主要采用分页机制。
分页讲两部分:1基于也的寻址,基于页的地址空间,2 基于分页机制的硬件实现方式。
首先看页的寻址, 之前的分段机制,你得知道段号和段内偏移,分页机制也一样,需要页号和页内偏移。
分页和分段最主要的区别是:段的尺寸,在分段机制里面,段的尺寸是可变的,在分页机制里面,页的大小或者页帧的大小是固定的。
物理地址帧的大小和逻辑地址页的大小相同,好处在于:便于硬件对他做相应的实现。
MMU是CPU中重要组成部分,
TLB就是块表,完成对页表的一个缓存。
有了这些机制之后,可以加速地址之间的转换。
物理页的地址寻址方式:
页帧指的是物理内存的组织和布局方式,页帧代表物理内存是由两部分组成:
1 页帧号,2 页帧里面的偏移,
比如一个地址有N位,分成两块,页帧号占了F位,页帧大小占了S位,也就确定了在整个寻址空间中有2^F个页帧。每个页帧有2^S字节大小。
对于一个物理页而言,如果知道它的页帧号、页帧内偏移,就可以得出它的物理地址。如上图中的公式
举例:
页帧号是3,页帧内偏移是6
最终得到的结果就是上图 绿色部分的地址。
逻辑寻址方式:
整体和页帧的计算方式一样,区别在于,所谓页的号的大小和页帧号的大小可能不一样,但是每个页的大小和每个页帧大小这两个是一样的。
上图,公式中是乘号,虚拟地址=2^Sxp+o
如上图,当一个程序运行的时候,程序本身的逻辑地址是一个连续的地址空间,是由一个页一个页组成的,每个页的大小是一样的,整个程序的容量,和物理地址空间可能不一样,比如说程序占很大内存空间,物理地址空间没有这么大。
首先程序执行,CPU和分段机制一样要去寻址,无论是执行一条指令还是访问一个数据,它都需要指令或者数据所在的位置,寻址就需要知道一个地址,这个地址是一个逻辑地址。
如上图CPU下面的逻辑地址。地址分层两块,一块是页面偏移offset,o来表示,另一块是页号,p来表示。
页号作为index,去查一个page table(页表后面会讲,简单理解为,以页号为索引的对应的那一项的内容,内容放的是帧号)这样通过页号就可以查到对应的帧号,这实际上就是一个大的数组, 也就是page table。
如果要去查找这个page table,他需要知道从哪里开始查,所以还需要一个很重要的信息,叫page table的base,它的基地址在哪里,有了这两个信息之后,一个base,一个是它对应的page num 号作为index去查找,以pagenum为index这个页表项,页表项的内容,这里面内容是个frame num.这样就通过了页号知道了帧号。知道帧号后,帧号再加上它的offset,形成了所谓的页帧号和页帧offset的共同组成的物理地址,根据前面的计算公式,得到物理地址位置。
这个page table是由操作系统来建立的。
分页机制不同的地方,它和我们之前讲的分段机器有点不一样,分页机制页内偏移大小是固定的,使得硬件管理上面更加简洁的方式来实现。而不用像分段方式,需要考虑不同段的大小不一致的问题。
第二个需要注意的是,逻辑空间大小和我们以帧为组成的物理地址空间大小不一致。
一般来说逻辑地址空间大于物理地址空间,