设计公司网站需要什么条件,韩国能否出线,网站建设公司哪家好要选磐石网络,把wordpress变成网盘操作系统将空间分割为固定长度的分片#xff0c;称为页#xff0c;每一页有固定的地址空间#xff0c;分页将进程的地址空间分割成固定大小的单元#xff0c;每个单元称为一页#xff0c;也叫做页帧#xff08;页并不会完全用完#xff0c;页内参与有一些碎片#xff0…操作系统将空间分割为固定长度的分片称为页每一页有固定的地址空间分页将进程的地址空间分割成固定大小的单元每个单元称为一页也叫做页帧页并不会完全用完页内参与有一些碎片。
操作系统利用分页为进程分配内存时内存不必是连续的只要为进程分配足够的页就可以。进程使用的页都是虚拟页他被放置在物理页帧里。虚拟页0放在物理页帧3前两个页帧为操作系统所用用户级线程不能使用操作系统正好用虚拟地址让前两个页帧对用户来说不可见更为安全。
但需要有一个数据结构记录每个虚拟也在物理内存中的位置。操作系统给每个进程保存一个数据结构称为页表之所以是页表也是由于每个进程会分到多个页页表为进程地址空间的每个虚拟页面提供地址转换。
虚拟地址转换为物理地址
虚拟地址被分为页地址和偏移地址操作系统将存储页地址部分操作系统将存储所有的页地址在具体寻址时将物理页地址偏移地址合并得到真正的地址。即像CPU一样也有一个地址的合并器。而进程的页表则是一个哈希表进程内部的每一个虚拟页会对以一个真实的物理页这样造成一种错觉
所以寻址过程是
汇编语言的地址-转换为第X页偏移量为Y的地址X页位虚拟页-查询进程页表获取进程X页的物理地址Z-Z左移12位与Y相加得到真正的物理地址整个过程中偏移量不变
以movl vidtual address,%eax为例mov 21 ,%eax这里的21是进程内的虚拟地址21不是物理地址21.
页表存在哪里
对于32位的地址来说每一页4kb需要存储20位的页地址即2^20次方的页地址在内存中存储这些地址需要耗费巨大的内存空间造成浪费。
页表在哪里如果在内存里这意味着每一次读写命令都要额外访问一次内存获取真实地址这样会降低程序执行的速度。在获取真实的地址前系统需要获取进程的页表项这里需要一个页表基址寄存器来记录每个继承页表的位置。
页表里有什么
页表由页表项组成页表项里不仅有物理页帧还包括对该页的描述如该页是否允许读写执行该页是否被分配该页是否被访问过注意到每一个描述都为是或否因此正好使用一位来记录这些描述被称为位如有效位保护位存在位参考位脏位
从页表中获取
movl 21,%eax;的过程为
首先移除地址的偏移部分留下页值
假设页表是数组结构的那么页就是数组的索引通过页表基址寄存器sizeof(PTE)获取该页在数组里的地址使用AccessMemoryPTEAddr获取该页表项注意还不是地址
根据页表项的位如参考位脏位保护位等判断此次操作是否合法非法则抛出异常
获取偏移地址第一个地址去除页地址之后与PTE.PFNPFN_SHIFT相加即得到PhysAddr真实的物理地址
调用函数AccessMemoryPhysAddr完成取值