!!以下图片来自《Linux内核完全注释 修正版V3.0》以及互联网!!
内核态与用户态,是什么,为什么要做区分?涉及并解释以下概念
内核态、内核栈(内核堆栈)、内核地址空间
用户态、用户栈(用户堆栈)、用户地址空间
答案是:为了 *** 作系统能稳定、安全的运行。
在 CPU 的所有指令中,有些指令(比如清内存、设置时钟等)是非常危险的,如果错用,将导致系统崩溃。
如果允许所有的程序都可以使用这些指令,那么系统崩溃(比如死机)的概率将大大增加。
现代CPU,其设计目标主要是为了完美高效的实现一个多任务系统
多任务系统的三个核心特征是:权限分级、数据隔离和任务切换。
'''#以X86_64架构为例
权限分级通过CPU的多模式机制和分段机制实现;
数据隔离通过分页机制实现;
任务切换通过中断机制和任务机制(TR/TSS)实现。
'''
(Linux)所谓的内核态和用户态,本质是对CPU提供的功能的一层封装抽象。简单来说,将CPU 指令分为特权指令和非特权指令,内核态能使CPU运行所有指令,而用户态只能使CPU运行部分安全指令(非特权指令)。通过这种权限设置,能达到限制用户的不安全 *** 作,保障系统稳定运行的目的。
内核态与用户态,关进程什么事咩?
答案是:当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态
内核态和用户态的概念是Linux为了有效实现CPU的权限分级和数据隔离的目标而出现的
是通过组合CPU的分段机制+分页机制而形成的。
'''#以X86_64架构为例
在CPU处于保护模式下时(X86_64CPU有5种模式),CS为代码段寄存器,CPL代表特权级
若CPU.CS=系统代码段时(CS.CPL=0)为内核态,则此时通过CPU的指令有 *** 控全部寄存器的权限;
若CPU.CS=用户代码段时(CS.CPL=3)为用户态,则此时通过CPU的指令只有 *** 控部分寄存器的权限。
——————————————————————————————————————————————————————————————————————————————————
#CPU将特权等级分为4个级别:Ring0~Ring3。
#但Linux系统只使用了Ring0和Ring3两个运行级别(Windows系统也是一样的)。
'''
1、在内核状态下,进程运行在内核地址空间中,此时 CPU 可以执行任何指令。运行的代码也不受任何的限制,可以自由地访问任何有效地址,也可以直接进行端口的访问。
2、在用户状态下,进程运行在用户地址空间中,被执行的代码要受到 CPU 的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中 I/O 许可位图中规定的可访问端口进行直接访问。
内核堆、用户堆是什么?
内核栈的用途(用户栈同理)
当进程进入内核态时,内核栈将会存放系统调用的参数,同时内核栈会记录进程在内核中的调用链。
内核地址空间、用户地址空间是什么?
'''
对 32 位 *** 作系统而言,它的寻址空间为 4G(2的32次方),即一个进程能定位的最大地址空间为4G。
#最高的 1G 字节点(从虚拟地址 0xC0000000 到 0xFFFFFFFF)供内核使用,称为内核地址空间。
#较低的 3G 字节点(从虚拟地址 0x00000000 到 0xBFFFFFFF)供各个进程使用,称为地址用户空间。
'''
当进程在用户态运行时,CPU堆栈指针寄存器指向用户堆栈地址,被使用的是用户栈。当进程进入内核态时,CPU堆栈指针寄存器指向内核堆栈地址,被使用的是内核栈。当进程由于中断或系统调用从用户态转换到内核态时,进程所使用的栈也要从用户栈切换到内核栈。
内核态与用户态,怎么切换?所谓“一个进程主动跳进内核态”
是指该进程中的一个执行线程通过int(中断)或者syscall(系统调用)指令,使得当前线程的CS=系统代码段
运行于用户态的进程可以执行的 *** 作和访问的资源都会受到极大的限制
而运行在内核态的进程则可以执行任何 *** 作并且在资源的使用上没有限制
很多程序开始时运行于用户态,但在执行的过程中,一些 *** 作需要在内核权限下才能执行,这就涉及到一个从用户态切换到内核态的过程
用户态切换到内核态存在三种条件:
硬件中断:外围设备出现硬中断。系统调用:用户 *** 作需要内核权限。异常事件:cpu执行用户程序出现异常。处理器总处于以下状态中的一种
内核态,系统调用等引发,运行于进程上下文,内核代表进程运行于内核空间内核态,硬件中断等引发,运行于中断上下文,内核代表硬件运行于内核空间用户态,平常状况,运行于用户空间 还是得写点代码说一下!#这是个hello.c文件,现在我要在Linux中运行由它编译出的应用程序
void main(void){
int id=10086;
//以上代码是运行在用户态
printf("hello %d!",id);
//调用公用函数库中的printf()时,它会进一步调用系统接口,从而把信息显示到显示屏上
//而在步调用系统接口 *** 作硬件的过程中需要CPU更高的指令权限,因此其中会进入内核态一段时间
return ;
}
————————————————————————————————————————————
结束
总感觉差点意思!
有没有大佬有更好的说明呢?求讲解
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)