【windows操作系统】【CPU】⽤户模式和内核模式(⽤户层和
内核层)
所有的现代操作系统中,CPU是在两种不同的模式下运⾏的:
注意以下内容来⾃微软:
windows⽤户模式和内核模式
运⾏ Windows 的计算机中的处理器有两个不同模式:⽤户模式和内核模式。
⽤户模式和内核模式都是针对CPU运⾏状态来说的,在⽤户模式下,CPU⽆法执⾏⼀些特权指令,⽽在内核模式下是可以的。
根据处理器上运⾏的代码的类型,处理器在两个模式之间切换。应⽤程序在⽤户模式下运⾏,核⼼操作系统组件在内核模式下运⾏。虽然许多驱动程序以内核模式运⾏,但某些驱动程序可能以⽤户模式运⾏。
R3 ⽤户态所有api都通过ntdll调⽤到内核Api
上⾯所说的两种模式不仅仅是字⾯上的区别,它们是受CPU严格制约的。如果在⽤户模式下,程序尝试做
些其权限以外的事情,⽐如说,执⾏⼀条⾼权限的CPU指令,修改其被禁⽌访问的内存,这时⼀个可捕获的异常就会抛出。但这只会导致这个倒霉的应⽤程序崩溃,⽽不会让你的整个系统崩溃。这就是⽤户模式的意义所在。
x86 CPU提供4种: 0, 1, 2 and 3. 实际上,只⽤0级(内核)和3级(⽤户程序)被使⽤到了
⽤户模式
启动⽤户模式应⽤程序时,Windows 会为该应⽤程序创建进程。进程为应⽤程序提供专⽤的和专⽤的句柄表。由于应⽤程序的虚拟地址空间为专⽤空间,因此⼀个应⽤程序⽆法更改属于其他应⽤程序的数据。每个应⽤程序都隔离运⾏,如果⼀个应⽤程序发⽣故障,则故障仅局限于该应⽤程序。其他应⽤程序和操作系统不会受该故障的影响。
除了专⽤之外,⽤户模式应⽤程序的虚拟地址空间也受到限制。在⽤户模式下运⾏的处理器⽆法访问为操作系统保留的虚拟地址。限制⽤户模式应⽤程序的虚拟地址空间可防⽌应⽤程序更改以及可能损坏关键的操作系统数据。
内核模式
在内核模式下运⾏的所有代码都共享单个。这意味着内核模式驱动程序不会与其他驱动程序和操作系统
本⾝隔离。如果内核模式驱动程序意外写⼊错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到安全威胁。如果内核模式驱动程序发⽣故障,整个操作系统就会发⽣故障。
此图说明了⽤户模式组件与内核模式组件之间的通信。
以下是内核的层次划分:
1、硬件抽象层(HardwareAbstraction Layer) (HAL) (hal.dll)
最底层隔离硬件的,底层的第三⽅驱动程序就执⾏在这层。
2、内核(Kernel)
实现操作系统的⼀些底层服务。⽐⽅线程调度,多处理器的同步,中断/异常处理等。
3、运⾏体(Executive)()
实现主要的操作系统服务,⽐⽅主要的线程进程管理,内存管理, IO及进程间通讯等。
4、窗体图形⼦系统(Windows Graphics Subsystem)
由win32K.sys在内核层实现,⽤户界⾯相关都依赖该层,User32.dll的⼤部分功能都由该层实现
⽤户层关键进程
Windows系统在⽤户层有⼏个关键的系统进程:
<(session manager Subsystem)
关于Session的概念能够參考我的这篇。在操作系统启动时会创建⼀个不与不论什么Session关联的管理者实例。然后当实⽤户登录时它会为每⼀个Sessin拷贝⼀份与之关联的实例,然后由该关联的实例启动和
<
该进程管理⽤户的登录和注销,我们按Ctrl+Alt+Del出现的界⾯和登录后出现的桌⾯窗体都是由它启动的。
<( Client/Server Runtime Subsystem)
我们能够看到我们的桌⾯窗体(GetDesktopWindow)是由该进程创建的,该进程主要负责Win32⼦系统的⽤户模式部分(内核模式部分由
win32k.sys实现)。
<(Local Security Authority Subsystem)
<通过该进程验证⽤户登录,登录后产⽣安全訪问令牌对象。通过该令牌创建,我们其它⽤户进程都由启动。⽽且继承了该令牌权限。
<
该进程简称为SCM(NT Service Control Manager),该进程负责启动⽤户态⼀些特殊进程。也就是我们通常所说的服务程序。
3、⽤户模式调⽤内核模式的⽅式
4、内核模式调⽤⽤户模式
能够通过IOCTL的上下⽂传递,也能够通过APC (Asynchronous Procedure Call)直接调⽤。
5、进程间的通信
第⼆种很强⼤的⽤户模式与内核模式通讯⽅式,同⼀时候也⽀持进程间通讯,该⽅式就是ALPC(Advanced Local Procedure Call)。该⽅式被操作系统⼤量使⽤。 WinRT中的Broker进程也⽤到了它。
该⽅式实际上就4个核⼼函数:nt!NtAlpcSendWaitReceivePort,nt!NtAlpcCreatePort, nt!NtAlpcConnectPort, Nt!AplcAcceptConnectPort, ⼤概原理例如以下:
在多任务环境中,有许多进程都不允许应⽤程序去做。所以CPU以两种模式运⾏,即⽤户模式和内核模式。
①内核模式
当CPU运⾏于内核模式时,⼀切程序都可运⾏。任务可以执⾏特权级指令,对任何I/O设备有全部的访问权,还能够访问任何虚地址和控制虚拟内存硬件。这种模式对应80×86的ring0层,操作系统的核⼼部分,包括设备驱动程序都运⾏在该模式。
②⽤户模式
这个模式中,硬件防⽌特权指令的执⾏,并对内存和I/O空间的访问操作进⾏检查。这就允许WindowsNT4.0限制任务对各种I/O操作的访问,并捕捉违反系统完整性的任何⾏为。在⽤户模式中,运⾏的代码如果不通过操作系统中的某种门机制,就不能进⼊内核模式。在80×86处理器上,这个模式对应于 ring3层,操作系统的⽤户接⼝部分以及所有的⽤户应⽤程序都运⾏在该级别。
windows的⽤户栈和内核栈
server系统和普通系统的区别1、简介
普通的⼀个Win32线程有两个栈:⼀个是⽤户栈,另⼀个是内核栈;⽽如果是内核中创建的系统⼯作线程,则只有内核栈。只要代码在内核中运⾏,线程就⼀定是使⽤其内核栈的。栈的主要作⽤是维护函数调⽤帧,以及为局部变量提供空间。
在Windows⾥,⼀个线程的⽤户空间的信息都记录在了TEB中,⽽TEB中⼜有⼀个域叫做NtTib,这⾥⾯就存放着有关⽤户站的信息。由于TEB结构过于复杂,这⾥不列举。
⼀些需要注意的地⽅
⼀个线程⽤户栈可以指定其⼤⼩,默认是1MB,通过编译指令/stack可改设其他值。
⼀个线程普通内核栈的⼤⼩是固定的,由系统根据CPU架构⽽定,x86系统上为12KB,x64系统上为24KB,安腾系统上为32KB。对于GUI线程,普通内核栈空间可能不够,所以系统⼜定义了“⼤内核栈”概念,可以在需要的时候增长栈空间。只有GUI线程才能使⽤⼤内核栈,这也是系统规定的。
Windows将GDI和USER模块,即“窗⼝与图形模块”的实现移到了内核中,称为Windows⼦系统内核服务,并形成⼀个win32k.sys内核⽂件。⽽⽤户层仅留调⽤接⼝,由User32.dll和GDI32.dll两个⽂件暴露出来。判断⼀个线程是不是GUI线程的依据,竟⾮常的简单:线程初建时,都是普通线程,第⼀次调⽤
Windows⼦系统内核服务(只要⽤户程序调⽤了User32.dll和GDI32.dll中的函数,并导致相关内核服务在内核中被执⾏),系统即⽴刻将之转变为GUI线程,并从⽽切换到“⼤内核栈”;倘若⾄线程结束,并未有任何⼀个⼦系统内核服务被调⽤,那么它⼀直都是普通线程,⼀直使⽤普通内核栈。
⽤户模式切换到内核模式的情况

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。