<自已动手写操作系统>进程实现

     进程也许是计算机科学史上最成功的人造概念之一,以前看其它的操作系统书时,也总是浓墨重彩,但遗憾的是,除了留一下点印象,始终无法形成形象思维,究其原因,通常上来就是抽象概念定义,接着是锁,信号量之类的,基本的都没有理解,后面的基本上也是扯蛋了。本书这一章的亮点是不空谈理论,先引导读者稍微思考一下本质问题,再马上进入实战。

     我们的程序以文件的形式存储在磁盘上,本质上就是一堆二进制编码,究竞要怎么样才能在计算机上运行?从计算机的角度来说,必须首先把程序加载到内存,并设置好相应的寄存器值,其中包括代码段,数据段,堆栈段。我们怎样知道这一块二进制编码那些是数据那些是代码呢,当然得按一定的格式来,在windows下使用的格式叫PE,在linux下叫做ELF格式。当然事情还远不至这么简单,如果程序跑起来了,如果切换到另一个程序,我们必须完整地保存当前进程的所有状态,并在必要切换回当前进程时还原进程的信息。通常是是有个专用的数据结构来做这个事情,叫做进程控制块。通过以上的简单描述,我们可以发现在一个真实的操作系统中至少需要以下组件分工合作才能使进程工作:

     1)进程体  包括代码,数据,堆栈

     1)加载器 负责加载程序到内存

     3)进程调度 

     4)其它硬件支持

在本书中,做了相当的简化,直接在内核中以一段简单的代码为例,省去了加载,链接等过程,结合本书来看看让进程起来需要那些步骤.

     1.准备进程体, 本书就是一段简单的显示"A"的代码

     2.初始化TSS和LDT的描述符(在GDT中),初始化TSS

     3.初始化进程表,主要包括各寄存器值(CS:EIP指向先前的进程体),LDT Selector,LDT

     4.一段跳转代码,主要作用是把堆栈为当前进程表的地址,从中恢复开始设置各种寄存器值,加载ldt,设置tss,最后调用ireted

指令切换到进程中

    

进程调度

     进程调度主要是利用时钟中断,其简单的实现步骤如下:

     1)保存当前进程状态信息至进程表

     2)切换至内核栈

     3)调用进程调度程序

     4)离开内核栈

     5)恢复调度的进程信息

     6)执行ireted指令,调度的进程开始运行.

系统调用

     系统调用的实现跟现在linux的系统调用类似

    

原文地址:https://www.cnblogs.com/jjyjjyjjy/p/2027229.html