精华内容
下载资源
问答
  • 2022-01-20 14:33:33

    1.CPU的四种状态与操作系统的两种状态(用户态和内核态)

    • 首先我们要知道CPU有四种状态,分别为编号为0(特权最大)到3(特权最小),以及3个受保护的主要资源:内存、I/O端口和执行某些机器指令的能力。
    • 操作系统它基于CPU之上,只用到了CPU的两种状态,一个内核态,一个用户态,内核态运行在CPU的第 0 等级,用户态运行在CPU的第 3 等级。

    在这里插入图片描述

    2.操作系统的用户态和内核态之间的切换

    1. 首先内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, intel cpu提供Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。
    2. 其次Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据)。
    3. 然后用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用(比如netty和redis中对于多路复用select和poll的改进epoll也需要切换到内核态),这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。
    4. 最后至于说保护模式,是说通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。

    3.操作系统的用户态切换到内核态的四种情况

    • 系统调用
      这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如x86里的call gate也可以用来做系统调用,也能做到权限控制和内核代码保护,跟中断的效果完全一样,

    • 硬中断

      • 当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。该中断可被屏蔽。
      • 从本质上讲,中断(硬)是一种电信号,当设备有某种事情发生的时候,他就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的(与逻辑门的另外一边设置的是高电平,如果是低电平就进行了屏蔽),中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。
    • 软中断(softIRQ)

      • 软中断(softIRQ)的一种典型应用就是所谓的"下半部"(bottom half),它的得名来自于将硬件中断处理分离成"上半部"和"下半部"两个阶段的机制:上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作;而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。
      • 在系统调用的时候,也可以用软中断的方式实现,比如 fork() 实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如 Linux 的 int 80h 中断。该中断不可被屏蔽。
    • 异常
      当 CPU 在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

      • 首先明确下什么是缺页异常,CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、IO设备等等,但从CPU发出的访问地址并非是这些外设在地址总线上的物理地址,而是一个虚拟地址,由MMU将虚拟地址转换成物理地址再从地址总线上发出,MMU上的这种虚拟地址和物理地址的转换关系是需要创建的,并且MMU还可以设置这个物理页是否可以进行写操作,当没有创建一个虚拟地址到物理地址的映射,或者创建了这样的映射,但那个物理页不可写的时候,MMU将会通知CPU产生了一个缺页异常。
      • 下面总结下缺页异常的几种情况:
        1、当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后再没有当前进程的线性区vma的时候,可以肯定这是一个编码错误,这将杀掉该进程;
        2、当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后存在当前进程的线性区vma的时候,这很可能是缺页异常,并且可能是栈溢出导致的缺页异常;
        3、当使用malloc/mmap等希望访问物理空间的库函数/系统调用后,由于linux并未真正给新创建的vma映射物理页,此时若先进行写操作,将如上面的2的情况产生缺页异常,若先进行读操作虽也会产生缺页异常,将被映射给默认的零页(zero_pfn),等再进行写操作时,仍会产生缺页异常,这次必须分配物理页了,进入写时复制的流程;
        4、当使用fork等系统调用创建子进程时,子进程不论有无自己的vma,“它的”vma都有对于物理页的映射,但它们共同映射的这些物理页属性为只读,即linux并未给子进程真正分配物理页,当父子进程任何一方要写相应物理页时,导致缺页异常的写时复制。

    4.用户代码和操作系统代码是如何在cup上面运行的

    4.1操作系统运行用户程序?

    • 计算机的代码,都是机器码,都由CPU一条一条地执行的,无论是应用程序的代码,还是操作系统的代码,都是机器码,CPU都用一样的方法来执行,这个问题和内核态还是用户态无关。所以,没有“操作系统运行用户程序”的说法。所有的软件指令,都被CPU用一样的方法执行。

    4.2为什么同是代码,操作系统程序会比一般程序拥有更高的权限?

    • 权限是CPU制造的,CPU只要能保证权限的穿越是单向的,就可以赋予操作系统(的代码)特殊的权限。比如ARM64 CPU启动的时候,(在特定的设计下),工作在权限EL1,这时开始执行的代码就是操作系统的代码了,操作系统执行够了以后,主动把CPU权限降低到EL0(EL1的时候你有权降级,但反过来你就没有权利),这之后执行的代码就在所谓的“用户态"了,由于CPU工作在EL0状态,这些代码的权限就很低,这时如果你执行一个权限比较高的指令(比如访问SCTLR_EL1.A寄存器,又比如x86的int,ARM的SC),CPU就会报错(报错的结果是把权限切换回EL1,并且直接调用操作系统设置好的代码,这样控制权仍是操作系统的),把用户程序的控制权强行取走,赋予给操作系统,这就是为什么操作系统(表现出来)比用户程序拥有更高的权限。
    • 所谓操作系统,用户程序,系统服务,都是我们基于CPU权限人为制造的概念,并非必须存在的客观实体。

    4.3代码是如何成为操作系统的?

    • CPU开始加电了,完成内部必要的处理后,就可以从指定的内存地址开始执行代码,这个内存地址称为Reset向量,在一些CPU上是固定的,在一些CPU上是可以根据特定的条件变化的(比如把CPU连入电路的时候,给某个引脚加高电平等),但无论如何,反正最终CPU会在某个固定的位置开始执行程序。什么代码放在这里,什么代码就具有最高的执行权限。
    • 在DOS+x86的时代,硬件设计者会在这个内存位置上固定焊一个ROM,然后在计算机出厂的时候,固定在这个ROM上烧一段程序,这个程序就称为BIOS,所以,CPU加电后,首先进入的是BIOS程序,然后有BIOS程序根据你是否有磁盘,从磁盘的指定位置上读入代码来执行。
    • 所以你要成为操作系统,你就要把你的代码放到磁盘的指定位置,这样这个代码就会具备“操作系统”的控制权。

    4.4现代的计算机CPU是如何加载操作系统代码的?

    • 现代更复杂的计算机,硬件加电的时候,根本还没有给主CPU加电,而是某个MCU(小CPU)首先获得系统的控制权,这个MCU就可以直接设置固定的内存内的内容,让CPU到时执行这段代码,这样,其实真正具有系统的把控权的是这个MCU,它的代码才是系统的“固件”。
    • 如果是多核CPU,CPU加电的时候仅启动一个核,完成前期的大部分初始化(比如安全操作系统和虚拟机调度器的初始化),然后进入EL1,完成主CPU的初始化,在这个主CPU初始化的时候,准备其他CPU的Reset向量的内容,完成准备后,控制硬件给其他CPU加电,这样其他CPU也在操作系统的控制下投入运行。整个系统就都在控制之下了。
    更多相关内容
  • 凡是涉及到IO读写、内存分配等硬件资源的操作时,往往能直接操作,而是通过一种叫系统调用的过程,让程序陷入到内核态运行,然后内核态的CPU执行有关硬件资源操作指令,得到相关的硬件资源后返回到用户态继续...

    用户态与内核态

    1、背景

    当我们在写程序是,凡是涉及到IO读写、内存分配等硬件资源的操作时,往往不能直接操作,而是通过一种叫系统调用的过程,让程序陷入到内核态运行,然后内核态的CPU执行有关硬件资源操作指令,得到相关的硬件资源后在返回到用户态继续执行,之间还要进行一系列的数据传输。

    假设没有这种内核态和用户态之分,程序随随便便就能访问硬件资源,比如说分配内存,程序能随意的读写所有的内存空间,如果程序员一不小心将不适当的内容写到了不该写的地方,就很可能导致系统崩溃。

    为什么要有用户态和内核态?

    由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 – 用户态和内核态。

    2、定义

    在这里插入图片描述
    系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间),

    1、内核:本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。

    • cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。

    2、用户态:上层应用程序的活动空间,只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。

    • 应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用

    具体说明
    在这里插入图片描述
    从这个图上可以更进一步对内核所做的事有一个“全景式”的印象。主要表现为:向下控制硬件资源,向内管理操作系统资源:包括进程的调度和管理、内存的管理、文件系统的管理、设备驱动程序的管理以及网络资源的管理,向上则向应用程序提供系统调用的接口。从整体上来看,整个操作系统分为两层:用户态和内核态,这种分层的架构极大地提高了资源管理的可扩展性和灵活性,而且方便用户对资源的调用和集中式的管理,带来一定的安全性。

    3、用户态访问内核态资源的方式

    用户态的应用程序可以通过三种方式来访问内核态的资源:

    • 1)系统调用
    • 2)库函数
    • 3)Shell脚本

    3.1、系统调用

    • 系统调用是操作系统的最小功能单位,根据不同的应用场景,不同的Linux发行版本提供的系统调用数量也不尽相同,大致在240-350之间。系统调用组成了用户态跟内核态交互的基本接口。
      • 例如:用户态想要申请一块20K大小的动态内存,就需要brk系统调用,将数据段指针向下偏移,如果用户态多处申请20K动态内存,同时又释放呢?这个内存的管理就变得非常的复杂。

    我们可以把系统调用看成是一种不能再化简的操作(类似于原子操作,但是不同概念),有人把它比作一个汉字的一个“笔画”,而一个“汉字”就代表一个上层应用,因此,有时候如果要实现一个完整的汉字(给某个变量分配内存空间),就必须调用很多的系统调用

    3.2、库函数

    库函数就是屏蔽这些复杂的底层实现细节,减轻程序员的负担,从而更加关注上层的逻辑实现。它对系统调用进行封装,提供简单的基本接口给用户,这样增强了程序的灵活性,当然对于简单的接口,也可以直接使用系统调用访问资源,例如:open(),write(),read()等等。库函数根据不同的标准也有不同的版本,例如:glibc库,posix库等

    接着上面的系统调用继续说:

    • 系统调用过多,这势必会加重程序员的负担,良好的程序设计方法是:重视上层的业务逻辑操作,而尽可能避免底层复杂的实现细节。
    • 库函数正是为了将程序员从复杂的细节中解脱出来而提出的一种有效方法。它实现对系统调用的封装,将简单的业务逻辑接口呈现给用户,方便用户调用,从这个角度上看,库函数就像是组成汉字的“偏旁”。
      • “人”,对于复杂操作,我们借助于库函数来实现,如“仁”。显然,这样的库函数依据不同的标准也可以有不同的实现版本,如ISO C标准库,POSIX标准库等。

    3.3、Shell脚本

    Shell是一个特殊的应用程序,俗称命令行,本质上是一个命令解释器,它下通系统调用,上通各种应用,通常充当着一种“胶水”的角色,来连接各个小功能程序,让不同程序能够以一个清晰的接口协同工作,从而增强各个程序的功能。
    在这里插入图片描述

    • Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。
    • Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox等其它软件没有什么区别。然而Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用Linux,不启动 Shell 的话,用户就没办法使用 Linux。

    Shell 是如何连接用户和内核的?

    shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 Shell 的认知。

    你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?

    其实,Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。

    接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。

    4、用户态到内核态怎样切换?

    • Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态用户态
    • 运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制,而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制。
    • 很多程序开始时运行于用户态,但在执行的过程中,一些操作需要在内核权限下才能执行,这就涉及到一个从用户态切换到内核态的过程
      • 比如C函数库中的内存分配函数malloc(),它具体是使用sbrk()系统调用来分配内存,当malloc调用sbrk()的时候就涉及一次从用户态到内核态的切换,
      • 类似的函数还有printf(),调用的是wirte()系统调用来输出字符串,等等。
        在这里插入图片描述
        U ——user(用户), K——kernal(内核)

    从用户态到内核态切换可以通过三种方式:

    • 系统调用:其实系统调用本身就是中断,但是软件中断,跟硬中断不同。
    • 异常: 当CPU正在执行运行在用户态的程序时,突然发生某些预先不可知的异常事件,这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件,典型的如缺页异常
    • 外设中断(硬中断):当外围设备完成用户的请求操作后,会像CPU发出中断信号,此时,CPU就会暂停执行下一条即将要执行的指令,转而去执行中断信号对应的处理程序,如果先前执行的指令是在用户态下,则自然就发生从用户态到内核态的转换。

    注意:

    • 系统调用的本质其实也是中断,相对于外围设备的硬中断,这种中断称为软中断,这是操作系统为用户特别开放的一种中断,如Linux int 80h中断。
    • 从触发方式和效果上来看,这三种切换方式是完全一样的,都相当于是执行了一个中断响应的过程。但是从触发的对象来看,系统调用是进程主动请求切换的,而异常和硬中断则是被动的

    参考

    1、https://www.cnblogs.com/bakari/p/5520860.html
    2、https://zhuanlan.zhihu.com/p/69554144
    3、https://www.cnblogs.com/maxigang/p/9041080.html

    展开全文
  • 用户态和内核态 中断处理机制

    千次阅读 2021-01-15 22:57:54
    1.1 用户态和内核态 1.1.1 定义:什么是用户态和内核态? Kernel 运行超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,多数应用程序应该运行最小权限下。因此,很多操作系统,将...

    操作系统

    一、操作系统基础知识

    1.1 用户态和内核态

    1.1.1 定义:什么是用户态和内核态?

    Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,多数应用程序应该运行在最小权限下。因此,很多操作系统,将内存分成了两个区域:

    • 内核空间(Kernal Space),这个空间只有内核程序可以访问;

    • 用户空间(User Space),这部分内存专门给应用程序使用。

    image-20210114145732019

    1.1.2 用户态和内核态

    用户空间中的代码被限制了只能使用一个局部的内存空间,我们说这些程序在用户态(User Mode) 执行。

    内核空间中的代码可以访问所有内存,我们称这些程序在内核态(Kernal Mode) 执行。

    系统调用过程
    如果用户态程序需要执行系统调用,就需要切换到内核态执行。下面我们来讲讲这个过程的原理。

    如上图所示:内核程序执行在内核态(Kernal Mode),用户程序执行在用户态(User Mode)。当发生系统调用时,用户态的程序发起系统调用。因为系统调用中牵扯特权指令,用户态程序权限不足,因此会中断执行,也就是 Trap(Trap 是一种中断)。

    发生中断后,当前 CPU 执行的程序会中断,跳转到中断处理程序。内核程序开始执行,也就是开始处理系统调用。内核处理完成后,主动触发 Trap,这样会再次发生中断,切换回用户态工作。

    1.2 中断

    1.2.1 中断机制的产生

    早期计算机各个程序只能串行执行、系统资源利用低。为了解决上述问题,人们就发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。

    中断是多程序并发执行的前提条件。

    (1) 以两个进程并发运行为例,进程1在用户态运行了一段时间后,CPU会接收到计时部件(操作系统内核的时钟管理部件)发出的中断信号,表示进程1已经用完了一个时间片,CPU会切换到内核态,把CPU的使用权限交还给操作系统,操作系统内核就会对刚才的中断进行处理,操作系统知道进程1的时间片用完,就需要切换进程,在完成切换进程的一系列工作后,操作系统又会将CPU的使用权交还给用户进程。
    (2) 接着进程2拿到CPU执行权就会在用户态下执行,进程2执行一段时间后,进程2发出系统调用(内中断信号),请求输出,主动要求操作系统介入工作,CPU会立即切换到内核态,把权限交还给操作系统,操作系统内核接管进程2系统调用请求,调用IO设备开始输出工作,然后操作系统交还CPU执行权,IO设备也会并行执行,进程2需要等待IO操作完成,所以进程1拿到CPU执行权开始运行。当执行一段时间后,IO操作完成,IO设备向CPU发送一个中断信号,此时CPU由用户态再次转换为内核态,对刚才的中断信号处理,由于IO操作完成,所以操作系统知道进程2可以恢复运行了,以完成后续工作,所以操作系统再次交还CPU执行权,让进程2再次运行。

    (1) 当中断发生时,CPU立即进入内核态。
    (2) 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进程处理。
    (3) 对于不同的中断信号,会进行不同的处理。

    1.2.2 中断的本质

    发生中断就意味着需要操作系统介入,开展管理工作。
    当发生了中断,就意味着需要操作系统的介入,开展管理工作。由于操作系统的管理工作(**如进程切换、分配IO设备)需要使用特权指令,因此CPU要从用户态转换为核心态。**中断就可以使CPU从用户态转换为核心态,使操作系统获得计算机的控制权。因此,有了中断,才能实现多道程序并发执行。
    用户态到核心态的转换就是通过中断机制实现的,并且中断是唯一途径。
    核心态到用户态的切换时通过执行一个特权指令,将程序状态字(PSW)标志位设置为用户态。

    1.2.3 中断的分类

    1.2.3.1 内中断和关中断

    中断可以分为:内中断和外中断。
    内中断:内中断的信号来源于CPU内部、与当前执行的指令有关。如整数除0。

    • 除数为零、操作数溢出等算术异常:简单处理,报告用户;也可以由用户编写中断续元程序处理

    • 非法指令、用户态使用特权指令、地址越界、非法存取等指令异常:终止进程

    • 终止进程指令:终止进程

    • 虚拟地址异常:调整内存后重新执行指令

      外中断:外中断的信号来源于CPU外部、与当前执行的指令无关。如用户强制结束一个进程、IO设备完成操作发生的中断信号。

    • 由外围设备发出的信号引起的中断事件

      • 时钟中断、间隔时钟中断:记时与时间片处理
      • 设备报到与结束中断:调整设备表
      • 键盘/鼠标信号中断:根据信号做出相应反映
      • 关机/重启动中断:写回文件,停止设备与CPU
    1.2.3.2 开中断和关中断

    ​ 关中断和开中断其实就是像我们生活中的开关一样。 关中断是为了保护一些不能中途停止执行的程序而设计的,计算机的CPU进行的是时分复用,即每个时钟周期内,CPU只能执行一条指令。在多道程序设计的环境下(就是我们通常所说的多个程序同时运行时),CPU是不断地交替地将这些程序的指令一条一条的分别执行,这样从宏观上看我们就感觉多个程序是在同时执行,但从微观上看则是CPU在不同的时间段(极短)内执行着不同程序的单条指令。而CPU在这些指令之间的切换就是通过中断来实现的。

    关中断就是为了让CPU在一段时间内执行同一程序的多条指令而设计的,比如在出现了非常事件后又恢复正常时,CPU就会忙于恢复非常事件出现之前计算机的工作环境(通常叫做恢复现场),在恢复现场的时候,CPU是不允许被其他的程序打扰的,此时就要启动关中断,不再相应其他的请求。当现场恢复完毕后,CPU就启动开中断,其他等待着的程序的指令就开始被CPU执行,计算机恢复正常。

    1.2.4 中断的处理过程

    • 情况一:对于某些中断,在处理完毕后,直接返回刚刚被中断的进程

    • 情况二:对于其他一些中断,要中断当前进程的运行,调整进程队列,启动进程调度,选择下一个执行的进程并恢复其执行

      (1) 执行完每个指令后,CPU都要检查当前是否有外部中断信号。
      (2) 如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器、各种通用寄存器)。
      (3) 根据中断信号类型转入相应的中断处理程序。
      (4) 恢复进程的CPU环境并退出中断,返回原进程继续往下执行。

    【中断屏蔽】

    • 当计算机检测到中断时,中断装置通过中断屏蔽位决定是否响应已发生的中断
    • 有选择的响应中断

    【中断优先级】

    • 当计算机同时检测到多个中断时,中断装置响应中断的顺序
    • 有优先的的响应中断
    • 一种可能的处理次序
      • 处理机硬件故障中断事件、自愿性中断事件、程序性中断事件、时钟中断等外部中断事件、输入输出中断事件、重启动和关机中断事件
    • 不同类型的操作系统有不同的中断优先级

    【中断的嵌套处理】

    • 当计算机响应中断后,在中断处理过程中,可以再响应其他中断
    • 操作系统是性能攸关程序,且中断响应处理有硬件要求,考虑系统效率和实现代价问题,中断的嵌套处理应限制在一定层数内,如3层
    • 中断的嵌套处理改变中断处理次序,先响应的有可能后处理

    【多中断的响应与处理】

    • 决定中断处理次序的因素
      • 中断屏蔽可以使中断装置不响应某些中断
      • 中断优先级决定了中断装置响应中断的次序
      • 中断可以嵌套处理,但嵌套的层数应有限制
      • 中断的嵌套处理改变了中断处理的次序

    【多重中断处理-1】

    • X、Y两个中断同时发生
    • 先响应X
    • 因Y被屏蔽,继续处理X
    • 再响应并处理Y

    【多重中断处理-2】

    • X、Y两个中断同时发生
    • 根据中断优先级,先响应X
    • 因未屏蔽Y,再响应并处理Y
    • Y处理完成后,再处理X

    1.2.5 中断、异常和系统异常区别

    • 狭义的中断来源于处理器之外的中断事件,即与当前运行指令无关的中断事件,如I/O中断、时钟中断、外部信号中断等
    • 异常(来源于CPU内部的中断事件,和狭义共同构成广义的中断)指当前运行指令引起的中断事件,如地址异常、算术异常、处理器硬件故障等
    • 系统异常与硬件无关,系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等

    1.2.5 总结

    (1) 中断是为了实现多道程序并发执行而引入的一种技术。
    (2) 中断的本质就是发生中断时需要操作系统介入开展管理工作。
    (3) 发生CPU会立即进入核心态,针对不同的中断信号,采取不同的处理方式。
    (4) 中断是CPU从用户态进入核心态的唯一途径。
    (5) 中断分为内中断和外中断。
    (6) 进程中断时,操作系统会保存CPU的运行环境,如程序状态字(PSW)、程序计数器、各种通用寄存器,这是为了当进程再次运行时可以从中断的状态处继续运行。

    展开全文
  • 用户态与内核态之间切换详解

    千次阅读 2021-08-29 14:00:25
    当用户尝试调用内核方法的时候,就会发生用户态切换到内核态的转变。 切换流程: 1、每个线程都对应这一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。 2、因为从用户态切换到...

    用户空间和内核空间

    用户程序有用户态内核态两种状态。用户态就是执行在用户空间中,不能直接执行系统调用。必须先切换到内核态,也就是系统调用的相关数据信息必须存储在内核空间中,然后执行系统调用。

    操作硬盘等资源属于敏感操作,为了内核安全,用户线程不能直接调用。而是采用了操作系统内核提供了系统调用接口,用户线程通过系统调用来实现文件读写。所以直接与硬盘打交道的是操作系统内核。

    操作系统将线程分为了内核态和用户态,当用户线程调用了系统调用的时候,需要将线程从用户态切换到内核态。

    无论是操作系统内核程序还是用户程序在运行的时候都需要申请内存来保存运行状态,调用方法信息、程序代码、数据等信息。

    操作系统将内存分为内核空间用户空间

    内核空间中主要负责 操作系统内核线程以及用户程序系统调用

    用户空间主要负责用户程序的非系统调用

    内核空间用户空间拥有更高的操作级别,只有在内核空间中才可以调用操作硬件等核心资源。

    操作系统将内存按1:3的比例分为了内核空间和用户空间,用户态的运行栈信息保存在用户空间中,内核态的运行栈信息保存在内核空间中。运行栈中保存了当前线程的运行信息,比如执行到了哪些方法,局部变量等。

    当发生用户态和内核态之间的切换的时候,运行栈的信息发生了变化,对应的CPU中的寄存器信息也要发生变换。但是用户线程完成系统调用的时候,还是要切换回用户态,继续执行代码的。所以要将发生系统调用之前的用户栈的信息保存起来,也就是将寄存器中的数据保存到线程所属的某块内存区域。这就涉及到了数据的拷贝,同时用户态切换到内核态还需要安全验证等操作。所以用户态和内核态之间的切换是十分耗费资源的。

    用户态切换到内核态

    在这里插入图片描述

    CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0.

    每个线程都对应着一个用户栈和内核栈,分别用来执行用户方法和内核方法。
    用户方法就是普通的操作。
    内核方法就是访问磁盘、内存分配、网卡、声卡等敏感操作。

    当用户尝试调用内核方法的时候,就会发生用户态切换到内核态的转变。

    切换流程:
    1、每个线程都对应这一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。

    在这里插入图片描述

    2、因为从用户态切换到内核态时,首先用户态可以直接读写寄存器,用户态操作CPU,将寄存器的状态保存到对应的内存中,然后调用对应的系统函数,传入对应的用户栈的PC地址和寄存器信息,方便后续内核方法调用完毕后,恢复用户方法执行的现场。

    3、将CPU的字段改为内核态,将内核段对应的代码地址写入到PC寄存器中,然后开始执行内核方法,相应的方法栈帧时保存在内核栈中。

    4、当内核方法执行完毕后,会将CPU的字段改为用户态,然后利用之前写入的信息来恢复用户栈的执行。

    从上述流程可以看出用户态切换到内核态的时候,会牵扯到用户态现场信息的保存以及恢复,还要进行一系列的安全检查,比较耗费资源。

    展开全文
  • 用户态和内核态区别

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

    千次阅读 2021-03-19 10:48:38
    什么是用户态和内核态 从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。 那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,...
  • 用户态:当进程执行用户自己的代码时,则称其处于用户态,这时cpu 访问资源有限,运行在用户态下的程序能直接访问操作系统内核数据结构和程序。 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,...
  • 什么是用户态和内核态?

    千次阅读 2021-08-27 10:17:07
    用户态:处于用户态的 CPU 只能受限的访问内存,并且允许访问外围设备,用户态下的 CPU 允许独占,也就是说 CPU 能够被其他程序获取。 那么为什么要有用户态和内核态呢? 这个主要是访问能力的限制的考量,...
  • 线程用户态和内核态

    千次阅读 2019-05-14 13:59:52
    用户态: 只能受限的访问内存, 且允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 (2)为什么需要用户态和内核态? —>由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存...
  • 文章来源于 拉钩教育 重学操作系统 林䭽 用户态和内核态:用户态线程和内核态线程有什么区别? 什么是用户态和内核态 Kernel 运行超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,...
  • 用户态和内核态的区别

    千次阅读 2021-02-16 20:14:22
    用户态(User Mode):运行用户程序 二、指令划分 特权指令:只能由操作系统使用、用户程序能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置时钟 允许/禁止终端 停机 非特权指令:用户程序可以使用...
  • TCP/IP协议栈到底是内核态的好还是用户态的好?

    万次阅读 多人点赞 2018-06-02 08:10:51
    “TCP/IP协议栈到底是内核态的好还是用户态的好?”这根本就是一个错误的问题,问题的根源在于,干嘛非要这么刻意地去区分什么内核态和用户态。 引子 为了让本人成为干巴巴的说教,文章开头,我以一个实例...
  • 若中断时,进程执行用户态的代码,该中断会引起CPU特权级从3级到0级的切换,此时CPU会进行堆栈的切换,CPU会从当前任务的TSS中取到新堆栈的段选择符和偏移值;CPU首先会把原用户态的堆栈指针ss和esp压入内核态堆栈...
  • 1、用户态和内核态的区别? 明白这两个概念之前,我们得...用户空间下执行,我们把此时运行得程序的这种状态成为用户态,而当这段程序执行内核的空间执行时,这种状态称为内核态。 当一个任务(进程)执行系统...
  • 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: ...
  • 什么是用户态与内核态

    千次阅读 2019-08-14 14:26:19
    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: ...
  • 当CPU执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此。异常的内核相关程序中,也就到了内核态,比如缺页异常。 3、外围设备的中断 当外围设备完成用户请求的操作...
  • 内核态: 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态。此时处理器处于特权级最高的(0级)内核代码中执行。...用户态: 每个进程都有自己的内核栈。当进程执行用...
  • 内核态和用户态的区别

    千次阅读 2018-05-25 11:06:02
    当一个任务(进程)执行系统调用而...当进程执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序...
  • Linux的内核态与用户态

    千次阅读 2021-12-12 22:36:02
    引言:最近看Java内置锁的实现时看到重量级锁的性能开销较大,主要因为使用重量级锁需要用到一个pthread_mutex_lock系统调用,导致Java程序需要在用户态和内核态之间切换,由于太了解用户态和内核态到底是什么,...
  • Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。用户态与内核态内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活...
  • 用户态和系统态的三种切换方式用户态和系统态切换耗时原因:用户态和系统态切换时寄存器简单变化: 定义: 用户态指非特权状态。此状态下,执行的代码被硬件限定,能进行某些操作,比如写入其他进程的存储空间,以...
  • 内核态,用户态,目态,管态

    千次阅读 2018-01-24 15:41:59
    ,管 ...大多数计算机系统将CPU执行状态分为目与管。...CPU交替执行操作系统程序和用户程序。...管又叫特权,系统或核心态。CPU下可以执行指令系统的全集。通常,操作系统下运行。 
  • 用户态与内核态

    千次阅读 2018-09-21 11:17:31
    当程序运行3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大...运行在用户态下的程序能直接访问操作系统内核数据结构和程序。 当我们系统中执行一个程序时,...
  • 用户态和内核态切换

    千次阅读 2020-12-22 21:30:27
    异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,会触发由当前运行进程切换到处理此异常的内核相关进程中 外围设备中断:外围设备完成用户请求的操作之后,会向CPU发出中断信号,这
  • 这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样的对应关系? ...
  • Java线程中的用户态和内核态

    千次阅读 2021-05-04 14:26:35
    用户态相比内核态有较低的执行权限,很多操作是被操作系统允许的,简单来说就是用户态只能访问内存,防止程序错误影响到其他程序,而内核态则是可以操作系统的程序和普通用户程序 内核态: cpu可以访问计算机所有的...
  • 用户态是怎么切换到核心态的?

    千次阅读 2020-07-13 11:47:16
    简答来说,用户态和核心态的区别就是:两者的操作权限不同,用户态的进程能够访问的资源受到了极大的控制,而运行在内核态的进程可以“为所欲为”。我们所说的内核,它本质上是一种特殊的软件程序,特殊哪儿呢?...
  • 一、背景--线程状态切换的代价 ...用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。 synch...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,815
精华内容 51,926
关键字:

不可能在用户态发生的事件是

友情链接: AdbeRdr11000_zh_CN.zip