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

本知识点来自网易云课堂的上课笔记,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,一定需要页表的映射等等。往后若有总结,我会将知识点分享出来!

时间: 2024-09-29 08:00:17

什么是用户态?什么是内核态?如何区分?的相关文章

基础:内核态和用户态的区别

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态).此时处理器处于特权级最高的(0级)内核代码中执行.当进程处于内核态时,执行的内核代码会使用当前进程的内核栈.每个进程都有自己的内核栈.当进程在执行用户自己的代码时,则称其处于用户运行态(用户态).即此时处理器在特权级最低的(3级)用户代码中运行.当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态.因为中断处理程序将使用当前进程的内核栈.这与处于内核态的进程的状

用户态和内核态

(1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序--->用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 (2)为什么需要用户态和内核态? --->由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用户态 和 内核态 (3)用

Linux用户态和内核态

转载 - Linux用户态和内核态 作者 digoal 日期 2016-11-20 标签 Linux , 内核态 , 用户态 背景 原文 http://longmans1985.blog.163.com/blog/static/7060547520109262178736/ 原文 1. 用户态和内核态的概念区别 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个

多线程之:用户态和内核态的区别

一:大话版用户态和内核态 (1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序--->用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 (2)为什么需要用户态和内核态? --->由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用

Linux内核态抢占机制分析

本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件);何时触发重新调度(何时设置可抢占条件);抢占发生的时机(何时检查可抢占的条件);什么时候不能抢占内核.最后分析了2.6kernel中如何支持抢占内核. 1. 非抢占式和可抢占式

用户态与内核态通信-netlink处理大数据在用户空间和用户态的通信问题时间问题?

问题描述 netlink处理大数据在用户空间和用户态的通信问题时间问题? 在中断处理函数中进行网络报文的读取,然后通过netlink机制上传到用户态,进行报文分析.要求真个netlink上传数据,到数据处理完成,不超过250us,通过测试时间为2mn,左右 请问谁知道netlink用户态和内核通信时间大概多久? 解决方案 linux用户态与内核态通信netlink

内核态文件操作【转】

转自:http://blog.csdn.net/yf210yf/article/details/8997007 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主 要有: filp_open() filp_close(), vfs_read() vfs_write(),set_fs(),get_fs()等,这些函数在linux/fs.h和asm/uaccess.h头文件中声明.下

通过call_usermodehelper()在内核态执行用户程序【转】

转自:http://edsionte.com/techblog/archives/category/linux%E5%86%85%E6%A0%B8%E7%BC%96%E7%A8%8B 背景 如何在Linux内核中执行某些用户态程序或系统命令?在用户态中,可以通过execve()实现:在内核态,则可以通过call_usermodehelpere()实现该功能.如果您查阅了call_usermodehelper()内核函数的源码实现,就可以发现该函数最终会执行do_execve().而execve系

gdbserver-linux内核态调试手段问题

问题描述 linux内核态调试手段问题 3C 各位大神,我最近在研究内核调试这一块儿,有诸多疑问,望解答.本人调试的linux内核为运行在Freescale imx53开发板的andorid内核,android4.3.2,linux2.6.35.ubuntu版本为14.04.欲在Ubuntu上搭建一个针对配套的内核调试环境,以实现单步.断点等调试.这几天在网上搜索资料,推荐的内核调试的比较实用的方法有gdb与gdbserver,kgdb,但有诸多疑问,尚未成功.1)gdb与gdbserver这个