分页操作系统

操作系统将空间分割为固定长度的分片,称为页,每一页有固定的地址空间,分页将进程的地址空间分割成固定大小的单元,每个单元称为一页,也叫做页帧(页并不会完全用完,页内参与有一些碎片)。

操作系统利用分页为进程分配内存时,内存不必是连续的,只要为进程分配足够的页就可以。进程使用的页都是虚拟页,他被放置在物理页帧里。虚拟页0放在物理页帧3(前两个页帧为操作系统所用,用户级线程不能使用,操作系统正好用虚拟地址让前两个页帧对用户来说不可见,更为安全)。

但需要有一个数据结构记录每个虚拟也在物理内存中的位置。操作系统给每个进程保存一个数据结构,称为页表(之所以是页表,也是由于每个进程会分到多个页)页表为进程地址空间的每个虚拟页面提供地址转换。

虚拟地址转换为物理地址

虚拟地址被分为页地址和偏移地址,操作系统将存储页地址部分,操作系统将存储所有的页地址,在具体寻址时,将物理页地址偏移地址合并,得到真正的地址。即像CPU一样,也有一个地址的合并器。而进程的页表,则是一个哈希表,进程内部的每一个虚拟页会对以一个真实的物理页,这样造成一种错觉,

所以寻址过程是:

汇编语言的地址->转换为第X页偏移量为Y的地址(X页位虚拟页)->查询进程页表获取进程X页的物理地址Z->Z左移12位与Y相加得到真正的物理地址;整个过程中偏移量不变;

以movl ,%eax为例;mov 21 ,%eax这里的21是进程内的虚拟地址21,不是物理地址21.

页表存在哪里

对于32位的地址来说,每一页4kb,需要存储20位的页地址,即2^20次方的页地址,在内存中存储这些地址需要耗费巨大的内存空间,造成浪费。

页表在哪里:如果在内存里,这意味着每一次读写命令都要额外访问一次内存获取真实地址,这样会降低程序执行的速度。在获取真实的地址前,系统需要获取进程的页表项,这里需要一个页表基址寄存器,来记录每个继承页表的位置。

页表里有什么

页表由页表项组成,页表项里不仅有物理页帧,还包括对该页的描述,如该页是否允许读,写,执行,该页是否被分配,该页是否被访问过(注意到每一个描述都为是或否,因此正好使用一位来记录),这些描述被称为位:如有效位,保护位,存在位,参考位,脏位

从页表中获取:

movl 21,%eax;的过程为:

首先移除地址的偏移部分,留下页值,

假设页表是数组结构的,那么页就是数组的索引,通过页表基址寄存器+sizeof(PTE)获取该页在数组里的地址,使用AccessMemory(PTEAddr)获取该页表项(注意还不是地址),

根据页表项的位(如参考位,脏位,保护位等)判断此次操作是否合法,非法则抛出异常;

获取偏移地址(第一个地址去除页地址)之后与PTE.PFN<

调用函数AccessMemory(PhysAddr)完成取值;

你可能感兴趣的:(linux,运维,服务器)