首页 > 编程知识 正文

用户态和内核态的区别,内核态与用户态

时间:2023-05-04 19:49:46 阅读:278866 作者:311

文章目录 linux基础系统调用和库函数的区别为什么要区分用户态和内核态?用户态和内核态的切换耗费时间的原因哪些情况会出出现用户态和内核态的切换用户态切换到内核态的三种方式

linux基础

linux的kernel内核外是系统调用,系统调用外是shell、库函数,而应用程序则在最外层

系统调用和库函数的区别 内核:屏蔽了调用各硬件资源的细节系统调用:内核提供给用户调用的接口,但系统调用的可移植性差
移植性差的原因:windows、linux内核的系统调用是不同的,比如:同一个功能提供给用户的函数名、参数都不相同,会出现从一个系统移植到另一个系统无法正常运行。库函数:为了解决系统调用移植新差的问题,同时封装windows和linux系统调用,对用户提供一个的函数(接口)。系统调用在内核地址空间执行,而库函数是在用户地址空间调用。

为什么要区分用户态和内核态?

在CPU指令中,有些指令是非常危险的,如果错用将导致系统崩溃,比如清内存、设置时钟等,所以CPU将指令分为特权指令和非特权指令。对于危险指令,只允许操作系统及其相关模块使用,普通应用程序只能使用不危险的指令。

Intel的CPU将特权等级分为4个级别:Ring0~Ring3,而Linux使用Ring3级别运行用户态,Ring0作为内核态。操作系统启动时对内存进行了划分,操作系统的数据都是存放于内核空间的,用户进程的数据是存放于用户空间的。处于用户态级别的程序只能访问用户空间,而处于内核态级别的程序可以访问用户空间和内核空间。当一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态 用户态和内核态的切换耗费时间的原因

内核为上层应用使用CPU、存储、IO等硬件资源提供了接口,即系统调用,如果一个应用程序需要用到内核资源,就需执行系统调用的相关语句。
(1)当执行系统调用时,首先会保存现场,然后通过系统调用到内核态执行,最后内核态变为用户态执行用户程序时,需要恢复用户态的现场。
在进入内核的时候需要保存用户态的寄存器,在内核态返回用户态的时候会恢复这些寄存器的内容。

(2)每个线程都有两个栈:用户栈和内核栈,当执行系统调用时,线程就会由用户栈切换到内核栈,而内核代码对用户不信任,需要进行额外的检查。
Linux | 为什么用户态和内核态的切换耗费时间?

哪些情况会出出现用户态和内核态的切换 线程间的切换(上下文):线程上下文切换时,前一个线程的线程线程(切换前最后时刻的数据和指令)会被保存到内核中,而切换回来时需要从内核空间中读取数据恢复现场。Syncronized锁的获取和释放:使用内核中monitor对象 用户态切换到内核态的三种方式 当程序在用户态需要申请外部资源(如声卡、网卡、U盘、磁盘)时,需要从用户态切换到内核态,主要有3种情况需要申请外部资源:
(1)系统调用
举例: 创建线程时,需要通过pthread函数库调用内核来创建
(2)中断
举例: 当外围设备完成用户请求的操作后,会想CPU发送中断信号。这时CPU会暂停执行下一条指令(用户态)转而执行与该中断信号对应的中断处理程序
(3)异常:某些异常如缺页异常只能由内核进行处理

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。