摘要: 强调申明一下以下所说内容都只是涉及到orange's该书的第六章的代码,并不是linux那些复杂的调度过程.下面不再作强调。。从全局来说(再次申明说的是orange's该书的第六章的代码),于渊是每增加一个进程就增加一个GDT和LDT,增加的GDT里面存放LDT的基址,LDT里面只有两个描述符,一个执行段描述符,一个数据段描述符。也即是说每个进程独显一个LDT表关于进程调度来说,最为重要的莫过于进程表,里面包纳了进程的所有内容,于渊提供的进程表,如下:typedef struct s_stackframe { /* proc_ptr points here ... 阅读全文
posted @ 2012-05-10 20:29 一维 阅读(606) 评论(0) 推荐(0) 编辑
摘要: 此图选自《linux内核完全注释》由上图可以看出,当特权级没有转换时,中断处理程序和被中断进程是同用一个堆栈,但是当发生了堆栈切换,例如一般中断进程都处于0特权级下,当3的特权级进程运行时,中断发生,那么处理器就要到TSS处找到0级的ss和esp,然后切换堆栈,然后处理器把被中断进程的ss,esp,EFLAGS,CS,EIP,压栈,如果有错误码的话,错误码将最后被压栈(iretd指令并不会自动弹出错误码。。。)这里要特别注意的是,由指令产生的中断(int)是要进行特权级检查的,这意味着只有进程的CPL<=门的DPL才能访问中断门,所以上述的从3特权级跳到0级的中断门只能是在硬件引发中断的 阅读全文
posted @ 2012-05-05 10:21 一维 阅读(908) 评论(0) 推荐(0) 编辑