一、 linux操作系统工作的基础
1. 存储程序计算机
按照冯·诺依曼存储程序的原理,计算机在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令,然后再取出下一条指令并执行,如此循环下去直到程序结束指令时才停止执行。linux操作系统就是以存储程序计算机的工作原理为基础去管理整个计算机以及整个计算机的执行工作流程。
2. 栈
进程是CPU执行的基本单位,每个进程都有自己独立的内存空间。当然我们这里要说的就是进程的用户态的栈空间以及8KB的内核栈,由于虚拟存储技术,每个进程都感觉自己享有完整的内存空间。 栈为我们的函数调用以及进程的切换等等提供了不可磨灭的作用。当我们进行函数调用的时,用户态的栈会保存我们的返回地址、相关寄存器、函数参数以及局部变量等等一些相关条件;当我们进行系统调用或者其它中断的时候,内核栈会同样为我们保存返回地址、相关寄存器等一些相关信息,可以说栈是我们系统的正常执行必不可少的条件。
3. 中断
中断是指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。中断技术的出现为多任务计算机提供了不可磨灭的作用,中断使得进程能够并发的去执行,大大提高了CPU的利用率。中断是多进程能够正常执行以及进程间的切换的必不可少的要素。
二、 内核是如何工作的
现代操作系统的工作状态分为用户态和内核态。程序以进程的方式起初工作在用户态:
1、当发生系统调用、进程调度、中断的时候,进程由用户态陷入内核态,此时操作系统将EIP、ESP压入内核栈,ESP指向内核栈栈顶,EIP指向中断处理程序的入口
2、SAVE_ALL:保存进程的各个寄存器值到该进程的内核栈中;
3、进入中断处理程序;
4、内核调用schedule()函数进行进程调度,进入要执行的next进程的内核栈;
5、Restore_all:回复现场,恢复next进程的寄存器值;
6、iret:恢复EIP、CS 以及 EFLAGS 寄存器;
7、系统从内核态返回到用户态。