1.读取tr寄存器,访问(任务状态段)TSS
2.从TSS中的esp0获取内核栈顶指针
3.保存用户态上下文
esp寄存器是cpu栈指针,存放内核栈栈顶指针.
栈开始于末端,朝内存开始方向增长.
进程从用户态切到内核态,内核栈为空.
1.进程在进入内核态之前通过(任务状态段)TSS获得
内核栈栈顶指针.
Linux为每个cpu提供一个TSS段,保存于tr寄存器
2.进程在进入内核态时,通过TSS段中的esp0来
获取内核栈顶指针(从而保存用户态cs,esp,eip
等)上下文.
3.进程在进入内核态之后
进程从用户态到内核态切换过程中,Linux主要做的事:
1:读取tr寄存器,访问TSS段
2:从TSS段中的sp0获取进程内核栈的栈顶指针
3: 由控制单元在内核栈中保存当前eflags,cs,ss,eip,esp寄存器的值。
4:由SAVE_ALL保存其寄存器的值到内核栈
5:把内核代码选择符写入CS寄存器,内核栈指针写入ESP寄存器,把内核入口点的线性地址写入EIP寄存器