全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

这是mmu.h的一部分,从这里其实能够看到一个转换的概念,那就是如何从线性地址转换到物理地址。从上面的注释其实能够看出一个比较清晰的三段结构,那就是页目录索引、页面索引、页偏移量。这三段信息分别占用了10bit、10bit、12bit。这里给出来的页地址处理则是上面三个信息进行组合的过程,这个组合其实是形成了线性地址的原始值。

这里看了一下上面的每一个操作的具体实现,从这些实现只能够看到三段信息与线性地址的关系。如果从x86的分页管理模型的角度考虑,其实现在还没有跟最终的物理地址产生什么关系。

感觉这一段的配置信息有一些难理解,可能得结合硬件说明的文档。不过这里的注释说明讲得还是很准确,有这里的这些信息可以进行一个推测以弄清楚这个映射机制。

按照上面的注释说明,为什么用+来增加一个flag其实是很清楚的,这个主要是用来实现编译的过程中就能够处理掉的初始化。如果,程序完成编译,这一段程序被链接器分配到KERNBASE + 1MB开始的位置。也就是,0xF0100000开始的位置。因此,这里涉及到的两个表的定义信息也基本上是在这个地址附近左右。如果,进行了一个减去KERNBASE的处理,其实里面的信息也就是在1MB这个地址附近,确切说是这个地址稍微往后一点的地方。这么看,在数值上entry_pgdir的第0个元素的数值应该是entry_pgtable数组在被BootLoader加载到物理存储之后的位置的一个字节之后的地址值。而这里面的第0x3c0个元素的数值则是比上面的数值再大2的一个数值。

如果靠猜测,接下来的处理逻辑很明确了。上面的四个参数,如何凑出来一个至少看着是4MB的信息组合。看起来,应该是需要研究下页表的定义信息才行。在存储的处理上,最小的单位是4K,因此如果是能够凑出来1M,其实是1K个page。

通过看这个表,其实可以看到一个基本的处理信息。我们看到的4M,其实很容易从这个数组的内容覆盖上凑出来。那么,这个表的信息决定了使用的物理存储范围?如果是这样,这里的每一个index其实是决定了一个4K段的起始地址。那么,如果让[KERNBASE, KERNBASE+4MB)的信息与这个产生对应关系呢?

为了弄清楚这个存储的管理模式,还是去查了一些文档。首先,我前面理解这个处理过程的时候就犯了一个错误。我一直在尝试把这个数值跟寄存器的信息做一个对照,但是这个数据结构是有自己的定义的。而当前的代码中,使用的PS其实是4K的模式。

为了便于分析,我改了编译的链接选项直接生成了map文件。这样能够在map中看到上面的地址,不用直接做理论推导。这样,第一个元素其实是0x113001,低12bit除了P位全都是0。第二个被初始化的元素值,比这个数值多了一个bit位的置位,加了读写。0x113001中的0x113其实是页表地址。

这样,对这段代码重新理解应该能够得出这样的基本推理信息:页目录表的index其实是需要处理的线性地址的高10bit,根据这个信息,可以索引到一个信息。而这个索引到的信息,包含两部分信息。第一部分信息是页表的地址,第二部分则是操作的属性。因此,上面的两个处理其实一个是把地址0开始的一段空间映射到了0~4MB的空间区域。另一个则是把KERNBASE开始的一段存储空间映射到了0~4MB。这个理解其实很简单,但是的确是费了点周折。

配置生效的方式非常简单,就是把页目录表的地址加载到CR3寄存器。

这个处理在JOS的entry.S中是在上面的代码中体现的。

这样,关于整个entry.S的分析中的一个遗憾终于是补充上了。继续往下分析JOS的行为,看起来更加理顺一些了。

1655_MIT 6.828 JOS存储分页映射的实现分析相关推荐

  1. 1665_MIT 6.828 JOS虚拟存储的设置

    全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 之前把这一部分相关的功能 ...

  2. ARM的存储器映射与存储器重映射【转载】2009-12-14 10:29最近在用LPC2148,看到了一篇文章,感觉很有帮助,就转了过来。

    ARM的存储器映射与存储器重映射[转载]2009-12-14 10:29最近在用LPC2148,看到了一篇文章,感觉很有帮助,就转了过来. arm处理器本身所产生的地址为虚拟地址,每一个arm芯片内都 ...

  3. 存储设备映射Linux服务器,在linux和Windows下配置HP FC存储设备多路径驱动

    主机安装HBA卡驱动,一般光纤卡的厂家就是QLogic和Emulex的.Linux下查看光纤卡驱动模块是否加载通过lsmod|grepqla2xxx#查看是否加载了QLogic的光纤卡模块lsmod| ...

  4. 阿里云的NoSQL存储服务OTS的应用分析

    这篇文章主要介绍了阿里云的NoSQL存储服务OTS的应用分析,OTS作为阿里巴巴开发的NoSQL存储技术服务现已面向用户商业化,需要的朋友可以参考下. 1. 概要   OTS是构建在阿里云飞天分布式系 ...

  5. python 映射表_python映射列表实例分析

    本文实例讲述了python映射列表.分享给大家供大家参考.具体分析如下: 列表映射是个非常有用的方法,通过对列表的每个元素应用一个函数来转换数据,可以使用一种策略或者方法来遍历计算每个元素. 例如: ...

  6. 1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分

    全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 之前,花了一晚上时间一个 ...

  7. 1660_MIT 6.828 JOS初始化boot_alloc的初步实现

    全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这一次的小结有一点没底气 ...

  8. 1654_MIT 6.828 JOS entry.S实现分析

    全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 之前分析过JOS中的启动 ...

  9. MIT 6.828 JOS学习笔记17. Lab 3.1 Part A User Environments

    Introduction 在这个实验中,我们将实现操作系统的一些基本功能,来实现用户环境下的进程的正常运行.你将会加强JOS内核的功能,为它增添一些重要的数据结构,用来记录用户进程环境的一些信息:创建 ...

最新文章

  1. 098~100:ORM迁移
  2. Angular route传参
  3. 2021中超1 1006 xor sum
  4. java mousepress_Java线程原语弃用
  5. 紧跟潮流的背景设计,赶紧尝试用新的背景改变旧的设计。
  6. 使用bind构建本地简易dns服务器
  7. Android-怎么配置ADT配置了没有安卓图标怎么办
  8. 框架-vue-cli
  9. 大气压计BMP280+BME280+BMP180 在ESP8266 (RTOS3.2)上初调的兼容驱动
  10. 百度搜索下拉框及百度相关搜索中刷关键字方法
  11. 天翼云RDS数据库如何修改数据库参数
  12. 小红书差评笔记下沉 | 如何让小红书笔记下沉
  13. 国开电大 光伏电池原理与工艺 形考任务
  14. java小组队徽_小组队徽设计.ppt
  15. uni-app的由来
  16. 灰关联分析与语音/音乐信号识别
  17. 【网络】交换机 VLAN 网关 路由器
  18. [CF1336F]Journey
  19. i78700k配什么显卡好_八代i7 8700配什么显卡好?intel酷睿i7-8700适合搭配的显卡推荐...
  20. 每日一题@61存在重复元素

热门文章

  1. 惠普孙振耀:让18位上司成为伯乐
  2. Linux文本编辑器---vim详解
  3. 实验室GPU服务器的搭建
  4. 最新彩虹外链网盘V5.1版网站源码 全新界面 支持图片违规检测
  5. 提升组织信息安全意识的重要性
  6. VS2010调试时出现“0x7556d36f 处最可能的异常: 0x000006BA: RPC 服务器不可用”的解决方法
  7. Windows服务器补丁列表及介绍_内网补丁服务器搭建
  8. 桌面创建html文件路径,html本地图片路径
  9. 由数字、26个英文字母或者下划线组成的字符串:
  10. 西北工业大学计算机有调剂,2020年西北工业大学微电子学院硕士研究生调剂工作方案...