原文地址:https://blog.csdn.net/morixinguan/article/details/50775417

一般现代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,一定需要页表的映射等等。往后若有总结,我会将知识点分享出来!

什么是用户态?什么是内核态?如何区分?相关推荐

  1. 理解用户态切换到内核态——内核态下有一个特殊的进程

    现在想想,从用户态进入到内核态,相当于一次进程切换--这就好像内核态下有一个特殊的进程. 我就把进入内核态后,理解为进入了一个特殊的进程,一切都忽然合理了,恍然大悟--所以所有用户态的task(称之为 ...

  2. 计算机基础理论知识梳理篇(二):目态(用户态)、管态(内核态)

    目态与管态 多数计算机系统将CPU执行状态分为目态(用户态)与管态(内核态),CPU的状态属于程序状态字PSW的一位,CPU交替执行操作系统程序和用户程序. 1. CPU设计中的目态.管态 目态指非特 ...

  3. Linux 一个进程如何从用户态切换到内核态运行

    首先我们先理解用户态和内核态的概念 用户态:当一个进程调用库函数时就会进入用户态或者自己写的代码都是运行在用户态,使用的地址都是用的用户态中的地址 内核态:当要完成系统核心功能时要运行的状态 一个进程 ...

  4. 用户态和内核态:用户态线程和内核态线程有什么区别?

    转载 文章来源于 拉钩教育 重学操作系统 林䭽 用户态和内核态:用户态线程和内核态线程有什么区别? 什么是用户态和内核态 Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有 ...

  5. linux 切换用户_Linux 用户态切换到内核态的 3 种方式

    系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如 fork() 实际上就是执行了一个创建新进程的系统调用.而系统调用的机制其核 ...

  6. 操作系统中用户态和内核态(系统态)是什么?用户态如何变成内核态?

    用户态:当进程在执行用户自己的代码时,则称其处于用户态,这时cpu 访问资源有限,运行在用户态下的程序不能直接访问操作系统内核数据结构和程序. 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执 ...

  7. 系统调用syscall---用户态切换到内核态的唯一途径

    1.应用程序有时需要内核协助完成一些处理,但是应用程序不可能执行内核代码(主要是安全性考虑), 那么,应用程序需要有一种机制告诉内核,它现在需要内核的帮助,这个机制就是系统调用. 2.系统调用的本质是 ...

  8. linux-进程切换,用户态进程,内核态进程

    https://blog.csdn.net/Hatsune_Miku_/article/details/77851218

  9. java运行在用户态_理解Linux用户态和内核态

    Linux整体架构图 我们先来看一张Linux整体架构图. 系统调用 ​ 系统调用时操作系统的最小功能单位.根据不同的应用场景,不同的Linux发行版本提供的系统调用数量也不尽相同,大致在240-35 ...

  10. Linux用户态和内核态

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

最新文章

  1. CSW:闪电网络是一种证券,BCH避开了它
  2. javascript中自定义事件
  3. 解决AndroidStudio2.0导入eclipse项目时卡死的问题
  4. python处理utf8编码中文,及打印中文列表和字典
  5. c语言 函数的参数传递示例_isgreater()函数以及C ++中的示例
  6. ionic2开发的仿外卖点餐系统(Ionic2+Angular2
  7. centos 6.5 x64编译有python的vim7.4
  8. 深圳,本周日,华为云开发者大会,免费报名中
  9. Java面试题:2021大厂最全Java面试资料
  10. Centos使用Cacti监控你的网络
  11. 抖音短视频去水印网址 视频消重后,火山还是鉴别出来了
  12. 【组图】韩国美女明星蔡研---精彩写真
  13. 用conda建一个python2虚拟环境
  14. idea重启端口占用问题
  15. flush()的作用
  16. 汽车电气化共享移动性及自动驾驶对未来出行方式的全面展望
  17. 个人创新和团队创新 高效和创新
  18. Tcl脚本语言基础(2)
  19. 如何对HashMap进行排序
  20. 河北计算机课本初中,《信息技术》初中版(第一册)

热门文章

  1. win7打印机不显示服务器错误,打印机连接不上,教你win7连接打印机提示错误0x00000002的解决教程...
  2. Python浪漫七夕:可爱的卡通图案合集分享
  3. 正则表达式元符号大全
  4. Java——查找里程
  5. 用keytool创建Keystore和Trustsotre文件
  6. 电影下载全攻略 [初、中、高级]——老猫
  7. 如何选择你的移动APP KPIs(关键绩效指标)
  8. 舆情风险怎么分析的解决方案
  9. LaTeX技巧009:去掉图片标题中的‘:’号
  10. Oracle -- 分析函数