一步步编写操作系统 37 一级页表与虚拟地址2

接上节,分页机制是建立在分段机制之上,与其脱离不了干系,即使在分页机制下的进程也要先经过逻辑上的分段才行,每加载一个进程,操作系统按照进程中各段的起始范围,在进程自己的4GB虚拟地址空间中寻找可有空间分配内存段,此虚拟地址空间可以是页表,也可以是操作系统维护的某种数据结构,总之此阶段的分配是逻辑上的,并没有真正写入物理内存。代码段和数据段在逻辑上被拆分成以页为单位的小内存块。这时的虚拟地址虚如其名,不能存放任何数据。接着操作系统开始为这些虚拟内存页分配真实的物理内存页,它查找物理内存中可用的页,然后在页表中登记这些物理页地址,这样就完成了虚拟页到物理页的映射,每个进程都以为自己独享4G地址空间。

以上在宏观上笼统地介绍了分页机制下操作系统加载用户进程的整个流程,先让大家心中有数,了解我们下面所说的内容是什么。也许您对此过程并不十分理解,不过没关系,下面咱们开始从头说起。

映射这个概念大家应该比较清楚,对应的英文单词是map,意为地图。地图是对实际地理空间的一种抽象,地图上的每个位置都代表某个真实地理空间,这种地图上与地理上一一对应的关系就称为映射。

在内存地址中,最简单的映射方法是逐字节映射,即一个线性地址对应一个物理地址。比如线性地址为0x0,其对应的物理地址可以是0x0、0x10或其它你喜欢的数字,若线性地址为0x1,对应的物理地址为0x1、0x11或其它你喜欢的数字。我们需要找个地方来存储这种映射关系,这个地方就是页表,Page Table。页表就是个N行1列的表格,页表中的每一行(只有一个单元格)称为页表项PTE(Page Table Entry),其大小是4字节,页表项的作用是用来存储内存物理地址。当访问一个线性地址时,实际上就是在访问页表项中所记录的物理内存地址。

页表与物理内存关系示意如下图所示:

如果采用这种线性地址与物理地址一一映射的方案:

  1. 表中就应该有4G个页表项
  2. 32位的地址要用4字节的页表项来存储,页表总共大小是4Byte*4G =16GB。

分页机制本质上是将大小不同的大内存段拆分成大小相等的小内存块。以上方案其实就是将4GB空间划分成4G个内存块,每个内存块大小是1字节。页表也是存储在内存中的,为了表示32位地址,每个页表项必须要4字节,若按此方案,光是页表就要占 16GB内存,得不偿失,显然方案不合理。

以上方案不成立的原因是内存块数量太大了,也就是说,在总的4GB地址空间恒定不变的情况下,内存块尺寸选的太小了。为了找到合适的内存块大小,我们做下列分析与尝试。

任意进制的数字都可以分成高位部分和低位部分,若将低位部分理解为单位大小,高位部分则是这种单位的数量。如六万的十进制可表示为60000,也可以表示为60千。也就是将60000分成高位60和低位1000两部分。

为了节省页表空间,势必要将滑块往左调整,以使内存块尺寸变大,这样内存块数量变小,从而减少了页表项数量。如果滑块指向第20位,内存块大小则为2的20次方,即1MB,内存块数量则为2的12次方,即4K个。若滑块指向第12位,内存块大小则为2的12次方即4KB,内存块数量则为2的20次方,1M,即1048576个。这里所说的内存块,其官方名称是页,cpu中采用的页大小恰恰就是4KB,也就是上图中滑块的落点处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PointNet:3D点集分类与分割深度学习模型

之前的一篇博客《动手学无人驾驶(4):基于激光雷达点云数据3D目标检测》里介绍到了如何基于PointRCNN模型来进行3D目标检测,作者使用的主干网是PointNet,而PointNet又是基于PointNet来实现的。今天写的这篇博客就是对Po…

【POJ - 3281】Dining(拆点建图,网络流最大流)

题干: Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulous meals for his cows, but he forgot to check his menu against their preferences. Although…

计算机视觉那些事儿(1):基本任务

本文主要介绍深度学习在计算机视觉领域(Computer vision)基本任务中的应用,包括分类、检测、分割(语义与实体)。 目录 引言 分类(Classification) 目标检测(Object Detection) T…

一步步编写操作系统 38 一级页表与虚拟地址3

接上,页是地址空间的计量单位,并不是专属物理地址或线性地址,只要是4KB的地址空间都可以称为一页,所以线性地址的一页也要对应物理地址的一页。一页大小为4KB,这样一来,4GB地址空间被划分成4GB/4KB1M个页&a…

《Python编程:从入门到实践》速查表

本文是Python畅销书《Python:从入门到实践》速查表。 随书配套视频观看地址:https://www.bilibili.com/video/av35698354 目录 1.Overview 2.Lists 3.Dictionaries 4.If and While Loops 5.Functions 6.Classes 7.Files and Exceptions 8.Testin…

【HDU - 5963】朋友(博弈,思维,必胜态必败态,找规律)

题干: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1。 在一局游戏开始时,会确定一个节点作为根。接下来从女生开始&…

一步步编写操作系统 39 二级页表1

前面讲述了页表的原理,并以一级页表做为原型讲述了地址转换过程。既然有了一级页表,为什么还要搞个二级页表呢?理由如下: 一级页表中最多可容纳1M(1048576)个页表项,每个页表项是4字节&#xf…

PointNet++详解与代码

在之前的一篇文章《PointNet:3D点集分类与分割深度学习模型》中分析了PointNet网络是如何进行3D点云数据分类与分割的。但是PointNet存在的一个缺点是无法获得局部特征,这使得它很难对复杂场景进行分析。在PointNet中,作者通过两个主要的方法…

一步步编写操作系统 40 内存分页下用户程序与操作系统的关系

分页的第一步要准备好一个页表,我们的页表是什么样子呢?现在我们要设计一个页表啦。 设计页表其实就是设计内存布局,不过在规划内存布局之前,我们需要了解用户进程与操作系统之间的关系。 前面讲保护模式时,我们知道…

【HDU - 4055】Number String(dp,思维)

题干: The signature of a permutation is a string that is computed as follows: for each pair of consecutive elements of the permutation, write down the letter I (increasing) if the second element is greater than the first one, otherwise write do…

一步步编写操作系统 41 快表tlb 简介

分页机制虽然很灵活,但您也看到了,为了实现虚拟地址到物理地址的映射,过程还是有些麻烦的。先要从CR3寄存器中获取页目录表物理地址,然后用虚拟地址的高10位乘以4的积做为在页目录表中的偏移量去寻址目录项pde,从pde中…

【CodeForces - 731C】Socks(并查集,思维)

题干: Arseniy is already grown-up and independent. His mother decided to leave him alone for m days and left on a vacation. She have prepared a lot of food, left some money and washed all Arseniys clothes. Ten minutes before her leave she real…

50个最有用的Matplotlib数据分析与可视化图

本文介绍了数据分析与可视化中最有用的50个数据分析图,共分为7大类:Correlation、Deviation、RankIng、Distribution、Composition、Change、Groups 原文链接:https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-t…

一步步编写操作系统 42 用c语言编写内核

在这之前,我们一直用汇编语言直接与机器对话,如果大家不知道这个世界上有高级语言的话,我想大家也不会觉得写汇编代码的过程很辛苦,哈哈,幸福确实是比较出来的。相对于汇编语言,用c 语言写内核是非常爽的事…

【CodeForces - 722C】Destroying Array(并查集,时光倒流)

题干: 给定一个有n个数的序列a1,a2, ..., an 你每次可以将序列中一个数删去,剩下的数会被分割为一段一段连续的数列 给定一个删除数的顺序,问在每次删除之后,剩下的连续的数列中,数列和的最大值为多少 Input 第…

视觉SLAM十四讲(1):预备知识

最近在学习高翔博士的《视觉SLAM十四讲》(第二版),算是初学本书,配套资源还算蛮丰富的,有代码(第一版和第二版都有),B站上也有高翔博士对第一版录制的讲解视频,真的是很贴…

一步步编写操作系统 43 汇编语言和c语言的理解

也许有的同学喜欢用汇编语言来实现操作系统,觉得用汇编来写程序似乎更简单直接,可控性比较强,有种“一切尽在掌握”的赶脚。而用c语言实现操作系统这件事,虽然轻松很多,但似乎隐约感觉到有些慌张。因为虽然c语言相对来…

视觉SLAM十四讲(2):初识SLAM

这一讲主要介绍视觉SLAM的结构,并完成第一个SLAM程序:HelloSLAM。 目录 2.1 小萝卜的例子 单目相机 双目相机 深度相机 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 2.4 编程实践 Hello SLAM 使用cmake 使用库 【高翔】视觉SLAM十四讲2.1 小…

【CodeForces - 467C】George and Job(dp,思维)

题干: The new ITone 6 has been released recently and George got really keen to buy it. Unfortunately, he didnt have enough money, so George was going to work as a programmer. Now he faced the following problem at the work. Given a sequence of …

一步步编写操作系统 44 用c语言编写内核1

先来个简单的,欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。 1 int main(void) { 2 while(1); 3 return 0; 4 }它没法再简单啦,简单的程序似乎能帮助咱们更容易的理解所学的知识,哈哈,我说的是似乎,其实&…