OS-多线程和多任务
线程管理和多任务
这是一个引用
为什么要用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的内存复制到新页表对应位置