无锡网站建设制作方案,对单位网站建设的建议,wordpress 自带评论,商务型网站模板前言 本章主要讲解虚拟地址是怎么转化成物理地址的#xff0c;以及页表相关知识#xff1b;本文环境默认为32位机器下#xff1b;如果你连什么是虚拟地址都不知道可以先看看下面这篇文章#xff1b; Linux | 进程地址空间-CSDN博客 一、概念补充 页表#xff1a;是一种数据…前言 本章主要讲解虚拟地址是怎么转化成物理地址的以及页表相关知识本文环境默认为32位机器下如果你连什么是虚拟地址都不知道可以先看看下面这篇文章 Linux | 进程地址空间-CSDN博客 一、概念补充 页表是一种数据结构与硬件MMU配合可以将虚拟地址转化成物理地址页表中主要建立虚拟地址与物理地址之间的映射 页框我们将真实物理内存以4KB为单位进行划分其中每一个4KB我们称为一个页框 页框号识别页框的编号 知识回顾 之前我们讲解磁盘文件时我们说过通常进行一次IO的大小通常为4KB即使你只修改1字节也是以4KB为单位将数据先加载进内存中实际上也正是加载进内存的空闲页框中我们的磁盘文件也是以4KB进行划分 我们还说过我们的一个可执行程序在编译后形成可执行程序这个可执行程序实际上已经在内部进行分段分好了虚拟地址空间了我们可以直接使用编译好的虚拟地址 二、地址转化过程 前面我们说过我们的物理内存会以4KB分为一个又一个页框而操作系统是否需要维护这些页框呢答案当然也是肯定的我们可以将我们的页框用一种结构体描述起来然后用数组维护这些页框这样就有一个页框数组了数组下标可作为页框号假设一个为4GB的物理内存可以有多少个页框呢我们不难计算4GB 4 * 1024 * 1024 * 1024 Byte 一个页框为4KB 4 * 1024两者相除大约就是1024*1024约一百万个我们便可以用 struct page[1000000]; 即可表示所有物理内存中所有页框 首先我要讲解的是我们的虚拟地址通过页表MMU将我们的虚拟地址转换成物理内存中的物理地址若我们页表中没有物理内存中的地址而是只有磁盘中的地址此时是因为我们的数据没有被加载进磁盘可能之前发生或换出或本来没有加载进磁盘内这是我们在物理内存中申请一块空闲的页框我们找到空闲的页框后我们将磁盘文件加载进指定的页框同时我们也在页表上进行更新将新映射的物理内存地址填上去这个过程也就是我们常说的缺页中断 如果按上面的结构来看页表中的每个条目记录一个虚拟地址映射一个物理地址此时我们一共则需要 4 * 1024 * 1024 * 1024条记录假设物理内存有4G假设一条记录需要10个字节那么一个页表的大小就需要40G而我们的页表也是存在物理内存中呀这显然是不可能存的下的就算存的下也不可能消耗这么多内存资源存页表况且一个进程就有一张用户级页表计算机中绝对不止有一个进程 此时我们用另一种思路我们页表中将虚拟地址的32个比特位分开看其中前10位我们一起看作为页目录的索引来找到二级页表然后接着10位用来查找页框号最后12个比特位用来记录页内偏移如下图所示 我们来计算一下页目录最多有2^10也就是1024条目录对应着最多有1024个二级页表每个二级页表也最有有2^10条目录每条目录对应一个页框号所有二级页表可以表示2^10 * 2^10 个页框而我们的4GB内存最多也只有 2^20 个页框刚好一一对应最后12个比特位可以表示0到2^12 - 1而2^12正好也就是4KB也正好吻合设页表每一条目为10字节计算最大的情况下总大小为 页目录大小2^10 * 10 10KB 所有二级目录大小2 ^ 10 * 2 ^ 10 * 10 10MB其中10KB可忽略总大小最多为10M这个大小比我们第一种方案要小了很多很多这也是我们Linux下采用的方案