0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析从寄存器到用户态与内核态

jf_78858299 来源: Hoeller 作者: Hoeller 2023-01-30 15:28 次阅读

寄存器CPU内部重要的组成部分,寄存器内部由N个触发器组成,每个触发器可以保存1位二进制数,所以16位寄存器可以保存16个bit。

CPU内部一般有不同类型的多个寄存器,我们需要使用CPU对应的机器指令来操作这些寄存器,当然像内存、磁盘这些也是通过机器指令来操作的。

而CPU为了安全性,比如x86的CPU将机器指令分为了一般指令和特权指令,比如操作磁盘的指令就是特权指令,只有CPU处于某种特殊状态下才能执行特权指令。

x86 CPU利用内部一个特殊寄存器,用来标记此时的CPU能不能执行特权指令,这个特殊寄存器中可以存四种状态,ring0、ring1、ring2、ring3。

Windows、Linux操作系统中只用了ring0和ring3两种状态,如果处于ring0,表示CPU可以执行所有指令,包括特权指令,如果处于ring3,表示CPU不能执行特权指令,ring0等级高,ring3等级低。

不管是操作系统还是运行在操作系统之上的软件,都是用高级语言开发出来的,最终都需要翻译为机器指令。

所以本质上来说,我们自己用c或java开发的软件,只要翻译成了机器指令,也是可以直接操作寄存器的,操作磁盘的。

但是我们不会这么来做,也肯定不需要每个软件自己去实现这么底层并通用的功能,所以我们通常会调用操作系统的函数来操作磁盘。

操作系统就相当于一个中间层。

同时操作系统为了保护系统,就设计了内核态和用户态。

当我们电脑启动时,CPU处于ring0状态,这时所有指令都可以执行,从而启动引导程序,从而启动操作系统,操作系统在启动时,会对内存就行划分,划出一部分内存只能被操作系统自己使用,其他内存可以给应用软件使用。

操作系统启动完了之后,CPU状态就改为ring3,开始运行应用软件。

由于此时cpu处于ring3,所以应用软件想要运行一些特殊指令肯定是不行的。

当我们调用操作系统的提供的函数时,操作系统会来执行特权指令,可是操作系统不也是c语言写的代码吗,要执行特权指令需要ring0,如何把ring3切换成ring0呢?

系统中断,其实就是一条指令,比如int 0x80。

系统中断,cpu会自动切回到ring0状态,然后执行操作系统在系统启动时所设置好的代码,而这段代码可以根据中断之前所执行的代码来继续执行后续逻辑,并且此时cpu已经处于在ring0状态了,可以正常执行了。

而CPU处于ring0状态就是我们说的内核态,处于ring3状态就是我们说的用户态。

总结,当我们自己写的程序要操作磁盘时,因为要执行特权指令,但是CPU处于ring3,无法直接执行特殊指令,需要调用操作系统函数,从而会修改CPU处于ring0,从而进去内核态。

用户态时,CPU只能执行一些普通指令,内核态时,CPU能执行所有指令。

今天就聊到这,抛砖引玉,如果有不对的地方,欢迎大佬们指出。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206560
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206734
  • WINDOWS
    +关注

    关注

    3

    文章

    3440

    浏览量

    87144
  • 触发器
    +关注

    关注

    14

    文章

    1677

    浏览量

    60402
收藏 人收藏

    评论

    相关推荐

    Linux内核下如何读写IIC

    目前在Linux3.12上,想在内核下读取LM75温度传感的温度值,做了如下操作,但是读数据的时候i2c_transfer一直报错。先将LM75设备挂到IIC总线上:在sys下可以发现已经添加成功:但是读数据的时候就一直报错
    发表于 11-29 19:07

    【MYD-Y6ULX试用体验】用户蓝牙配置

    的stack为BlueZ, 参考前面的文章的图片,可以知道,内核用户使用的是MGMT接口来通讯。底层主要负责和Controller数据的传输,而数据的传输接口一般为USB,SDI
    发表于 03-24 09:21

    简述ARM的2种工作状态和7种工作模式

    工作模式。ARM通过软件改变,即软件设置寄存器来进行ARM的模式切换,因为ARM的工作模式都是可以通过相应寄存器的赋值来切换的。如上边提到的Linux操作系统内核
    发表于 08-20 12:30

    ARM的2种工作状态和7种工作模式。[附带文档下载]

    工作模式。ARM通过软件改变,即软件设置寄存器来进行ARM的模式切换,因为ARM的工作模式都是可以通过相应寄存器的赋值来切换的。如上边提到的Linux操作系统内核
    发表于 08-20 09:14

    操作系统为什么分内核用户?这两者如何切换?

    操作系统为什么分内核用户,这两者如何切换?进程在地址空间会划分为哪些区域?堆和栈有什么区别?
    发表于 07-23 09:01

    linux内核解决竞引起的异常的方法

    文章目录linux系统中出现并发与竞相关概念:四种情形:linux内核解决竞引起的异常的方法:即同步方法中断屏蔽概念特点中断屏蔽的编程步骤中断屏蔽相关宏函数应用实例自旋锁概念特点利用自旋锁同步
    发表于 07-28 06:15

    请问CPU与寄存器内核用户及如何切换?

    计算机硬件系统由哪几部分构成?编程语言的作用及与操作系统和硬件的关系是什么?请问CPU与寄存器内核用户及如何切换?
    发表于 10-25 06:31

    高阻的相关资料下载

    悬空,顾名思义,就是不接任何器件啦高阻:无上拉和无下拉,对外表现出电平不确定性不是所有的单片机都支持三输出。三输出一般由寄存器控制,需进行配置。高阻
    发表于 11-24 08:19

    内核是如何对task进行调度的呢

    调度在runqueue里的算法是如何去实现的?内核是如何对task进行调度的呢?
    发表于 12-24 07:59

    OpenHarmony3.1Beta喂狗源码解读之内核源码

    一、喂狗的芯片手册资料1.概述2.特点3.DG 寄存器概览二、内核代码分析1.定义喂狗IO地址2.代码函数接口分析设置超时函数代码喂狗函数代码:喂狗开始函数内核接口函数
    发表于 01-26 10:53

    OpenHarmony喂狗源码解读之用户源码

    timeout\n"); } else {// 用户设置喂狗超时时间为大于gap 用户喂狗间隔时间为// 获取内核的超时间 - gap
    发表于 01-26 10:57

    鸿蒙内核实现用户快速互斥锁Futex设计资料合集

    Futex(Fast userspace mutex,用户快速互斥锁),系列篇简称 快锁 ,是一个在 Linux 上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具,它第一次出现在
    发表于 03-23 14:12

    电机的冷、热是怎样定义的?

    电机的冷、热是怎样定义的?两者如何判断?满负载时是热否则就是冷是这样吗?
    发表于 12-13 08:16

    ARM处理7种工作模式

    转为Linux内核) 在CPSR寄存器中设置M[4:0]位,分别对应如下七种模式(注意:用户模式和系统模式只有对CPSR的读权限,因此、这两种模式下不可以通过直接设置CPSR进入其他
    发表于 12-15 10:15

    干货满满:ARM的内核寄存器讲解

    内核寄存器与外设寄存器内核寄存器与外设寄存器是完全不同的概念。
    发表于 04-17 11:47 142次阅读
    干货满满:ARM的<b class='flag-5'>内核</b><b class='flag-5'>寄存器</b>讲解