当前位置: 首页 > news >正文

详谈操作系统中的内核态和用户态

不知道大家有没有思考过这样一个问题:什么是处理器(CPU)的状态?🤔

其实CPU和人一样,没有执行程序的时候,是没有什么状态的,当它执行的程序是用户程序的时候就叫用户态,当执行的程序是操作系统的代码时就叫系统态或者内核态.

接下来,我们就来谈谈内核态和用户态.

目录

1.内核态和用户态的概念 

2.内核态和用户态的区别

3.特权指令和非特权指令 

这是一个最简单的HelloWorld程序


1.内核态和用户态的概念 

内核态:可以访问所有的硬件设备,也可以执行硬件上能够运行的各种指令

用户态:只能执行一部分机器指令,不可以运行I/O命令或者影响机器控制的命令

 操作系统是运行在内核态的,而操作系统提供的用户接口程序和支持的应用程序,是运行在用户态的.

 

2.内核态和用户态的区别

那么,用户态和内核态又有什么区别呢?

📢我们先看内核态.在内核态上运行的所有程序,都是可以访问所有的硬件资源的,可以在硬件上执行各种指令

📢而用户态,只能执行一部分指令.对于那些影响系统稳定性的指令,还有I/O指令,都是不允许执行的.

 

但是有的人可能会提出疑问,我可以使用fopen()函数打开一个文件,并且还能对这个文件进行读写操作,我这个程序也是运行在用户态的,但是我可以做I/O操作呀.😦

其实我们不知道的是,C语言他默默帮我们封装了一个glibc库函数,并在里面调用了系统函数,然后由操作系统根据你传入的指令,比如打开文件指令,读取文件指令,去操作硬盘上的硬件,因此,glibc内部封装了一个接口程序,通过这个接口程序,去调用内核态的指令.🤗

3.特权指令和非特权指令 

在计算机中,存在指令集,指令集中有些指令是用户态上可以运行,有的只有在内核态上才能运行.

⌛我们将只有操作系统能使用,而用户不能使用的指令称为特权指令。

⌛而有一部分指令用户态和操作系统都能使用的就叫做非特权指令。

 因为不可能让应用程序或者程序员去擅自访问某个扇区中的二进制数据,必须要经过文件系统才能访问扇区中的数据.

🐞我们举个简单例子来说明:

这是一个最简单的HelloWorld程序

#include<stdio.h>
int main()
{char str[]="Hello World\n";printf("%s",str);return 0;
}

通过这个图我们可以看出来,在这个程序中,main函数肯定是运行在用户态的,在main函数中,还执行了一个printf函数,将HelloWorld打印输出到显示器中. 

它是将内存中的HelloWorld输出到控制台,目前这个printf函数是运行在用户态的,只不过打印输出的时候,printf肯定要和外部设备,比如说显示器打交道.

我们都知道操作系统内部有一个out指令,他就可以将内存中的数据输出到控制台,或者说输出到显示器中,所以这个时候,我们一定要做一个系统调用,让这个printf()跑到内核态中去执行.这个时候,也就是调用了操作系统的一个系统方法,或者说叫内部接口来和硬件交互.

我们首先使用gcc对这段代码进行编译,然后使用strace工具对代码进行跟踪.

 这个write()函数就是glibc封装的系统函数write(),也就是这个printf()函数在内部调用的系统函数write().

既然printf()调用的是write()函数,那么我们其实就可以直接将printf()函数替换为write()函数

#include<unistd.h>
int main()
{char msg[]="hello world\n";write(STDOUT_FILENO,msg,sizeof(msg)-1);return 0;
}

我们再次对程序进行编译,并且使用gdb跟踪调试. 

 

  1.  我们首先在write处打断点
  2. 然后run单步运行
  3. 最后进行反汇编 

确认了在write()函数的系统调用中,是通过syscall指令来将用户态陷入到了内核态.

接下来我们来看看用户态是如何切换到内核态的. 

1.将参数保存到寄存器中

这里也就是printf()的参数,或者说,在printf()内部调用的系统函数write()的参数

2.根据系统调用名称(也就是write()方法名)找到它的系统调用号.

这个系统调用号在哪里找呢?有一张系统调用映射表,这个映射表不仅在内核中维护了这样一张表,在glibc的库函数中,也维护了这样一张表,因此,我们就能够找到write()方法的系统调用号.

内核态和用户态之间通信就是通过系统调用号来进行的.

3.通过汇编指令syscall将用户态陷入到内核态,通过调用系统调用号对应的系统方法以及相关寄存器,来完成指令.

概括起来就是说,从用户态切换到内核态,就是用户态的应用程序要向内核态去申请外部资源,这个外部资源说通俗点也就是只有内核态才有权限执行的命令,就是外部资源.

说的更直白一点,就是当我们拆开一台服务器或者笔记本,肉眼可见的都属于外部资源,包括CPU,N=内存,网卡,硬盘,USB接口等等,都属于外部资源 

而系统调用,就是我们今天讲的syscall,就是最常见的陷入方式.

系统调用还有其它方式,分为5类

  • 进程  exit  fork
  • 文件  chomd  chown  open
  • 设备  read   write
  • 信息  getXXX  setXXX
  • 通信  mmap   sendfile

我们可以通过man syscalls命令来查看具体的系统调用

man syscalls

相关文章:

详谈操作系统中的内核态和用户态

不知道大家有没有思考过这样一个问题:什么是处理器&#xff08;CPU&#xff09;的状态&#xff1f;&#x1f914; 其实CPU和人一样,没有执行程序的时候,是没有什么状态的,当它执行的程序是用户程序的时候就叫用户态&#xff0c;当执行的程序是操作系统的代码时就叫系统态或者内…...

OpenWrt KernelPackage分析

一. 前言 KernelPackage是OpenWrt用来编译内核模块的函数&#xff0c;其实KernelPackage后面会调用BuildPackage&#xff0c;这里会一块将BuildPackage也顺便分析&#xff0c;本文以gpio-button-hotplug驱动模块为例&#xff0c;讲解整个编译过程。 gpio-button-hotplug驱动编译…...

第 363 场 LeetCode 周赛题解

A 计算 K 置位下标对应元素的和 模拟 class Solution { public:int pop_cnt(int x) {//求x的二进制表示中的1的位数int res 0;for (; x; x >> 1)if (x & 1)res;return res;}int sumIndicesWithKSetBits(vector<int> &nums, int k) {int res 0;for (int i…...

ffplay源码解析-main入口函数

main入口函数 初始化 变量、缓存区、SDL窗口初始化等 int main(int argc, char **argv) {int flags;VideoState *is; // av_log_set_level(AV_LOG_TRACE);init_dynload();av_log_set_flags(AV_LOG_SKIP_REPEATED);parse_loglevel(argc, argv, options);/// av_log_set_le…...

这些Coding套路你不会还不知道吧?

对于一名程序员来说&#xff0c;编码进阶是成为优秀工程师非常重要的一步&#xff0c;它可以让我们更加熟练地掌握编程&#xff0c;深入理解数据结构和算法&#xff0c;从而更好地完成复杂的任务&#xff0c;提高工作效率。而我认为熟练使用设计模式就是编码进阶的最好方式之一…...

Spring Boot深度解析:快速开发的秘密

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

mysql数据库备份(mysqldump)

mysqldump命令备份数据 mysqldump -u root -p --databases 数据库1 数据库2 > xxx.sqlmysqldump常用操作示例 1. 备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/mysqlbackup/mydb.sql2. 备份全部数据库的结构&#xff08;加 -d 参数&#xff09; …...

linux Nginx+Tomcat负载均衡、动静分离

linux NginxTomcat负载均衡、动静分离 1、Tomcat的基本介绍1.1Tomcat是什么&#xff1f;1.2Tomcat的构成组件1.3Tomcat的核心功能1.4Tomcat请求过程 2、Tomcat部署2.1安装tomcat2.2优化tomcat启动速度2.4主要目录说明 3、Tomcat 虚拟主机配置3.1创建fsj和mws项目目录和文件3.2修…...

ts 枚举类型原理及其应用详解

ts 枚举类型介绍 TypeScript的枚举类型是一种特殊的数据类型&#xff0c;它允许开发者为一组相关值定义一个共同的名称&#xff0c;使我们可以更清晰、更一致地使用这些值。 枚举类型在TypeScript中用enum关键字定义&#xff0c;每个枚举值默认都是数字类型&#xff0c;从0开…...

腾讯mini项目-【指标监控服务重构】2023-08-23

今日已办 进度和问题汇总 请求合并 feature/venus tracefeature/venus metricfeature/profile-otel-baserunner-stylebugfix/profile-logger-Syncfeature/profile_otelclient_enable_config 完成otel 开关 trace-采样metrice-reader 已经都在各自服务器运行&#xff0c;并接入…...

C- ssize_t size_t

size_t 和 ssize_t 都是在 C 和 C 的标准库中定义的数据类型&#xff0c;它们通常用于表示大小和长度。然而&#xff0c;它们有关键的区别。 size_t: 定义&#xff1a;size_t 是一个无符号整数类型&#xff0c;它是适合表示对象的大小的类型。在 POSIX 中&#xff0c;它也用于…...

ubuntu20.04 Supervisor 开机自启动脚本一文配置

前言: 最近发现一种非常好的开机启动服务方式,不光可以开机自启动,而且还可以进行开机节点的进程守护,这样大大确保了线程的稳定情况,这种服务甚至可以守护开机的进程,所以比之前设置 rc.local 开机自启动脚本一文配置节点好出很多,它甚至可以使用网页登录监管我开机自启…...

【面试刷题】——函数指针和指针函数

“函数指针”&#xff08;function pointer&#xff09;和 “指针函数”&#xff08;pointer to function&#xff09;是两个不同的概念&#xff0c;它们涉及到指针和函数的结合使用。 函数指针&#xff08;Function Pointer&#xff09;&#xff1a; 函数指针是指向函数的指…...

目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)

目标分类 一、目标分类介绍1.1 二分类和多分类的区别1.2 单标签和多标签输出的区别 二、代码获取三、数据集准备四、环境搭建4.1 环境测试 五、模型训练六、模型测试6.1 多标签训练-单标签输出结果6.2 多标签训练-多标签输出结果 一、目标分类介绍 目标分类是一种监督学习任务…...

【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)

目录 1 Pandas 可视化功能 2 Pandas绘图实例 2.1 绘制线图 2.2 绘制柱状图 2.3 绘制随机散点图 2.4 绘制饼图 2.5 绘制箱线图A 2.6 绘制箱线图B 2.7 绘制散点图矩阵 2.8 绘制面积图 2.9 绘制热力图 2.10 绘制核密度估计图 1 Pandas 可视化功能 pandas是一个强大的数…...

2023华为产品测评官-开发者之声 | 华为云CodeArts征文活动,多重好礼邀您发声!

"2023华为产品测评官&#xff0d;开发者之声"活动激发了众多开发者和技术爱好者的热情&#xff0c;他们纷纷递交了精心编写的产品测评报告。活动社群充满活力&#xff0c;参与者们热衷于交流讨论&#xff0c;互相帮助解决问题&#xff0c;一起探索云技术的无限可能。…...

Python 图形化界面基础篇:获取文本框中的用户输入

Python 图形化界面基础篇&#xff1a;获取文本框中的用户输入 引言 Tkinter 库简介步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建文本框步骤4&#xff1a;获取文本框中的用户输入步骤5&#xff1a;启动 Tkinter 主事件循环 完整…...

【驱动开发】实现三盏灯的控制,编写应用程序测试

head.h #ifndef __HEAD_H__ #define __HEAD_H__//LED1:PE10 //LED2:PF10 //LED3:PE8#define LED_RCC 0X50000A28 //使能GPIO#define LED_MODER 0X50006000 //设置输出模式 #define LED_ODR 0X50006014 //设置输出高低电平#define LED2_MODER 0X50007000 …...

Vue3+ElementUI使用

<!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"initial-scale1.0,maximum-scale1.0,minimum-scale1.0,user-scalable0, widthdevice-width"/><!-- 引入样式 --><lin…...

MySQL 和 MariaDB 版本管理的历史背景及差异

目录 MariaDB MySQL 差异 关于 SQLE SQLE 获取 ​ 了解更多 需要说明的是 MySQL 和 MariaDB 都有社区版和企业版。对于 MySQL&#xff0c;这两个版本都是由同一家公司&#xff08;Oracle&#xff09;提供&#xff0c;遵循相同的版本编号体系&#xff0c;企业版包含更丰富…...

linux驱动开发--day4(字符设备驱动注册内部流程、及实现备文件和设备的绑定下LED灯实验)

一、字符设备驱动注册的内部过程 1.分配struct cdev对象空间 2.初始化struct cdev对象 3.注册cdev对象 二、注册字符设备驱动分步实现 1.分配字符设备驱动对象 2.字符设备驱动对象初始化 3.设备号的申请 4.根据申请的设备号和驱动对象注册驱动 三、open函数回调驱动中…...

elasticsearch5-RestAPI操作

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…...

数据结构与算法(一)

文章目录 数据结构与算法(一)1 位运算、算法是什么、简单排序1.1 实现打印一个整数的二进制1.2 给定一个参数N,返回1!+2!+3!+4!+...+N!的结果1.3 简单排序算法2 数据结构大分类、前缀和、对数器2.1 实现前缀和数组2.2 如何用1\~5的随机函数加工出1\~7的随机函数2.3 如何把不…...

Matlab--微积分问题的计算机求解

目录 1.单变量函数的极限问题 1.1.公式例子 1.2.对应例题 1 2.多变量函数的极限问题 3.函数导数的解析解 4.多元函数的偏导数 5.Jacobian函数 6.Hessian矩阵 7.隐函数的偏导 8.不定积分问题的求解 9.定积分的求解问题 10. 多重积分的问题求解 1.单变量函数的极限问题 …...

GRU实现时间序列预测(PyTorch版)

&#x1f4a5;项目专栏&#xff1a;【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战&#xff08;附代码数据集原理介绍&#xff09; 文章目录 前言一、基于PyTorch搭建GRU模型实现风速时间序列预测二、时序数据集的制作三、数据归一化四、数据集加载器…...

文本框粘贴时兼容Unix、Mac换行符的方法源码

本篇文章属于《518抽奖软件开发日志》系列文章的一部分。 我在开发《518抽奖软件》&#xff08;www.518cj.net&#xff09;的时候&#xff0c;要在文本框粘贴从别处复制来的名单。发现一个问题&#xff0c;就是一些Unix传过来的多行文本&#xff0c;粘贴后都变成了一行。原来&a…...

2023年华为杯研究生数学建模竞赛辅导

2023年华为杯研究生数学建模竞赛辅导 各研究生培养单位&#xff1a; 中国研究生数学建模竞赛作为教育部学位管理与研究生教育司指导&#xff0c;中国学位与研究生教育学会、中国科协青少年科技中心主办的“中国研究生创新实践系列大赛”主题赛事之一&#xff0c;是一项面向在校…...

post更新,put相当于删除重新增一条

索引数据 //删除后新增 PUT my_dynamic_temp/_doc/1 { “name”:“test”, “class”:“1204” } //覆盖更新 POST my_dynamic_temp/_update/1 { “doc”: { “name”:“test”, “class”:“1203”, “pernum”:“998” } }...

python责任链模式

责任链模式是一种行为设计模式&#xff0c;它允许你将请求沿着处理者链进行传递&#xff0c;直到有一个处理者能够处理它为止。在Python中&#xff0c;你可以使用多线程来实现责任链模式的框架。 首先&#xff0c;你需要定义一个基础的处理者类&#xff0c;它包含处理请求的方…...

大数据技术准备

Hbase&#xff1a;HBase 底层原理详解&#xff08;深度好文&#xff0c;建议收藏&#xff09; - 腾讯云开发者社区-腾讯云 Hbase架构图 同一个列族如果有多个store&#xff0c;那么这些store在不同的region Hbase写流程&#xff08;读比写慢&#xff09; MemStore Flush Hbas…...

企业网站的党建文化怎么做/学电子商务出来能干嘛

一 .进程概念理解 1.前面必备知识点 #一 操作系统的作用&#xff1a;1&#xff1a;隐藏丑陋复杂的硬件接口&#xff0c;提供良好的抽象接口2&#xff1a;管理、调度进程&#xff0c;并且将多个进程对硬件的竞争变得有序#二 多道技术&#xff1a;1.产生背景&#xff1a;针对单核…...

上海哪里有做网站的/google学术搜索

elasticsearch 7.6 教你简单上手下载( windows)访问/测试/配置在kibana开发工具里玩一玩Rest风格说明自动增加索引创建索引规则默认信息 _doc拓展 get _cat/...修改索引删除索引文档操作条件查询简单条件查询字段过滤排序分页布尔值查询匹配多个精确查询连个类型 text 和keywor…...

北京网站建设服务中心/简单网页制作成品免费

戴尔服务器以稳定著称&#xff0c;但服务器维护人员要想进入BIOS设置就非常困难&#xff0c;甚至出现进入不了的毛病&#xff0c;应该如何解决&#xff1f;按理说&#xff0c;戴尔服务器开机之后&#xff0c;只要出现戴尔的启动画面&#xff0c;摁下F2就可以顺利进入BIOS&#…...

内容网站管理系统/seo排名优化怎样

1. 最简单的方法是用base64:import base64 s1 base64.encodestring(hello world) s2 base64.decodestring(s1) print s1,s2 # aGVsbG8gd29ybGQ\n # hello worldNote: 这是最简单的方法了&#xff0c;但是不够保险&#xff0c;因为如果别人拿到你的密文&#xff0c;也可以自己…...

做淘宝用那些网站发货/如何在网上推广产品

程序员工作重要还是学习重要No, no, no, no, and no. And no.不&#xff0c;不&#xff0c;不&#xff0c;不&#xff0c;不。 和不。 A big NO. Clear as that.一个大号 那样清楚。 All you have to do is to bring those two letters together and say the word.您要做的就…...

seo网站建设是什么意思/朋友圈广告推广平台

VisualVM是一个以监控、显示本地或者远程服务器JVM工作情况&#xff0c;进行性能调优的工具。借助VisualVM&#xff0c;我们可以实现对JVM内存各个子池、CPU、垃圾收集器等方面进行监控&#xff0c;从而发现程序代码中潜在的泄露点和配置问题。 远程监控Linux JVM有两种连接方式…...