小言_互联网的博客

linux内核态用户态

510人阅读  评论(0)
  1. 概述

本文学习linux系统用户态和内核态相关知识,linux内核版本为3.10.79。

  1. 用户态和内核态定义

内核态: CPU可以访问内存所有资源, 包括外围设备. 可以进行处理器工作模式切换,程序的切换。

用户态: 只能受限的访问内存, 且不允许访问外围设备,不可以进行处理器模式切换。

  1. 为什么分用户态和内核态

CPU工作分为不同的工作模式或特权级别,例如,arm包含7种工作模式,除用户模式以外,都是特权模式,armv8包含4种异常级别EL0-EL3。每种工作模式或异常级别可以执行的指令不同,允许访问的硬件资源也不同,如果CPU不进行工作模式区分,都在一种模式下,那访问的资源都是相同的,那么运行的所有程序也可以访问任何的资源,这就容易产生访问资源冲突,使系统奔溃,也出现一些安全问题。如果一些程序运行在特权模式,可以访问所有资源,这些程序统一来管理资源,其它程序运行在非特权模式,访问资源时通过调用资源管理程序,那就可以避免冲突,限制一些程序的访问权限,保证整个系统的安全。

我们可以把运行在特权级别的程序成为内核程序,就行linux 内核一样,也可以称为内核态,CPU执行在内核态时,可以访问内存所有数据, 包括外围设备。运行在非特权级别的程序称为用户空间程序,也可以称为用户态。

用户空间的程序无法直接执行内核代码。它们不能直接调用内核空间中的函数,因为内核驻留在受保护的地址空间上。如果进程可以直接在内核的地址空间上读写的话,系统安全就会失去控制。

用户态程序想访问受保护的资源,必须先切换到内核态,也就是用户程序向内核发起请求,内核执行代码区访问资源。

 

  1. 用户态和内核态切换
      1. Armv7

Arm 中linux用户程序运行在用户模式(非特权模式),linux内核运行在特权模式(包含svc,abt,und,fiq,iqr,sys)。

首先,ARM开发板在刚上电或复位后都会首先进入SVC模式,此时、程序计数器R15-PC值会被赋为0x0000 0000;bootloader就是在此模式下,位于0x0000 0000的NOR FLASH或SRAM中装载的,因此、开机或重启后bootloader会被首先执行。接着,bootloader引导Linux内核,此时、Linux内核一样运行在ARM的SVC模式下;当内核启动完毕、准备进入用户态init进程时,内核将ARM的当前程序状态CPSR寄存器M[4:0]设置为10000、进而用户态程序只能运行在ARM的用户模式。

    由于ARM用户模式下对资源的访问受限,因此可以达到保护Linux操作系统内核的目的。

    需要强调的是:Linux内核态是从ARM的SVC模式下启动的,但在某些情况下如:硬件中断、程序异常(被动)等情况下进入ARM的其他特权模式,这时仍然可以进入内核态(因为就是可以操作内核了);同样,Linux用户态是从ARM用户模式启动的,但当进入ARM系统模式时仍然可以操作Linux用户态程序(进入用户态,如init进程的启动过程)。

即:Linux内核从ARM的SVC模式下启动,但内核态不仅仅指ARM的SVC模式(还包括可以访问内核空间的所有ARM模式);Linux用户程序从ARM的用户模式启动,但用户态不仅仅指ARM的用户模式,就是非用户模式下也可以执行应用程序,但一般不这样做。这一点不进行明确关注。

      1. Armv8

Armv8中linux用户程序运行在EL0级别,linux内核EL1级别。

      1. 切换

触发方式包括三种:

系统调用:用户程序通过系统调用进入内核程序,使用内核提供的服务。实际上是在库函数中执行中断指令,如armv7:swi指令,armv8 svc指令,cpu响应中断,跳转到中断向量表执行内核代码。

中断:这里中断是指硬件中断,如gpio等,如果当前CPU在执行用户程序,中断产生后,CPU会暂停当前程序执行,跳转到内核中断处理程序。

异常:如果当前CPU在执行用户程序,发生了不可预知错误,如指令未定义,除数为0,指针为空,会发生abort,undefined等,CPU跳转到内核中断处理程序。


转载:https://blog.csdn.net/qq_45683435/article/details/101385352
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场