什么是用户态?什么是内核态?如何区分?

简介:

本知识点来自网易云课堂的上课笔记,linux内核分析----中国科学技术大学软件学院:孟宁

 一般现代CPU都有几种不同的指令执行级别。

在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态。

而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动。

举例:

intel x86 CPU有四种不同的执行级别0-3,linux只使用了其中的0级和3级分别来表示内核态和用户态。

   

        我想说,对于这个知识我问过我们学校的大牛廖建文老师有关进程问题fork的时候,他跟我说过内核0级环的概念,其实也就是处于内核态。大笑大笑用上面这幅图可以表示出来。

如何区分用户态和内核态?

CS寄存器的最低两位表明了当前代码的特权级。

CPU每条指令的读取都是通过CS:eip这两个寄存器:

其中cs是代码段选择寄存器,eip是偏移量寄存器。

上述判断由硬件完成。

一般来说在linux中,地址空间是一个显著的标志:0xc0000000以上的地址空间只能在内核态下访问,

0x00000000-0xbfffffff的地址空间在两种状态下都可以访问。

注意:这里所说的地址空间是逻辑地址而不是物理地址。


其实孟宁老师在讲解内核知识点已经把这个知识点最精华的部分提取出来了,那么到底内核中有什么样的接口是跟老师说的相关的呢?

其实写过linux内核驱动程序的同学应该就知道,实现一个字符设备驱动,在write方法和read方法中,内核态和用户态之间的桥梁就是copy_to_user和copy_form_user这两个接口,因为孟老师说了在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态,而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动。其实正好说明了这个问题,程序员或者软件应用工程师在编写应用程序去控制设备驱动的时候,首先肯定是会打开相应的文件描述符,然后对相应的文件描述符进行读写,ioctl,lseek之类的操作。当在应用层编写程序即是属于用户态,在应用程序不能访问任意的硬件物理地址,所以当用户需要读取文件描述符的内的内容时,就需要调用read,当用户需要写数据进文件描述符时,就需要用write,在用户态调用这两个接口,进而就会进行系统调用,产生相应的系统调用号,然后内核会根据系统调用号找到相应的驱动程序,此时系统就处在内核态中,在驱动程序中,首先进行驱动程序初始化,然后注册,产生驱动程序最重要主设备号和次设备号。初始化的过程中由于对相应的read方法和wirte方法进行初始化,故用户态执行read操作,就会进而使CPU产生异常,然后进入内核态找到相应的read,write当然也是一样的。

就如同下面这张图:


当然,我的分析依然还是处于非常片面的,只能说个大概,因为操作系统在执行系统调用的过程依然是非常复杂的,但是复杂归复杂,对于这样的一个流程我们还是应当要去了解清楚。

还有一个例子就是,假设我需要实现一个led驱动或者其它的驱动,在内核驱动中,我需要将相应的物理地址ioremap成为一个虚拟地址,当驱动调用结束后,还应当取消相应的地址映射,这其实就是在内核态进行的操作,因为在内核中,访问这些地址以虚拟地址的形式进行相应的内存分配。为了使软件访问I/O内存,必须为设备分配虚拟地址.这就是ioremap的工作。

  还有一个例子就是在用户态进行mmap操作。Linux中的内核空间到用户空间的地址映射让用户层应用可以直接访问内核地址,这就是mmap方法。

  关于这方面的知识,本人也是非常感兴趣,当然完成的对这个过程进行剖析,还需要剖析进程的创建,然后进程的调度一系列的问题,还有一个离不开的内存管理,有了内存管理那就一定存在MMU,一定需要页表的映射等等。往后若有总结,我会将知识点分享出来!大笑


目录
相关文章
|
3月前
|
Linux
Linux进程与线程的内核实现
task_struct称为进程描述符结构,该结构定义在文件中。进程描述符中包含一个具体进程的所有信息 进程描述符中包含的数据能完整地描述一个正在执行的程序:它打开的文件,进程的地址空间,挂起的信号,进程的状态等
37 0
Linux进程与线程的内核实现
|
3月前
|
算法 Unix Linux
进程原理及系统调用
进程原理及系统调用
|
4月前
|
存储 安全 数据中心
系统调用与用户态陷入内核态
我们都知道操作系统中运行着很多的进程,如果普通的进程可以直接操作硬件那么这个系统的安全性没办法保障,所以操作系统分出了两种状态,一种状态是运行的代码可以操作硬件;一种状态不能操作硬件,只能切换到第一种状态去操作后再切换回来,这就是内核态和用户态。
|
10月前
|
调度 数据安全/隐私保护
用户态和内核态 中断处理机制
用户态和内核态 中断处理机制
215 0
|
5月前
|
网络协议 Ubuntu C语言
2.4.1 用户态协议栈设计实现
网卡工作在网络协议栈的哪一层? 网卡是硬件,不在这些协议内容中。
40 0
|
6月前
|
安全 Linux C++
操作系统:用户态与内核态
操作系统:用户态与内核态
|
9月前
|
算法 Linux 调度
进程原理及其系统调用(上)
进程原理及其系统调用
90 0
|
9月前
|
Unix Linux
进程原理及其系统调用(下)
进程原理及其系统调用
56 0
|
存储 消息中间件 算法
操作系统学习笔记_2 中断和系统调用;进程和线程
学习自计算机科学单本&b站王道课程。
118 0
操作系统学习笔记_2 中断和系统调用;进程和线程
|
调度 索引
2.1.1操作系统(进程定义,组成,组织方式,特征,进程状态与转换,进程控制,原语)
进程 1.进程的定义 2.进程的组成 3.组织方式 1.链接方式​ 2.索引方式 4.进程的特征 5.进程的状态 6.进程状态的转换 7.进程控制 1.什么是进程控制 2.如何实现进程控制 3.进程控制相关的原语
2.1.1操作系统(进程定义,组成,组织方式,特征,进程状态与转换,进程控制,原语)

相关实验场景

更多