用户态与内核态之间切换详解
用户空间和内核空间
用户程序有用户态和内核态两种状态。用户态就是执行在用户空间中,不能直接执行系统调用。必须先切换到内核态,也就是系统调用的相关数据信息必须存储在内核空间中,然后执行系统调用。
操作硬盘等资源属于敏感操作,为了内核安全,用户线程不能直接调用。而是采用了操作系统内核提供了系统调用接口,用户线程通过系统调用来实现文件读写。所以直接与硬盘打交道的是操作系统内核。
操作系统将线程分为了内核态和用户态,当用户线程调用了系统调用的时候,需要将线程从用户态切换到内核态。
无论是操作系统内核程序还是用户程序在运行的时候都需要申请内存来保存运行状态,调用方法信息、程序代码、数据等信息。
操作系统将内存分为内核空间和用户空间。
内核空间中主要负责 操作系统内核线程以及用户程序系统调用。
用户空间主要负责用户程序的非系统调用。
内核空间比用户空间拥有更高的操作级别,只有在内核空间中才可以调用操作硬件等核心资源。
操作系统将内存按1:3的比例分为了内核空间和用户空间,用户态的运行栈信息保存在用户空间中,内核态的运行栈信息保存在内核空间中。运行栈中保存了当前线程的运行信息,比如执行到了哪些方法,局部变量等。
当发生用户态和内核态之间的切换的时候,运行栈的信息发生了变化,对应的CPU中的寄存器信息也要发生变换。但是用户线程完成系统调用的时候,还是要切换回用户态,继续执行代码的。所以要将发生系统调用之前的用户栈的信息保存起来,也就是将寄存器中的数据保存到线程所属的某块内存区域。这就涉及到了数据的拷贝,同时用户态切换到内核态还需要安全验证等操作。所以用户态和内核态之间的切换是十分耗费资源的。
用户态切换到内核态
CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0.
每个线程都对应着一个用户栈和内核栈,分别用来执行用户方法和内核方法。
用户方法就是普通的操作。
内核方法就是访问磁盘、内存分配、网卡、声卡等敏感操作。
当用户尝试调用内核方法的时候,就会发生用户态切换到内核态的转变。
切换流程:
1、每个线程都对应这一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。
2、因为从用户态切换到内核态时,首先用户态可以直接读写寄存器,用户态操作CPU,将寄存器的状态保存到对应的内存中,然后调用对应的系统函数,传入对应的用户栈的PC地址和寄存器信息,方便后续内核方法调用完毕后,恢复用户方法执行的现场。
3、将CPU的字段改为内核态,将内核段对应的代码地址写入到PC寄存器中,然后开始执行内核方法,相应的方法栈帧时保存在内核栈中。
4、当内核方法执行完毕后,会将CPU的字段改为用户态,然后利用之前写入的信息来恢复用户栈的执行。
从上述流程可以看出用户态切换到内核态的时候,会牵扯到用户态现场信息的保存以及恢复,还要进行一系列的安全检查,比较耗费资源。
用户态与内核态之间切换详解相关推荐
- 用户态和内核态之间的切换
用户态和内核态之间的切换 切换方式 从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作: 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过.其实系统调用本身就是 ...
- 操作系统用户态和内核态之间的切换过程
操作系统用户态和内核态之间的切换过程 1. 用户态和内核态的概念区别 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重 ...
- Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal
文章目录 (1)用户态和内核态 (2)用户态和内核态的切换 (3)内核是如何实现信号的捕捉 (4)sigaction (1)用户态和内核态 我们说过,每个Linux进程有4GB的地址空间 其中0-3G ...
- 用户态和内核态的切换
用户态和内核态的切换 我们经常说,一个程序依赖DMA设备来减少用户态和内核态的切换次数,以此来提升性能.那么对于它的细节是如何进行的呢?本篇,博主与你一起研究一下用户态和内核态的划分,以及这件事情的前 ...
- 操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)
文章目录 中断 过程调用 系统调用 过程调用和系统调用的区别 中断 用户态.内核态之间的切换是怎么实现的? 用户态→内核态 是通过中断实现的.并且 中断是唯一途径 . 核心态→用户态 的切换是通过执行 ...
- 系统调用原理与用户态以及内核态相互切换过程,以linux系统为主
1. 讲系统调用前需要清楚的几个基本概念 1.1 内核态与用户态 内核态:当CPU执行内核的代码(CPU堆栈指针指向内核堆栈)时,我们就称此时处于内核态,内核态的代码可以使用特权指令,这些指令可以控制 ...
- 什么是用户态和内核态?用户态和内核态是如何切换的?
3.什么是用户态和内核态? 用户态和内核态是操作系统的两种运行状态,操作系统主要是为了对访问能力进行限制,用户态的权限较低,而内核态的权限较高 用户态:用户态运行的程序只能受限地访问内存,只能直接读取 ...
- 用户态和内核态的切换耗费时间的原因
用户态和内核态的切换耗费时间的原因 总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大. 应用程序的执行需要依托内核提供的资源,包括CPU.存储.IO等,因此内核提供 ...
- 进程用户态和内核态及其切换过程
1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...
最新文章
- python爬取时怎么获取头部header
- Jetpack Compose学习笔记
- Thread.sleep还是TimeUnit.SECONDS.sleep
- 正则表达式(括号)、[中括号]、{大括号}的区别
- BOS12——多对多添加方法,多对多页面需要字段问题(不多的话直接提供get方法),修改Realm中授权方法(查询数据库),缓存Java对象的方法,加载左侧菜单(ztree提供pId)...
- 过滤器filter,监听器listener
- 坐标定位手机元素_CSS 是如何影响浏览器元素在文档中的排列?
- access子窗体的控件vba怎么写_第37讲:VBA代码中运行错误的处理方式
- Django REST Framework API Guide 02
- Android学习资料网站搜集
- H264压缩码率与GOP
- RANSAC算法与原理(二)
- windows屏幕分辨率获取方式
- 微信小程序实例:开发showToast消息提示接口
- unity_插屏广告
- PAT乙级——1010.月饼
- yolov5 + second_classify -- 代码
- 有4K电视,还需要单独的4K播放机吗?
- Pinterest的开源兴趣
- 为什么游戏服务器一定要选择高防御的服务器