线程管理和多任务

这是一个引用

为什么要用TTS

几乎所有x86的现代操作系统都不使用 CPU 给的那一套,但必须要用TSS实现向更高特权级的跳转。

Linux只创建了一个TSS,所有任务共享。

  • 结论:我们使用TTS的唯一理由是为 0 特权级的任务提供栈

向高特权级转移

  • 的过程
    • 进入高特权级时,cpu自动将TSS中esp0作为栈指针,然后后来的压栈等操作由操作系统提供。
  • 的几种方式
    • 在用户模式下发生中断,cpu从当前TSS的SS0和esp0中获取用于异常处理的栈

向低特权级转移

CPU不允许从高特权级向低特权级转移,除非通过 调用门(不会用的)或者中断门。

书中采用的方法是 iretd 通过pop操作将栈中的数据弹出到栈中。而通过这种方式修改CS寄存器中RPL的值便可以实现向低特权级的转移。

  • 总结:将栈中对应的CS选择子的RPL位置的值修改为3,然后执行 iretd 指令。CS.RPL就是CPU的CPL

最后,还要将IOPL置0,不允许用户操作IO

不同特权级的进程

进程与线程的区别是进程有独立的地址空间,指每个进程都有自己的pde和pte

  • 更新页表 将内核高1GB的内存复制到新页表对应位置