简介
早期内核使用intel提供的基于tss切换的机制,这种机制操作十分简单,但是执行速度特别慢,无法充分利用现代cpu的一些指令流水来优化速度。关于tss切换的方式详细可以看实验楼中的描述,和完全剖析这本书。根据老师的实验,要把这种基于tss切换的方式换成现代的基于内核栈切换的方式。
基于堆栈的切换,核心就是要先在切换前保存进程的栈,然后切换到另一个进程的栈,但因为在内核中,又有了其他的工作要做。
前提知识
因为要在内核中切换栈,所以要对ss esp ebp寄存器的作用很熟悉。ss用来寻找内核栈段,esp就是栈顶,而ebp寄存器则用来设置c函数中栈帧的位置。关于这点,可以看我的这篇文章,简单介绍了下其中esp ebp的作用。更详细可以看linux内核完全剖析这本书中关于c语言和汇编的互相调用,图文并茂,十分详细与精彩。
还有关于pcb(process control block)的知识也要了解一些,pcb是内核中描述进程的数据结构,里面就是进程的各种资源的记录,在这里即是task_struct数据结构。
还有最重要的一点是,当通过中断,完成从用户态到内核态的切换时,中断指令会自动把用户态的一些状态(ss esp eflags cs eip)压到内核栈,方便以后恢复到用户态。也就是在这里,将内核栈和用户栈关联了起来,完成了一套栈的设置,也就完成了基于内核栈进程切换的基础。
过程
以时钟中断,进程时

本文深入探讨了早期基于TSS切换机制的不足,以及如何转向基于内核栈切换的优化方案,详细解析了堆栈切换的过程,包括SS、ESP、EBP寄存器的作用,以及在时钟中断和fork系统调用中的具体实现。
最低0.47元/天 解锁文章
3000

被折叠的 条评论
为什么被折叠?



