在创建进程时,操作系统会分别在内核空间和用户空间分配两段栈,即内核栈和用户栈,用来存储线程执行时需要保存的数据。
执行程序前,IP指向执行入口,esp指向栈指针,ebp指向栈基。这样看来,程序执行时,CPU面向的是线程,所以说线程是操作系统调度和执行的基本单位。一个进程至少有一个线程,第一个由进程创建,成为主线程,其余线程一般由主线程创建。
在程序执行过程中,像虚拟内存分配、文件才做、网络读写等功能,是由操作系统实现,然后暴露一个接口给用户调用,所以此时要从访问用户空间的用户态转换为可以访问内核空间的内核态,一般通过软中断实现。
从用户态转换为内核态,是通过中断实现的。发起中断后,操作系统会启动保护现场机制,保护用户态执行现场,一部分寄存器的值会通过硬件机制保存起来,另一部分通用寄存器的值会被压入内核栈中。内核态指令执行完毕后,会通过预先保存的信息,回到用户态执行现场,继续执行后面的指令。