精华内容
下载资源
问答
  • 用户态和内核态的区别 1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用、用户程序不能使用的指令...

    用户态和内核态的区别

    1.操作系统需要两种CPU状态

    内核态(Kernel Mode):运行操作系统程序,操作硬件

    用户态(User Mode):运行用户程序

    2.指令划分

    特权指令:只能由操作系统使用、用户程序不能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置时钟 允许/禁止终端 停机

    非特权指令:用户程序可以使用的指令。 举例:控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态)

    3.特权级别

    特权环:R0、R1、R2和R3

    R0相当于内核态,R3相当于用户态;

    不同级别能够运行不同的指令集合;

    4.CPU状态之间的转换

    用户态--->内核态:唯一途径是通过中断、异常、陷入机制(访管指令)

    内核态--->用户态:设置程序状态字PSW

    5.内核态与用户态的区别

    • 内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态。因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;

    • 当程序运行在0级特权级上时,就可以称之为运行在内核态。

    • 运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。

    • 这两种状态的主要差别是

      • 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的
      • 处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。

    6. 通常来说,以下三种情况会导致用户态到内核态的切换

    • 系统调用

    这是用户态进程主动要求切换到内核态的一种方式用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。比如前例中fork()实际上就是执行了一个创建新进程的系统调用。

    而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

    用户程序通常调用库函数,由库函数再调用系统调用,因此有的库函数会使用户程序进入内核态(只要库函数中某处调用了系统调用),有的则不会。

    • 异常

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

    • 外围设备的中断

    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,

    如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

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

    展开全文
  • 在CPU所有指令中,有一些指令是非常危险,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。...所以,CPU将指令分为特权指令非特权指令,对于那些危险指令,只允许操作系统及其相关模块使用,普...


    在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。

        linux的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。

        当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(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、内核态,运行于进程上下文,内核代表进程运行于内核空间;

    2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

    3、用户态,运行于用户空间。

     

    从用户空间到内核空间有两种触发手段:

    1.用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。

    2.硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。

       一个程序我们可以从两种角度去分析。其一就是它的静态结构,其二就是动态过程。下图表示了用户态和内核态直接的关系(静态的角度来观察程序)

    展开全文
  • 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通过生成临时对象或者变量带出


     

     

    展开全文
  • 本文纯属个人见解,是对面前学习总结,如有描述不正确地方还请高手指正~ 当一个任务(进程)行执系统调用而堕入内核代码中行执时...当进程在行执用户自己代码时,则称其处于用户行运态(用户态)。即此时处置...

    本文纯属个人见解,是对面前学习的总结,如有描述不正确的地方还请高手指正~

        当一个任务(进程)行执系统调用而堕入内核代码中行执时,我们就称进程处于内核行运态(或简称为内核态)。此时处置器处于特权级最高的(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息信装入应相的寄存器,开始

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

    文章结束给大家分享下程序员的一些笑话语录: 大家喝的是啤酒,这时你入座了。
    你给自己倒了杯可乐,这叫低配置。
    你给自已倒了杯啤酒,这叫标准配置。
    你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。
    你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。
    你的同事给你倒了杯白酒,这叫推荐配置。
    菜过三巡,你就不跟他们客气了。
    你向对面的人敬酒,这叫p2p。
    你向对面的人敬酒,他回敬你,你又再敬他……,这叫tcp。
    你向一桌人挨个敬酒,这叫令牌环。
    你说只要是兄弟就干了这杯,这叫广播。
    有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。
    你的小弟们过来敬你酒,这叫一对多。
    你是boss,所有人过来敬你酒,这叫服务器。
    酒是一样的,可是喝酒的人是不同的。
    你越喝脸越红,这叫频繁分配释放资源。
    你越喝脸越白,这叫资源不释放。
    你已经醉了,却说我还能喝,叫做资源额度不足。
    你明明能喝,却说我已经醉了,叫做资源保留。
    喝酒喝到最后的结果都一样
    你突然跑向厕所,这叫捕获异常。
    你在厕所吐了,反而觉得状态不错,这叫清空内存。
    你在台面上吐了,觉得很惭愧,这叫程序异常。
    你在boss面前吐了,觉得很害怕,这叫系统崩溃。
    你吐到了boss身上,只能索性晕倒了,这叫硬件休克。

    转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/04/29/3050628.html

    展开全文
  • 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样对应关系? 内核响应系统调用是一个怎样过程? …… 而且这个问题还关联到了我们后面要学习多线程、I/O 模型、网络优化等。 所以这是一道很不错...
  • 1. 用户态和内核态的概念区别究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑...
  • 面试考点——用户态和内核态的区别

    万次阅读 多人点赞 2019-03-02 17:44:14
    在计算机系统中,通常运行着两类程序:系统程序和应用程序,为了保证系统程序不...在实际运行过程中,处理机会在系统态和用户态间切换。相应地,现代多数操作系统将 CPU 指令集分为特权指令和非特权指令两类。 1)...
  • java线程是映射到操作系统原生线程之上,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量系统资源,因为用户态内核态都有各自专用内存空间,专用寄存器等...
  • 多线程之:用户态和内核态的区别

    千次阅读 2016-06-07 17:45:00
    (1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序--->用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用...
  • 当一个任务(进程)执行系统调用而陷入...当进程在执行用户自己代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户...
  • 6.用户态和内核态的区别

    千次阅读 2014-08-07 09:45:00
    内核态用户态是操作系统两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通用户进程运行特权级,大部分用户直接面对程序都是运行在用户态;反之,当程序运行...
  • 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为...当进程处于内核态时,执行内核代码会使用当前进程内核栈。每个进程都有自己内核栈。当进程在执行用户自己代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 982
精华内容 392
关键字:

用户态和内核态的区别