unix用户态和内核态

unix用户态和内核态

用户模式和内核模式有什么区别?为什么在两者之间切换时需要上下文切换?

答案1

我的回答与 Linux 有关,因为这是我所知道的,但它对于大多数(如果不是全部)版本的 Unix 来说应该同样正确。

用户模式是所有不属于内核的进程(又称“非内核进程”)运行的地方。在用户模式下,默认情况下,进程只能直接访问自己的内存。这是为了保护进程不受其他进程的影响,并试图防止一个进程中的错误导致另一个进程崩溃。它还有助于加强安全性,因为低权限进程无法直接访问以其他用户身份运行的进程的内存,而这些内存可能包含信用卡详细信息等机密数据。

但是,内核中的某些操作必须访问整个系统内存 - 例如,创建新进程。为此,需要内核模式,因为它可以访问任何物理上可访问的虚拟或物理地址。(出于这个答案的目的,我忽略了虚拟机管理程序,这会使情况稍微复杂一些。)

用户模式与内核模式切换可能需要上下文切换,但这只是因为长期存在的惯例,而不是因为它绝对必要。来源:http://en.wikipedia.org/wiki/Context_switch#User_and_kernel_mode_switching

答案2

假设 x86 架构:

用户模式:

  • 虚拟内存方案生效。在用户模式下,内存地址通过页表映射到物理地址。因此,当用户模式程序访问内存位置 0x0001000 中的内存时,它可能会通过虚拟内存机制重定向到完全不同的地址。这还控制对通过内存位置(如 RAM)访问的硬件的访问,例如 APIC 寄存器、视频 RAM 等。这就是为什么用户模式进程无法“突破其外壳”并更改其他程序所在的内存位置的原因。

  • I/O 特权机制生效。这会影响使用“I/O 端口”(与 TCP/IP 端口无关)的某些硬件,例如旧式 PIC 和 PIT 硬件、CMOS 内存等。用户模式只能访问“IOPL 位图”允许的 I/O 端口,不能禁用中断,也不能更改 IOPL。

  • 特权 CPU 指令执行时将导致异常。这包括设置页表和其他内容的指令。

内核模式:

  • 虚拟内存方案不起作用。当 CPU 读取内存时,它请求的地址就是它得到的地址。换句话说,它是“平面的”。

是的,内核模式下的进程完全有可能覆盖其他进程或内存中的代码,例如关键内核结构或设备驱动程序。

  • I/O特权机制不起作用。CPU可以不受限制地访问任何I/O端口,并为用户模式设置IOPL。

  • 所有特权指令均可执行,且不会引起异常。

需要“上下文切换”是因为每当 x86 CPU 运行程序时,除了可能用于变量和临时存储的 RAM 位置之外,该程序在特定时刻的许多当前状态都存在于其寄存器中。

因此,如果我们想让 CPU 突然跳转到其他地方,然后返回到之前所做的事情,就必须保存所有 CPU 寄存器,以便在跳转之前恢复它们。

答案3

内核负责管理系统资源(调度、内存管理、网络等)。内核在名为 ring 0 的受保护上下文中运行,以防止未经授权的用户对其进行修改。

应用程序在用户模式(ring 3)下运行,并在执行系统调用以从内核请求服务时切换上下文。

http://en.wikipedia.org/wiki/Ring_(computer_security)

http://en.wikipedia.org/wiki/Context_switch

相关内容