当前位置: 首页 > Linux

内核态和用户态

时间:2023-04-06 22:18:34 Linux

内核态和用户态1概念Linux的设计哲学之一就是给不同的操作分配不同的执行级别,也就是所谓的权限的概念,也就是一些特别关键的操作相关对系统而言,必须由最高特权的程序来完成。IntelX86架构的CPU提供了从0到3的四个特权级,数字越小,特权越高。在Linux操作系统中,主要使用0和3两种权限级别,分别对应内核态和用户态(UserMode)。内核模式:CPU可以访问内存中的所有数据,包括外围设备(硬盘、网卡),CPU也可以自己从一个程序切换到另一个程序;用户态:只能有限访问内存,不允许访问外围设备,剥夺占用CPU的能力,CPU资源可以被其他程序获取;当Linux中的任何用户进程被创建时,它包含2个堆栈:内核堆栈和用户堆栈,它们是进程私有的并从用户模式运行。内核态和用户态分别对应内核空间和用户空间。内核代码和数据存放在内核空间,用户程序的代码和数据存放在进程的用户空间。不管是内核空间还是用户空间,都是虚拟空间。2Kernelspace相关内核空间:存放内核代码和数据,在虚拟空间中;内核态:当一个进程执行系统调用,进入内核代码执行时,称该进程处于内核态,此时CPU处于最高特权级0,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈;CPU栈指针寄存器指向:内核栈地址;内核栈:进程在内核态使用的栈存在于内核空间;内核态进程的权限:当内核态进程占用CPU时,可以访问内存中的所有数据和所有外设,如硬盘、网卡等;3Userspace相关用户空间:用户程序的代码和数据存放在虚拟空间;用户态:当进程正在执行用户自己的代码(非系统调用等函数)时,称其处于用户态,CPU运行在最低权限的3级用户代码,当用户程序正在执行中突然被中断程序打断,此时用户程序也可以象征性地称为进程的内核态,因为中断处理程序会使用当前进程CPU的内核栈;CPU栈指针寄存器指向:用户栈地址;用户栈:进程处于用户态时使用的栈,存在于用户空间;用户态进程的权限:用户态进程在占用CPU时,只能访问有限的内存,不允许访问外设。这里说的有限内存其实就是用户空间,使用用户栈;4.内核态和用户态的切换(1)系统调用所有的用户程序都是运行在用户态的,但是有时候程序确实需要做一些内核态的事情,比如从硬盘读取数据。唯一能做这些事情的只有操作系统,所以这个时候程序需要先请求操作系统以程序的名义执行这些操作。这时候就需要一种机制:用户态程序切换到内核态,但是无法控制内核态下执行的指令。这种机制称为系统调用,它在CPU中的实现称为陷阱指令(TrapInstruction)。(2)异常事件当CPU正在执行一个运行在用户态的程序时,突然出现一些意想不到的异常事件。这时候从用户态执行的进程到内核态就会触发执行相关的异常事件。Typical发生页面错误异常。(3)外围设备中断当外围设备完成用户请求的操作后,会向CPU发出中断信号。这时CPU会暂停执行下一条要执行的指令,然后执行中断信号对应的处理程序,如果之前执行的指令是在用户态,那么自然会发生从用户态到内核态的转换。注意:系统调用的本质其实就是中断。与外围设备的硬中断相比,这种中断称为软中断。这是操作系统专门对用户开放的中断,比如linux的int80h中断。因此,从触发方式和效果来看,这三种切换方式是完全一样的,都相当于执行一个中断响应过程。但是从触发对象来看,系统调用是进程主动请求切换,而异常和硬中断是被动的。