精华内容
下载资源
问答
  • Linux 内核态与用户态

    万次阅读 2013-06-12 22:27:58
    用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定...
            用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问
    

        内核态:Ring0在处理器的存储保护中,核心态,或者特权态(与之相对应的是用户态),是操作系统内核所运行的模式。运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问

    一、用户态和内核态

    现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在级特权级上时,就可以称之为运行在内核态。

    虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。

    当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。

     

    二、用户态切换到内核态的3种方

    1) 系统调用这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linuxint 80h中断

    2)     CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常

    3)     外围设备的中当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等

    3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

    三、具体的切换步骤:

    从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,关于它们的具体区别这里不再赘述。关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态的步骤主要包括:

      [1] 从当前进程的描述符中提取其内核栈的ss0esp0信息。

        [2] 使用ss0esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一

    条指令。

        [3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

        从用户态切换到核心态,要耗掉>100 cycle的CPU时钟。

    展开全文
  • 线程用户态和内核态

    千次阅读 2019-05-14 13:59:52
    用户态: 只能受限的访问内存, 且允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 (2)为什么需要用户态和内核态? —>由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存...

    (1)用户态和内核态的概念?

    —>内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序
    —>用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取

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

    (3)用户态与内核态的切换?
    所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作.

    这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令

    这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

    他们的工作流程如下:

    用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.
    用户态程序执行陷阱指令
    CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问
    这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
    系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果

    二:用户态和内核态的详细介绍?
    当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核 代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行 态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程 的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。

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

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

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

    1)例子

    void testfork(){
    if(0 = = fork()){
    printf(“create new process success!\n”);
    }
    printf(“testfork ok\n”);
    }
    

    这段代码很简单,从功能的角度来看,就是实际执行了一个fork(),生成一个 新的进程,从逻辑的角度看,就是判断了如果fork()返回的是0则打印相关语句,然后函数最后再打印一句表示执行完整个testfork()函数。代码 的执行逻辑和功能上看就是如此简单,一共四行代码,从上到下一句一句执行而已,完全看不出来哪里有体现出用户态和进程态的概念。

    如果说前面两种是静态观察的角度看的话,我们还可以从动态的角度来看这段代码,即它被转换成CPU执行的指令后加载执行的过程,这时这段程序就是一个动态执行的指令序列。而究竟加载了哪些代码,如何加载就是和操作系统密切相关了。

    2)特权级

    熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的 方式完成相应功能的,具体的工作是由sys_fork负责实施。其实无论是不是Unix或者Linux,对于任何操作系统来说,创建一个新的进程都是属于 核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪 个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲 突。

    特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很 多支持,就Intel x86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有 CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于 Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最 高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。

    3)用户态和内核态

    现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级 特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运 行在0级特权级上时,就可以称之为运行在内核态。

    虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不 同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序,比如上面例子中的testfork()就不能直接调用 sys_fork(),因为前者是工作在用户态,属于用户态程序,而sys_fork()是工作在内核态,属于内核态程序。

    当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系 统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态,比如testfork()最初运行在用户态进程下,当它调用fork()最终触发 sys_fork()的执行时,就切换到了内核态。

    2. 用户态和内核态的转换

    1)用户态切换到内核态的3种方式

    a. 系统调用

    这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使 用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户 特别开放的一个中断来实现,例如Linux的int 80h中断。

    b. 异常

    当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

    c. 外围设备的中断

    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会 暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到 内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

    这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

    2)具体的切换操作

    从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态 到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而 异常和中断的处理机制基本上也是一致的,关于它们的具体区别这里不再赘述。关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态 的步骤主要包括:

    [1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。

    [2] 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个

    过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一

    条指令。

    [3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始

    执行中断处理程序,这时就转到了内核态的程序执行了。

    补充:
    线程的上下文切换:
    CPU通过时间片段的算法来循环执行线程任务,而循环执行即每个线程允许运行的时间后的切换,而这种循环的切换使各个程序从表面上看是同时进行的。而切换时会保存之前的线程任务状态,当切换到该线程任务的时候,会重新加载该线程的任务状态。而这个从保存到加载的过程称之为上下文切换。

    • 若当前线程还在运行而时间片结束后,CPU将被剥夺并分配给另一个线程。
    • 若线程在时间片结束前阻塞或结束,CPU进行线程切换。而不会造成CPU资源浪费。

    因此线程切换是多个线程之间的操作,而线程核心态和用户态切换是一个线程执行时对于CPU使用的不同状态

    展开全文
  • 1、用户态和内核态的区别? 明白这两个概念之前,我们得...用户空间下执行,我们把此时运行得程序的这种状态成为用户态,而当这段程序执行内核的空间执行时,这种状态称为内核态。 当一个任务(进程)执行系统...

    1、用户态和内核态的区别?

    明白这两个概念之前,我们得知道用户空间内核空间

    用户空间:指的就是用户可以操作和访问的空间,这个空间通常存放我们用户自己写的数据等。

    内核空间:是系统内核来操作的一块空间,这块空间里面存放系统内核的函数、接口等。

    在用户空间下执行,我们把此时运行得程序的这种状态成为用户态,而当这段程序执行在内核的空间执行时,这种状态称为内核态。

    当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态。此时处理器处于特权级最高的(0级)内核代码。当进程处于内核态时,执行的内核代码会使用当前的内核栈。每个进程都有自己的内核栈。

    当进程在执行用户自己的代码时,则称其处于用户态。即此时处理器在特权级最低的用户代码中运行。当正在执行用户程序而突然中断时,此时用户程序也可以象征性地处于进程的内核态。因为中断处理程序将使用当前进程的内核态。

    延伸阅读:内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然联系,intel cpu提供Ring0-Ring3三种级别运行模式,Ring0级别最高,Ring3级别最低。Linux使用了Ring3级别运行用户态。Ring0作为内核态,没有使用Ring1和Ring2.Ring3不能访问Ring0的地址空间,包括代码和数量。Linux进程的4GB空间,3G-4G这1G部分大家是共享的,是内核态的地址空间,这里存放在整个内核代码和所有的内核模块,以及内核所维护的数据。用户运行一程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入1G的内核地址空间去执行这些代码完成操作,完成后,切换Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。

    2、用户态和内核态的转换

    用户态切换到内核态的3种方式:a.系统调用 b.异常  c.外围设备的中断

    a.系统调用

    这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。

    而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,该中断是程序人员自己开发出的一种正常的异常,这个异常具体就是调用int $0x80的汇编指令,这条汇编指令将产生向量为0x80的编程异常。(软中断)

    b.异常
    当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此
    异常的内核相关程序中,也就到了内核态,比如缺页异常(硬中断)。

    c.外围设备的中断
    当外围设备完成用户请求的操作之后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条将要执行的指令
    转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了有
    用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

    以系统调用函数open为例:简单图示

    (1)用户态:

    ① 触发0x80中断

    ②保存当前的运行位置,状态,数据

    ③将系统调用号保存到eax寄存器中

    触发0x80中断 由系统调用函数触发的中断 。实际上在内核中,  触发0x80中断之后才会有上面的两步 。

    (2)每一个中断号在内核中都有一个中断处理程序,中断处理程序是被内核调用来响应中断的

              通过该中断处理程序陷入内核

    (3)在内核中:①有系统调用表,用寄存器中的系统调用号对应一个系统调用函数

                              ②通过函数得到执行该系统调用函数会得到一个返回值fd

                              ③将fd的值用eax寄存器带出  

    在函数调用时int fd=open();open调用完之后才会将eax中的得到的返回值赋给fd,相当于是两个步骤

    只有0x80中断才是系统调用中断,类似的还有缺页中断它们所对应的中断号是不同的

    注释:在c语言中如何返回返回值:如果返回值小于四个字节通过eax寄存器带出  若在4-8之间用eax和ecx带出  大于8通过生成临时对象或者变量带出


     

     

    展开全文
  • 用户态与内核态

    2014-08-27 14:59:47
    当一个任务(进程)执行系统调用而...当进程执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序

    http://www.cnblogs.com/viviwind/archive/2012/09/22/2698450.html

    http://jakielong.iteye.com/blog/771663

    当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。 

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


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

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

    1)例子

    C代码  收藏代码
    1. void testfork(){  
    2. if(0 = = fork()){  
    3. printf(“create new process success!\n”);  
    4. }  
    5. printf(“testfork ok\n”);  
    6. }  
     

    这段代码很简单,从功能的角度来看,就是实际执行了一个fork(),生成一个新的进程,从逻辑的角度看,就是判断了如果fork()返回的是0则打印相关语句,然后函数最后再打印一句表示执行完整个testfork()函数。代码的执行逻辑和功能上看就是如此简单,一共四行代码,从上到下一句一句执行而已,完全看不出来哪里有体现出用户态和进程态的概念。

    如果说前面两种是静态观察的角度看的话,我们还可以从动态的角度来看这段代码,即它被转换成CPU执行的指令后加载执行的过程,这时这段程序就是一个动态执行的指令序列。而究竟加载了哪些代码,如何加载就是和操作系统密切相关了。

    2)特权级

    熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的方式完成相应功能的,具体的工作是由sys_fork负责实施。其实无论是不是Unix或者Linux,对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。

    特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就Intel x86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。

    3)用户态和内核态

    现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。

    虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序,比如上面例子中的testfork()就不能直接调用sys_fork(),因为前者是工作在用户态,属于用户态程序,而sys_fork()是工作在内核态,属于内核态程序。

    当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态,比如testfork()最初运行在用户态进程下,当它调用fork()最终触发sys_fork()的执行时,就切换到了内核态。

    2. 用户态和内核态的转换

    1)用户态切换到内核态的3种方式

    a. 系统调用

    这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

    b. 异常

    当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

    c. 外围设备的中断

    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

    这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

    2)具体的切换操作

    从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,关于它们的具体区别这里不再赘述。关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态的步骤主要包括:

    [1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。

    [2] 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个

    过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一

    条指令。

    [3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始

    执行中断处理程序,这时就转到了内核态的程序执行了。

    展开全文
  • TCP/IP协议栈到底是内核态的好还是用户态的好?

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

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

    千次阅读 2020-12-22 21:30:27
    异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,会触发由当前运行进程切换到处理此异常的内核相关进程中 外围设备中断:外围设备完成用户请求的操作之后,会向CPU发出中断信号,这
  • 内核态和用户态的区别

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

    千次阅读 2016-04-15 18:44:17
     内核态(Kernel Mode) 和 用户态(User Mode) 实际上是指 2 种不同的访问权限。  x86处理器包含 4 个不同的特权等级,分别是 Ring0~Ring3。Ring0下,可以执行特权级指令,对任何 I/O 设备都有访问权限,Ring3则...
  • 什么是用户态,什么是内核态,简单的来说就是程序
  • 内核态与用户态详解

    千次阅读 2016-09-22 22:38:51
    内核态与用户态是操作系统的两种运行...而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代
  • 用户态切换到内核态的3种方式

    千次阅读 2018-03-26 16:52:51
    a. 系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,... 当CPU执行运行在用户态下的程序时,发生了某些事先可知的异常,这时会触发...
  • 用户态和内核态的区别

    千次阅读 2018-08-30 09:10:25
    用户态和内核态的区别 你是世界的一杆称,一头重一头轻。 –RuiDer --大侄子的纪念日2018-8-27 before 本篇文章是我学习Java的synchornized锁底层原理时碰到的一个知识点,了解过synchornized底层...
  • 用户态与内核态的切换与区别

    万次阅读 2017-11-14 16:20:24
    内核态和用户态的区别 ...当进程执行用户自己的代码时,则称其处于用户态。即此时处理器特权级最低的用户代码中运行。当正 执行用户程序而突然中断时,此时用户程序也可以象征性地处于进程的内
  • 浅谈Linux用户态和内核态

    千次阅读 2016-09-14 12:03:11
    为什么要分用户态和内核态?  CPU 的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机 n 回就不足为奇了。...
  • 内核态,用户态,目态,管态

    千次阅读 2016-09-26 16:14:14
    目态,管态大多数计算机系统将CPU执行...目态又叫常态或用户态。机器处于目态时,程序只能执行非特权指令。用户程序只能目态下运行,如果用户程序目态下执行特权指令,硬件将发生中断,由操作系统获得控制,特权指
  • Linux内核态和用户态的切换

    千次阅读 2017-08-11 11:24:26
    当进程执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态...
  • 用户态切换至内核态

    2016-09-29 17:23:45
    1、发生系统调用时 这是处于用户态的进程主动...2、产生异常时 当CPU执行运行在用户态下的程序时,发生了某些事先可知的异常,这时会触发由当前运行的进程切换到处理此异常的内核相关的程序中,也就是转到了内核态
  • 要了解什么是用户态,什么是内核态,我们需要先了解什么是进程的用户空间和内核空间:Linux虚拟内存的大小为2^32(32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节(从虚地址0xC0000000到0...
  • 在用户态下使用gpio中断

    千次阅读 2018-01-10 10:28:07
    该框架使用sys文件系统把gpio暴露给用户态程序使用,本文介绍怎么在用户态下使用 gpio提供的中断功能。介绍使用的同时,介绍一些涉及到的内部的实现过程 1. 使用 确定你的gpio驱动是好用的,这时会
  • 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: ...
  • 从内核态切换到用户态

    千次阅读 2019-01-05 22:06:46
    1.用户态切换到内核态有三种方式 (1)系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用...当CPU执行运行在用户态下的程序时,发生了某些事先可知的异常,这时会触发...
  • Linux系统的内核态和用户态

    千次阅读 2017-10-10 17:19:01
     如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动...
  • 文章目录Unix/Linux的体系架构Linux系统调用简述系统调用号与系统调用表内核态与用户态内核态与用户态的转换 Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者...
  • 内核态 用户态 区别

    2013-08-25 17:42:19
    内核态和用户态区别 ...当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称...当进程执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器特权级最低的(3级)用户代码中运行

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,336
精华内容 45,334
关键字:

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