3.11内核级线程的切换

时间:2024-03-30 11:51:15
date comments categories tags permalink title
2020/2/24
true
操作系统
操作系统
线程
3.11
内核级线程的切换

之前看哈工大李治军老师的操作系统教程,感觉难度太大,就想放弃了,但是想了想,不能因为难了一点就想放弃。应该 迎难而上才对,操作系统学习 继续进行!!!

用户级线程切换到内核栈线程。 其实就是切换TCB,切换对应的栈,如下图所示
3.11内核级线程的切换
当用户级线程需要向内核申请资源的时候,是通过中断实现的,所有的中断都会引起,用户栈到内核栈的切换,
这是把用户栈的SSSP先压栈,然后压入EFLAGS,还要压入用户线程的CSIP。

下图中的例子
3.11内核级线程的切换

1、当A在执行时候,CS:IP执行到B函数,会把B的下一步地址(B执行完返回的地址)104压入用户栈
2、然后开始执行B函数代码,
3、在B函数中遇到read方法,把read的下一条指令地址204(read执行完返回的地址)压入用户栈,
4、read方法执行,引起0x80中断,
5、此时,切换到内核栈(内核TCB),把用户栈的SSSP压栈,再压入EFLAGS,再压入0x80中断(相当于一个函数调用)返回后的地址(304)
6、程序继续向下执行,即CSIP继续往下走直到call sys_read,也就是1000的位置(ip=1000)
7、跳转到2000位置执行sys_read(读磁盘),此时cpu不会停下,就去执行其他内核线程,如下图所示

3.11内核级线程的切换

8、此时通过switch_to(cur,next)找到下一个内核线程(TCB),切换内核线程, 9、新的内核线程切换到自己的用户线程

总结(不知道对不对,错的话后面再改):用户线程A通过中断进入内核,切换到内核线程A1(切换对应的栈),此时内核栈关联了用户栈的sssp,以便以后可以切换回来。
内核线程A1阻塞后,切换TCB,从而切换到另外一个内核线程B1(切换到另外一个内核栈),B1执行一段后返回B1对应的用户线程B(同时切换用户栈)。