内核极线程基础
内核级线程的切换
- 和用户级线程的比较
用户级线程是从一个栈到两个栈
而核心级线程是从一套栈到两套栈,因为核心级线程在用户态跑的时候用的是用户栈,当它进入内核之后,用的是内核栈,所以是一套一套的栈
用户级线程切换是TCB切,然后根据TCB切换用户栈
核心级线程切换是TCB切,然后根据TCB切换一套栈,用户栈切,内核栈也切
- 用户栈和内核栈的关联
进入内核就会用到内核栈,进入内核的为一方法就是中断
起先是在用户态中执行。在用户栈中折腾,一旦有了中断就会进入内核,启用内核栈,内核栈关联用户栈
所有中断(时钟,外设,INT指令)都能引起上述切换
中断(硬件)有一次帮助了操作系统
举例:
内核级线程的Create
首先进行简要的思路:创建线程要创建成能切换的样子,所以要有用户栈,有内核栈,有TCB,完成用户栈和内核栈的关联,完成TCB和内核栈的关联
如下图
首先申请一段内存作为TCB,再申请一段内存作为内核栈
然后把内核栈的东西初始化
怎么初始化?
可以申请一段用户态内存作为用户栈,然后把内核栈的指针置好就可以了
然后你想执行哪条指令,那个弹出地址你也已经读进来了,把这些写好,CS也修改下就好了,实际上CS是0f,然后TCB关联内核栈,等等这些都弄好
弄好之后,现在TCB的关联的esp指向下面的中断出口,
然后TCB入栈,TCB的状态已经就绪,一切都准备好了
一旦发生切换
TCB切,内核栈也切了