分页的第一步要准备好一个页表,我们的页表是什么样子呢?现在我们要设计一个页表啦。

设计页表其实就是设计内存布局,不过在规划内存布局之前,我们需要了解用户进程与操作系统之间的关系。

前面讲保护模式时,我们知道,为了计算机安全,用户进程必须运行在低特权级,当用户进程需要访问硬件相关的资源时,需要向操作系统申请,由操作系统去做,之后将结果返回给用户进程。进程可以有无限多个,而操作系统只有一个,所以,操作系统必须“共享”给所有用户进程。它们的关系见图:

上图不仅展示了用户进程共享操作系统的逻辑依赖关系,还用插槽展示了它们的配合关系,用户进程要想完成某件工作,需要与操作系统结合在一起才行,那用户进程和操作系统它们是什么关系呢?

要完成一件事,用户进程做的事情只能算个半成品,您可以理解成:用户的代码加上所需要的操作系统中的部分代码才算完整的程序,为什么说是操作系统中的部分代码呢?原因很简单,因为操作系统严格来说是一套功能的集合,用户进程所需要的部分可能仅仅是其中的一小小部分,并不是所有功能都会用到。用户进程能用哪些功能,是由操作系统决定的,不是用户想用什么就用什么,而是操作系统提供什么它就用什么。完整的程序概念见图:

它和操作系统需要共同配合才能完成一件事,它们的关系有如服务提供商和客户的关系。服务提供商提供一些服务,客户只能用这些服务,也就是说客户依赖于服务提供商提供的服务项目,是服务提供商主导客户。比如咱们在网上买东西,咱们只需要挑选好商品后写好地址,然后下订单就成了。这事完了吗?必须没有,得拿到商品才算完事。所以,之后的事情就交给电商了,他们为你从库中挑选商品,然后用物流送到您家,这才拿到了商品,到此才算完事了。

以上购物的例子就是典型的用户程序和操作系统的关系,咱们挑商品下单这件事就相当于进程,而网上的电商才是充当了操作系统的角色,根据买家的需求找到所需要的资源,然后通过物流,将商品(结果)返回。

上述所说的用户进程和操作系统的关系,都是基于用户进程共享操作系统。我们设计的页表也要满足这个基本要求:共享。

如何在页表中实现共享呢?这个简单,只要操作系统属于用户进程的虚拟地址空间就好了。

说起来简单,这该怎么做呢?我们可以把4GB虚拟地址空间分成两部分,一部分专门划给操作系统,另一部分就归用户进程使用。比如我们之前都听说过,操作系统在4GB内存的高地址,用户进程在4GB内存的低地址。比如linux,它就运行在虚拟地址的3GB以上,其它用户进程都运行在3GB以下。

页表的设计是要根据内存分布情况来决定的,我们也学习linux的作法,在用户进程4GB虚拟地址空间的高3GB以上的部分划分给操作系统,0~3GB是用户进程自己的虚拟空间。为了实现共享操作系统,让所有用户进程3GB~4GB的虚拟地址空间都指向同一个操作系统,也就是所有进程的虚拟地址3GB~4GB本质上都是指向的同一片物理页地址,这片物理页上是操作系统的实体代码。实现起来也比较容易,只要保证所有用户进程虚拟地址空间3GB~4GB对应的页表项中所记录的物理页地址是相同的就行啦。哈哈,这句话确实有点长,我自己也反复断句了几次,不过这个在加载用户进程时咱们再细说,在此我们只需要完成内存空间划分就行了。

以上我们讨论的结果是:虚拟地址空间的0~3GB是用户进程,3GB~4GB是操作系统。

本节内容摘自《操作系统真象还原》

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

  1. 一步步编写操作系统 35 内存为何要分页

    一直以来我们都直接在内存分段机制下工作,目前未出问题看似良好,的确目前咱们的应用过于简单了,就一个loader在跑,能出什么问题呢.可是想像一下,当我们物理内存不足时会怎么办呢?比如系统里的应用程序过 ...

  2. 一步步编写操作系统 11 实模式下程序分段的原因

    cpu中本来是没有实模式这一称呼的,是因为有了保护模式后,为了将老的模式区别开来,所以称老的模式为实模式.这情况就像所有同学坐在同一个教室里,本来没有老同学这一概念,但某天老师领着一个陌生人进入教室并 ...

  3. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  4. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  5. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

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

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

  7. 一步步编写操作系统 25 cpu的保护模式

    在保护模式下,我们将见到很多在实模式下没有的新概念,很多都是cpu硬件原生提供,并且要求的东西,也就是说按照cpu的设计,必须有这些东西cpu才能运行.咱们只要了解它们是什么并且怎么用就行了,不用深入 ...

  8. 一步步编写操作系统 59 cpu的IO特权级1

    在保护模式下,处理器中的"阶级"不仅体现在数据和代码的访问,还体现在指令中. 一方面将指令分级的原因是,有些指令的执行对计算机有着严重的影响,它们只有在0特权级下被执行,因此被称为 ...

  9. 一步步编写操作系统 18 操作显卡,显存,显示器 下

    接上回,大家看下显卡各种模式的内存分布. 各外部设备都是通过软件指令的形式与上层接口通信的,显卡(显示适配器)也不例外,所以它也有自己的bios.位置是0xC0000到0xC7FFF.显卡支持三种模式 ...

最新文章

  1. 脉冲神经网络(SNN)概述
  2. 文档工具GitBook使用
  3. 第一章 Oracle 11g 数据库——在Windows 上安装部署
  4. 【Tools】TortoiseGit安装图解
  5. SAP Spartacus User form通过label标签的实现原理
  6. 直博5年!叹我年少轻狂!头4年一篇1作SCI也没有...
  7. python接口自动化(五)--接口测试用例和接口测试报告模板(详解)
  8. 禁用select下拉方法
  9. Linux花生壳使用篇
  10. python通过身份证或出生日期获取年龄
  11. Python——词频统计
  12. HTML页面在iPhone中电话号码自动检测带来的布局问题
  13. 回忆我的过去一年2020年考研以及研究生规划
  14. php txt投票功能,php查询操作实现投票功能
  15. 井口综合安检-解决方案
  16. win10无法打开设置,桌面右键显示设置提示ms-settings:display 该文件没有与之关联的程序来执行该操作
  17. 以地理国情调查任务为基础的地图矢量化流程研究
  18. Andrej Karpathy读博建议和写论文的方法
  19. empty 和 isset 的区别
  20. word图文混排复制到FCKEditor图片不显示

热门文章

  1. Java学习之SpringBoot整合SSM Demo
  2. OpenGL ES 纹理设置
  3. 有关软件工程的问题的分析和讨论及课后的作业3
  4. 文件夹没有安全选项-文件上传下载-路径访问被拒绝
  5. 【转】C++ GetLastError() 返回值对应表
  6. set row count
  7. [Bugku][Web][CTF] 30-33 write up
  8. java 数据库连接池 开源_开源自己开发的一个JAVA数据库连接池,效果还算可以。...
  9. mysql数据库的各种锁_关于MySQL各类锁的总结
  10. linux重启mysql一直_LINUX重启MYSQL的命令