操作系统的体系结构
计算机组成部分包括用户空间,linux内核(内核空间), 硬件部分, 用户空间通过 system call(系统调用) 与linux kernal通信.当有system call调用时,即发生用户态和内核态的转换.
概念
OS(操作系统)的资源是有限的,为了减少有限资源的访问和使用冲突,Linux对不同的操作赋予不同的执行等级.
用户态: 3级,只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
内核态:0级,cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。
内核态与用户态切换
所有的用户程序都运行在用户态,但是一些操作需要内核态来完成.例如从硬盘读取数据,从键盘获取输入等,这些都需要OS(操作系统)执行.
工作流程:
1. 用户态程序一些数据值放在寄存器中,或者使用参数创建一个Stack Frame(栈帧), 以表明需要OS(操作系统)提供的服务
2. 用户态执行system call(系统调用)
3. CPU切换到内核态,并跳到位于内存位置的指令,这些指令是操作系统的一部分,他们具有内存保护,不可被用户态程序访问等特性
4. 这些指令被称为trap(陷阱)或者system call handler(系统调用处理器). 他们会读取程序放入内存的数据值参数,并执行程序请求的服务.
5.system call调用执行完毕后,OS会重置CPU为用户态并返回调用结果.
三种切换方式:
1. 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过。其实系统调用本身就是中断,但是软件中断,跟硬中断不同。
2. 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
3. 外设中断:当外设完成用户的请求时,会向CPU发送中断信号。
对于JAVA语言:
str = "my string"// 用户空间
x = x + 2
file.write(str) // 切换到内核空间
y = x + 4// 切换回用户空间
文件的操作需要OS来完成, 当有文件的读写操作时, 会从用户态切换到内核态. 其他操作如open 、read、write 、close、fsync 这些系统调用等
在linux中,用户态和内核态的分层如图: