Linux-yyds
为什么要分用户空间和内核空间
我的脑子里一直有这样一个问题,为什么要区分内核空间和用户空间呢,本质上不都是两套代码吗,还要搞得这么麻烦,还有最主要的一个问题问题,内核空间和用户空间的区分在哪里,于是我带着这个问题去了解了一下,顺便记录下来。
优点
- 用户空间的崩溃不会造成内核空间的崩溃,每个进程之间都有自己特定的地址和数据空间,并且相互独立,提高系统运行的稳定性
- 统一接口,让用户不需要关注底层如何实现,只需要调度响应的api就可以使用。
内核空间与用户空间的数据交互
现在CPU内部往往采用了不同的操作模式,不同的模式有不同的权限以及功能,高层的程序通常不能访问低级程序的功能,所以要切换到低级模式。
以ARM处理器为例子,ARM体系结构是一种基于模式的体系结构。在引入安全扩展之前,它具有7种处理器模式,有六个特权模式和一个非特权用户模式。特权是执行用户(非特权)模式无法完成的某些任务的能力。在用户模式下,对影响整个系统配置的操作存在一些限制,例如,MMU的配置和缓存操作。
- 用户模式:大多是程序作用在用户模式,当处理器运行在用户模式下,许多资源是不能被访问的。
- 快速中断模式(fiq):高速数据传输与通道处理
- 外部中断模式(irq):用于通用的中断处理
- 管理模式:操作系统使用的保护模式
- 数据访问中止模式(abt):当数据或指令中止时进入该模式,用于虚拟存储以及数据保护
- 系统模式(sys):运行具有特权的操作系统任务,
- 未定义指令中止模式:如果出现了未定义的指令执行则进入该模式进行判断
工作模式
① 板子上电时,CPU处于SVC模式,它用的是SVC模式下的寄存器
② 程序运行时发生了中断,CPU进入IRQ模式,它用的IRQ模式下的寄存器
③ CPU处理完中断,它切换回SVC模式,继续使用SVC模式下的寄存器
④ CPU发生某种异常时,比如读取内存出错,它会进入ABT模式,使用ABT模式下的寄存器来处理错误。
在某种模式下,CPU执行时使用的是这种模式的资源,比如使用的是这组模式的寄存器。
这样就可以免去保存上一个模式所使用的寄存器。
内核空间和用户空间是用来区分程序的两种不同状态,他们使用不同的地址空间。Linux只能通过系统调用和硬件中断完成从用户空间到内核空间的控制跳转
两种空间的内存分配
在32位系统下,每一个进程都会有4G的虚拟空间,其中,3G的用户空间,1G的内存空间
用户空间: 用户空间用来存放命令行参数,环境变量,栈区堆区,共享库,bss区(未初始化的全局数据),data区(初始化的全局数据),代码区还有4k没使用的空间。
内核空间: 一个PCB进程控制块,其实就是一个超大的结构体task_struct,里面有进程pid,进程状态,虚拟地址空间信息的等等。