Orange's 进程

       解释一个操作系统的实现/chapter6/r中代码。

       程序流程如下:

       1、把Loader中的GDT和esp挪到Kernel中,初始化IDTPTR

       2、初始化8259,初始化IDT,初始化GDT中的TSS和LDT两个描述符,以及初始化TSS

       3、初始化进程表,指定时钟中断处理程序,让8259可以接受中断,restart开始从ring0内核切换到ring1进程执行

       4、当发生时钟中断,或者Int 90时,由ring 1进程态切换到ring 0内核态,首先保存所有寄存器,启动进程调度函数,恢复被调度的进程的寄存器,从而由ring0内核态又回到了ring1新进程

       程序最重要的一个图如下:

       Orange's 进程_第1张图片

       进程切换几个关键问题,从ring1切换到ring0,触发的条件一个是时钟中断,一个是get_ticks,每次发生中断的时候,此时的堆栈是进程表的堆栈,由硬件自动把ss,esp,eflag,cs,ip压入tss制定的堆栈中,然后执行到中断处理程序时call save压入一个retaddr,接着save代码中压入其他的寄存器,这样就形成了表中的样子,然后切换到内核栈,执行中断处理程序,里面有进程调度程序,就是p_proc_ready指向不同的进程表,之后赋值给esp,此时堆栈又切换为进程表的堆栈,依次pop之后,iretd,切换到ring0,此时的堆栈是进程的堆栈。如果get_ticks切换到sys_call执行的时候发生时钟中断,因为k_reenter作为限制,所以不能执行restart,而是执行restart_reenter,注意此时压入的寄存器参数放在内核栈,没有发生特权级转换,iretd后还是接着sys_call执行,直到此段代码执行结束。

       系统调用就是采用中断的方式来切换特权级,ring1-->ring0,由ring0得到结果返回ring1。

       进程调度就是不断修改进程表堆栈的esp,然后Pop,并切换到进程开始执行。ring1-->ring0,ring0-->ring1。

       进程就是代码。

       进程表就是操作系统中所说的PCD。

       这里的进程只有运行和不运行两种状态。

你可能感兴趣的:(代码,操作系统,进程)