第六章 进程总结

http://blog.csdn.net/begginghard/article/details/7389329

进程总结

挂起一个进程,需要把程序运行信息保存到进程控制块PCB中

进程恢复,运行程序时,需要用到该程序LDT中的段描述符,所以需要在PCB中有LDT描述符,LDT选择子,所以需要对PCB中的LDT描述符,LDT选择子作初始化.

进而需要在GDT中初始化该进程的LDT.

进程挂起或恢复过程中,需要用到三个堆栈:ring3级的程序堆栈,ring0级的PCB堆栈即REGS, 中断程序继续运行所需的ring0级的内核栈.所以需要用到TSS,需要初始化TSS.以及在GDT中初始化TSS描述符.

------------------------

所以总结如下:一个进程所涉及到的无非是:PCB,进程体,GDT,LDT,TSS

所以新建立一个进程时,需要新建一个该进程的PCB,加入到进程表中,并对该PCB进行初始化.同时修改GDT,LDT,TSS

----------------------

init_descriptor(&gdt[INDEX_LDT_FIRST],                                             参数1  INDEX_LDT_FIRST是LDT在GDT中索引为5,定义在protect.h中。见书236页

vir2phys(seg2phys(SELECTOR_KERNEL_DS),proc_table[0].ldts),           参数2   KERNEL_DS段基址+proc_table[0].ldts的偏移量得到进程ldt的基址

LDT_SIZE * sizeof(DESCRIPTOR),                                                       参数3   将进程ldt的基址放到gdt[index_ldt_first]处

DA_LDT                                                                                           参数4

);

初始化GDT中的LDT描述符

--------------------------------

http://www.cnblogs.com/wanghj-dz/archive/2011/05/20/2051641.html   这个我自己总结的还是很不错的。

http://www.cnblogs.com/wanghj-dz/archive/2011/05/19/2051173.html    restart()中的一些固定值需要了解,如 P_STACKTOP 指向进程PCB中regs的最尾端

--------------------------------------------------------------------------------------------------------------

只有调用进程运行在ring1,其他都运行在ring0。包括对进程PCB赋值初始化,中断处理,压入寄存器的值,挂起或恢复等等。

中断发生时,cpu会自动把cs ip,ss ,sp ,eflags压入堆栈,这个是系统自动完成的,不需要代码。

所以进程从ring1到ring0时,cpu已经压入了cs,ip,ss,sp到进程PCB的regs里了,到了retAdrr要跳过所以esp-4,然后再压入其他的。

补充一下:压入寄存器值,恢复寄存器值都是使用进程PCB中的regs堆栈。 压入之后,在中断处理程序中需要调用函数啊,就不能再使用进程的regs堆栈了,而是要跳到内核堆栈。

跳到内核堆栈后,才开始对中断的真正处理。

http://www.cnblogs.com/wanghj-dz/archive/2011/05/20/2052025.html

http://www.cnblogs.com/wanghj-dz/p/3986583.html

http://www.cnblogs.com/wanghj-dz/archive/2011/05/16/2047747.html

--------------------------------------------------------------------------------------------------------------

call之前的push 是调用函数的参数。

call之后的add,是将之前的push导致的esp恢复原位。

 

CLI禁止中断发生
STL允许中断发生

clock_int_msg 是个"^” 符号。

call  clock_handler   clock_handler函数调用里面,修改p_proc_ready,p_proc_ready自加1,将p_proc_ready所指向的地址赋值给TSS中的ESP,会导致TSS里面的ESP值改变,
; 中断返回时,根据TSS里面的ESP值恢复寄存器的值,就会导致进程切换

转载于:https://www.cnblogs.com/wanghj-dz/p/3991997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值