今天做题目的时候遇到的问题,问的是Linux的内核态与用户态之间的通信方式,我直接懵逼了,虽然接触了Linux有段时间了,但是这么抽象的问题还没研究到。果断百度下,这哥们写的很通俗易懂,稍微懂点操作系统的都能看懂。
先上该博主的链接:http://blog.chinaunix.net/uid-1829236-id-3182279.html
我说下我的理解,如有不对的地方请各位批评指正。
我们的程序运行在CPU上时,是分不同的等级的,如果要高效的运行程序,就必须获得CPU的特权级,显然,笼统的说,内核态就是获得最高特权的程序,用户态就是获得最低特权的程序。那么用户态与内核态最大的差别就是权力不同,用户态的程序不能访问操作系统内核的数据结构。那么问题来了,当我们的程序需要操作系统帮助完成一些工作时,就需要从用户态切到内核态。
切换方法有三种:系统调用、异常、外设中断。
第一个是用户态主动调用系统函数,第二、三是被动方式,但三个方法的本质都是通过中断实现切换任务。
由用户态切换到内核态的步骤大致如下:
[1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。
[2] 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
[3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。