这个分页,主要是在mit6.828的lab2的背景下来说的。

Mit6.828 Lab2:http://pdos.csail.mit.edu/6.828/2014/labs/lab2/

lab2主要讲虚拟内存->物理内存的变换,通过一定的函数来实现软件MMU的部分。

整个地址转化的过程如下图所示:

首先,明确一点,在程序里面的所有地址,都是虚拟地址,程序里面是不会出现物理地址的,就算是物理地址,CPU也会把它当做虚拟地址,通过MMU转化为物理地址。

通过上面的图,可以知道,在系统中,CPU得到一个虚拟地址,这个虚拟地址是logical address,通过分段翻译后,会得到一个线性地址(linear address),线性地址通过分页翻译后,就可以得到物理地址了。

在lab2里,分段机制基本就没有,所以可以直接认为cpu得到的虚拟地址就是线性地址,只需要经过page translation 就可以得到物理地址了。下面,就来讲一下系统分页的详细过程。

如下图所示,就是线性地址通过page director  和 page table转化成物理地址的过程:

这张图是从虚拟地址来的,所以包含了分段的过程。其实,分段过程也比较简单,以C程序举例,在C中,所有的指针,它的值是一个偏移量,这个偏移量要加上段基址,得到一个线性地址。而前面的偏移量+段基址的过程,就是分段的过程。

在一个程序中,一般分为堆,栈,代码段,数据段(.date和.bss等),而指针的值,就是相应的段上的偏移量,如一个指针指向的是一个全局变量,则它的线性地址位P+.date的基址。这个过程就是分段。在lab2里面,分段基址好像暂时没怎么涉及,所以暂且不管它。好像想在操作系统多是分页,分段应该不多了。分段和分页主要的区别就是分页的页框是固定大小的,不变的。而分段,每一段的大小都是不定的。分段有利于程序的编译。这一块还要在看看书,还是有点不了解。

分页:

在lab2中,主要就是分页的各种东西。在jos系统里面,采用二级页表的分页形式。即分为page directory 和 page table两级页表。

二级页表好处:在32位系统中,理论上来说,每个进程都拥有独立的地址空间,其大小是2^32=4G,如果采用一级页表,则以4K的页框大小为例,要分配2^20个页面来给程序使用,每个页面占4字节,则光地址转换的页面就需要4*2^20=4M大小(page table的大小)了。这对于以前比较小的内存来说,是非常的大的。虽然现在内存都有几个G,但是如果64位操作系统也用一级页表分页的话,内存塞满了都放不下转换页……。

对于大多数的程序,我并不需要使用4G的内存空间,比如编写一个非常简单的排序程序,如果数据量不是很大的话,应该总共加起来连1M的内存都用不到,这样,总共实际用到的页面就只有2^8=256个页面,占的内存只有256*4=1024=1k,剩下的大部分存这的转换部分的内存都是没用的,这就表明了一级页表的空间利用率其实是非常低的,存在着大量的浪费。

所以,要使用二级页表来进行分页。二级页表实在一级页表的基础上进一步转化而来。以32位系统为例,假设页面大小位4K,一级页表是把低位的12位作为页内偏移,高位的20位作为页索引。而二级页表,把低位的12位作为页内偏移,高位的10位作为page directory(PDE)的索引,中间的的10位作为page table(PTE)。所以,以上面那个排序程序为例,如果他只用到了部分的页面,根据程序页面的局部性原理,这些页面会集中在某几个”块“内,所以对于第一级的PDE来说,这些页面都会集中在少数的几个PDE中,只需要为那几个映射到的PDE创建相应的二级页表(即PTE),而其他没有被映射到的PDE都不用创建对应的二级页表,这样,相对于一级页表的创建所有的页面映射,二级页表只创建相应的页面映射,虽然也会有所浪费,当相对来说还是节省了大量的内存空间。

二级页表分页过程:

二级页表分页过程比较简单,首先,PDE的入口地址存储在CR3寄存器中,读取CR3寄存器的高位(20位),低12位根据线性地址的高10位得到(由于32位系统中,地址占4字节,所以每一个页表占4字节,和数组是同理:int a[10]; a[1]的地址是a[0]+4而不是+1,所以2^10个页表需要12位地址)。

通过上述过程得到的PDE,取出存在PDE中的PTE的地址,将PTE的低12位清零,然后中间10位作为索引,得到相应的物理地址的基址,最后通过低12位相加,得到对应的物理地址。转换过程不涉及很难的地方,比较简单。

这里说一下CR3,CR3保存PDE的地址,所以在进程切换之后,只需要改变CR3中的值,就可以直接切换进程的地址空间,非常的方便。

而上面的PWT表示是否采用回写策略,若PWT置位,则表示采用通写策略,即写缓存数据的同时,必须写外存。PWT=0表示回写,即写缓存数据,不必改变外存,等到缓存页面被置换,在写外存。

PCD表示是否开启缓存页。PCD=1表示禁用缓存页。PCD=0,表示启用缓存页。这个主要是因为有些页面对应的I/O端口需要实时采集数据,不能缓存数据,因为缓存的数据和实时数据有差别,所以需要禁用缓存页。这个在嵌入式里面应该出现的比较多。

最后一点,这些过程为了保证快速性,全部都是由硬件完成的,而在CR3寄存器,PDE,PGE中存储的地址,都是物理地址,而不是相对应的虚拟地址。

版权声明:本文为博主原创文章,未经博主允许不得转载。

MIT6.828 虚拟地址转化为物理地址——二级分页的更多相关文章

  1. MIT6.828 JOS系统 lab2

    MIT6.828 LAB2:http://pdos.csail.mit.edu/6.828/2014/labs/lab2/ LAB2里面主要讲的是系统的分页过程,还有就是简单的虚拟地址到物理地址的过程 ...

  2. MIT6.828 Lab2 内存管理

    Lab2 0. 任务介绍 你将编写一个内存管理代码.主要分为两大部分.分别对物理内存和虚拟内存的管理. 对于物理内存,每次分配内存分配器会为你分配4096bytes.也称为一个页(在大部分操作系统中一 ...

  3. MIT6.828课程JOS在macOS下的环境配置

    本文将介绍如何在macOS下配置MIT6.828 JOS实验的环境. 写JOS之前,在网上搜寻JOS的开发环境,很多博客和文章都提到"不是32位linux就不好配置,会浪费大量时间在配置环境 ...

  4. Linux下如何在进程中获取虚拟地址对应的物理地址【转】

    转自:http://blog.csdn.net/kongkongkkk/article/details/74366200 如果让你编写一个程序,来获取虚拟地址对应的物理地址..你会试着操作MMU吗.. ...

  5. 【MIT6.828】centos7下使用Qemu搭建xv6运行环境

    title:[MIT6.828]centos7下使用Qemu搭建xv6运行环境 date: "2020-05-05" [MIT6.828]centos7下搭建xv6运行环境 1. ...

  6. MIT6.828准备:MacOS下搭建xv6和risc-v环境

    本文介绍在MacOS下搭建Mit6.828/6.S081 fall2019实验环境的详细过程,包括riscv工具链.qemu和xv6,对于Linux系统同样可以参考. 介绍 只有了解底层原理才能写好上 ...

  7. mit-6.828 Lab Tools

    Lab Tools 目录 Lab Tools 写在前面 GDB GNU GPL (通用公共许可证) QEMU ELF 可执行文件的格式 Verbose mode Makefile 写在前面 操作系统小 ...

  8. mit-6.828 Lab01:Booting a PC exercise1.1

    Lab01:Booting a PC 目录 Lab01:Booting a PC JOS BIOS 背景知识 8086的基本知识 GDB 常用调试指令 Real mode && Pro ...

  9. MIT6.828 Preemptive Multitasking(上)

    Lab4 Preemptive Multitasking(上) PartA : 多处理器支持和协作多任务 在实验的这部分中,我们首先拓展jos使其运行在多处理器系统上,然后实现jos内核一些系统功能调 ...

随机推荐

  1. Linux下更新瑞芯微固件

    有这样的需求,是因为提供的BSP中是在windows下烧写的系统.我直接在linux下开发,每次编译后代码都要在windows下烧写,是一个很麻烦的事情.为了解决这个问题我尝试着用VirtualBox ...

  2. 编写javascript的基本技巧

    第一.编写可维护的代码 什么叫着编写可维护的代码呢?就是当我的做出来的项目,拿给其它编码团队能很快的看懂 你编写的代码,你的整个项目的逻辑等等.一个项目的修改维护是要比开发一个项目的成本 是要高的.例 ...

  3. 在ASP.NET项目中使用CKEditor

    CKEditor是什么 CKEidtor是一个在线富文本编辑器,可以将让用户所见即所得的获得编辑在线文本,编辑器或自动将用户编辑的文字格式转换成html代码. 在ASP.NET工程中添加CKEdito ...

  4. (原)工具篇-利用fis压缩项目

    fis3 1.添加 fis-conf.js 到项目根目录中 fis-conf.js 内容如下 : //配置MD5版本控制 fis.match('*.{js,css,png,jpg}', { useHa ...

  5. aspx后台生成json对象

    json对象应用很广,有时,我们要把一些数据转化为json对象,就需要用到以下方法了. 1.使用Newtonsoft.Json.DLL (推荐使用) 下载地址:http://files.cnblogs ...

  6. 9会飞的li标签

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. Apache 日志配置,包含过滤配置

    最近排查支付宝交易成功后异步通知执行失败的原因,需要查看Apache的日志,发现之前一直没对日志进行设置,结果日志文件都1.5G多了,于是搜索了如何按天记录日志. 但公司的网站是通过阿里云的SLB分发 ...

  8. yum node.js

    很久之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源 ...

  9. Android 测试工具集01

    Appium是一个支持原生,混合和移动web apps的开源的跨平台测试框架工具. ANDROID依赖 Android SDK API >= 17 (Additional features re ...

  10. gridView行号的显示

    我们在进行开发的时候,很多地方希望dataGridview或girdView显示行号,这里我来说一下两种的实现方法 在girdView中很简单很好实现,我在这里写一下代码,具体其他功能可以看其带的DE ...