《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——3.3 轮转到进程1执行
3.3 轮转到进程1执行
在分析进程1如何开始执行之前,先回顾一下进程0创建进程1的过程。
在3.1.3节中讲解调用copy_process函数时曾强调过,当时为进程1设置的tss.eip就是进程0调用fork( )创建进程1时int 0x80中断导致的CPU硬件自动压栈的ss、esp、eflags、cs、eip中的EIP值,这个值指向的是int 0x80的下一行代码的位置,即if (__res >= 0)。
前面讲述的ljmp 通过CPU的任务门机制自动将进程1的TSS的值恢复给CPU,自然也将其中的tss.eip恢复给CPU。现在CPU中的EIP指向的就是fork中的if (__res >= 0)这一行,所以,进程1就要从这一行开始执行。
执行代码如下:
//代码路径:include/unistd.h:
#define _s