精华内容
下载资源
问答
  • 内核态与用户态1 概念Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念,即与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级,...

    内核态与用户态

    6f0e73bc6c2c7837dfd358b2155d0c5c.png

    1 概念

    Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念,即与系统相关的一些特别关键的操作必须由最高特权的程序来完成。

    Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态(Kernel Mode)与用户态(User Mode)。

    内核态:CPU可以访问内存所有数据,包括外围设备(硬盘、网卡),CPU也可以将自己从一个程序切换到另一个程序;

    用户态:只能受限的访问内存,且不允许访问外围设备,占用CPU的能力被剥夺,CPU资源可以被其他程序获取;

    Linux中任何一个用户进程被创建时都包含2个栈:内核栈,用户栈,并且是进程私有的,从用户态开始运行。内核态和用户态分别对应内核空间与用户空间,内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。

    2 内核空间相关

    内核空间:存放的是内核代码和数据,处于虚拟空间;

    内核态:当进程执行系统调用而进入内核代码中执行时,称进程处于内核态,此时CPU处于特权级最高的0级内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈;

    CPU堆栈指针寄存器指向:内核栈地址;

    内核栈:进程处于内核态时使用的栈,存在于内核空间;

    处于内核态进程的权利:处于内核态的进程,当它占有CPU的时候,可以访问内存所有数据和所有外设,比如硬盘,网卡等等;

    3 用户空间相关

    用户空间:存放的是用户程序的代码和数据,处于虚拟空间;

    用户态:当进程在执行用户自己的代码(非系统调用之类的函数)时,则称其处于用户态,CPU在特权级最低的3级用户代码中运行,当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态,因为中断处理程序将使用当前进程的内核栈;

    CPU堆栈指针寄存器指向:用户堆栈地址;

    用户堆栈:进程处于用户态时使用的堆栈,存在于用户空间;

    处于用户态进程的权利:处于用户态的进程,当它占有CPU的时候,只可以访问有限的内存,而且不允许访问外设,这里说的有限的内存其实就是用户空间,使用的是用户堆栈;

    4 内核态和用户态的切换

    (1)系统调用

    所有用户程序都是运行在用户态的,但是有时候程序确实需要做一些内核态的事情,例如从硬盘读取数据等。而唯一可以做这些事情的就是操作系统,所以此时程序就需要先操作系统请求以程序的名义来执行这些操作。这时需要一个这样的机制:用户态程序切换到内核态,但是不能控制在内核态中执行的指令。这种机制叫系统调用,在CPU中的实现称之为陷阱指令(Trap Instruction)。

    (2)异常事件

    当CPU正在执行运行在用户态的程序时,突然发生某些预先不可知的异常事件,这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件,典型的如缺页异常。

    (3)外围设备的中断

    当外围设备完成用户的请求操作后,会像CPU发出中断信号,此时,CPU就会暂停执行下一条即将要执行的指令,转而去执行中断信号对应的处理程序,如果先前执行的指令是在用户态下,则自然就发生从用户态到内核态的转换。

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

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

    2017-11-07 03:28:14
    内核态与用户态 1 概念 Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念,即与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级...
        

    内核态与用户态

    1 概念

    Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念,即与系统相关的一些特别关键的操作必须由最高特权的程序来完成。
    Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态(Kernel Mode)用户态(User Mode)

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

    Linux中任何一个用户进程被创建时都包含2个栈:内核栈,用户栈,并且是进程私有的,从用户态开始运行。内核态和用户态分别对应内核空间与用户空间,内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。

    2 内核空间相关

    • 内核空间:存放的是内核代码和数据,处于虚拟空间;
    • 内核态:当进程执行系统调用而进入内核代码中执行时,称进程处于内核态,此时CPU处于特权级最高的0级内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈;
    • CPU堆栈指针寄存器指向:内核栈地址;
    • 内核栈:进程处于内核态时使用的栈,存在于内核空间;
    • 处于内核态进程的权利:处于内核态的进程,当它占有CPU的时候,可以访问内存所有数据和所有外设,比如硬盘,网卡等等;

    3 用户空间相关

    • 用户空间:存放的是用户程序的代码和数据,处于虚拟空间;
    • 用户态:当进程在执行用户自己的代码(非系统调用之类的函数)时,则称其处于用户态,CPU在特权级最低的3级用户代码中运行,当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态,因为中断处理程序将使用当前进程的内核栈;
    • CPU堆栈指针寄存器指向:用户堆栈地址;
    • 用户堆栈:进程处于用户态时使用的堆栈,存在于用户空间;
    • 处于用户态进程的权利:处于用户态的进程,当它占有CPU的时候,只可以访问有限的内存,而且不允许访问外设,这里说的有限的内存其实就是用户空间,使用的是用户堆栈;

    4 内核态和用户态的切换

    (1)系统调用

    所有用户程序都是运行在用户态的,但是有时候程序确实需要做一些内核态的事情,例如从硬盘读取数据等。而唯一可以做这些事情的就是操作系统,所以此时程序就需要先操作系统请求以程序的名义来执行这些操作。这时需要一个这样的机制:用户态程序切换到内核态,但是不能控制在内核态中执行的指令。这种机制叫系统调用,在CPU中的实现称之为陷阱指令(Trap Instruction)。

    (2)异常事件

    当CPU正在执行运行在用户态的程序时,突然发生某些预先不可知的异常事件,这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件,典型的如缺页异常。

    (3)外围设备的中断

    当外围设备完成用户的请求操作后,会像CPU发出中断信号,此时,CPU就会暂停执行下一条即将要执行的指令,转而去执行中断信号对应的处理程序,如果先前执行的指令是在用户态下,则自然就发生从用户态到内核态的转换。

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

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

    万次阅读 2013-06-12 22:27:58
    用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射... 内核态:Ring0在处理器的存储保护中,核心态,或者特权态(之相对应的是用户态),是操作系统内核所运行的模式。运行在该模式的代码
            用户态: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时钟。

    展开全文
  • 内核态与用户态: 用户态如何切换到内核态? 发起系统调用。fwrite write read memcpy(中间两个是系统调用) 重定向:改变数据流向,将写入指定文件的数据,改变之后写入到另外一个文件 重定向指的是描述符的重定向—...

    内核态与用户态:
    用户态如何切换到内核态?
    发起系统调用。fwrite write read memcpy(中间两个是系统调用)

    重定向:改变数据流向,将写入指定文件的数据,改变之后写入到另外一个文件
    重定向指的是描述符的重定向—因为描述符并没有改变,改变的是描述符所对应的文件信息(1号座位的故事)

    如何实现重定向:
    1)通过close实现
    2)还可以通过重定向接口实现:dup2(int oldfd ,int newfd)。 让newfd也指向了oldfd所指的文件,如果newfd本身也打开了一个文件,则关闭newfd所指向的文件,此时newfd和oldfd都指向了oldfd所指向的文件

    minishell中的重定向实现:
    Ls -l >> test.txt

    在命令字符串中若有重定向符号

    追加重定向
    清空重定向
    如果遇到符号,则从符号其实位置进行截断,前边是命令,后边是重定向文件
    字符串检测>>:重定向符号之前是命令及参数,按照原先解析方式进行解析即可。
    重定向符号>>之后,有要重定向的文件名称
    在子进程中,进行程序替换之前
    按照重定向方式(追加/清空)打开文件,dup2(fd,1)
    因为ls浏览目录的内容—实际上就是将目录中的文件名称打印到标准输出
    重定向的操作就是,将要打印到标准输出的数据写入到新文件中
    因此子进程的操作就是:打开新文件–》标准输出重定向dup2()

    展开全文
  • 完整的linux使用eventfd进行用户态与内核态通信代码,里面还涉及linux用户态线程亲核,以及对应内核态线程亲核问题。初学者,写了好几天,亲测,可用
  • [转]用户态与内核态

    2019-03-09 13:29:00
    Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态(Kernel Mode)与用户态(User Mode)。 内核态:CPU可以访问内存所有数据...
  • 几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,例如iprote2网络管理工具,它与内核的交互就全部使用了netlink,著名的内核包过滤框架Netfilter在与用户空间的通读,也在最新版本中改变为...
  • 用户态内核态

    2019-06-13 23:56:43
    Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态(Kernel Mode)与用户态(User Mode)。 1.用户态(或用户空间):存放的是用户程序的...
  • 几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,例如iprote2网络管理工具,它与内核的交互就全部使用了netlink,著名的内核包过滤框架Netfilter在与用户空间的通读,也在最新版本中改变为...
  • 用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,...内核态:Ring0在处理器的存储保护中,核心态,或者特权态(之相对应的是用户态),是操作系统内核所运行的模式。运行在该模式的代码,可以无限制...
  • 本文对Atheros源码进行分析。 每个无线设备拥有一些不被标准无线扩展包含的特定功能。私有ioctl允许设备导出驱动的特定功能,使得用户直接... 无线标准ioctl用户态工具对应iwconfig;  无线私有ioctl用户态
  • **用户态:**Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问...**内核态:**Ring0在处理器的存储保护中,核心态,或者特权态(之相对应的是用户态),是操作系统内核所运行的模式。运行在该模式的代
  • 目录内核空间和用户空间为什么需要区分内核空间与用户空间内核态与用户态如何从用户空间进入内核空间整体结构总结另一种说法一、4G地址空间解析二、虚拟地址空间分配及其与物理内存对应图三、物理内存分配图 ...
  • 内核空间与用户空间

    2019-03-15 17:16:00
    关于虚拟内存有三点需要注意: ...例外情况只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。 用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是...
  • 发现用户态通过aio读取到的bluestore数据crc检验失败,业务怀疑是内核态返回给用户的数据有问题,可在块设备的bio完成回调函数中直接读取bio对应page的数据,与用户态读取的数据比较,排除内核态的问题。 上述...
  • 最近在写一个linux驱动时,为了省事,ioctl的cmd参数直接使用宏定义的方式从0开始定义,但是调试程序时发现,当cmd=2时,在用户层调用ioctl却始终无法调用与用户态对应内核态的ioctl函数,经常查阅资料发现,ioctl...
  • 进程家族树Unix系统的进程之间存在一个明显的继承关系,所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程,然后init进程读取系统的初始化...idle进程由系统创建,运行在内核态,其PID...
  • 一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。 少数应用场景下,用户可能会关心,比如在用户态做DMA的场景(如DPDK之类的)。还有一些场景,比如想调试...
  • 内核线程与用户线程的区别

    千次阅读 2012-08-19 14:53:23
    根据操作系统内核是否对线程可感知,可以把线程分为内核线程和...和内核线程相对应的是用户线程,用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调
  • 内核空间和用户空间

    2020-11-26 12:13:24
    内核态与用户态 如何从用户空间进入内核空间 整体结构 总结 另一种说法 一、4G地址空间解析 二、虚拟地址空间分配及其与物理内存对应图 三、物理内存分配图 内核空间和用户空间  对 32 位操作系统而言,...
  • 内核空间 用户空间

    2018-12-05 16:21:48
    关于虚拟内存有三点需要注意: ...例外情况只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。  用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;...
  • 用户态和核心态

    2019-07-27 22:21:27
    用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址... 核心态:Ring0 在处理器的存储保护中,核心态,或者特权态(之相对应的是用户态),是操作系统内核所运行的模式。运行在该...
  • - 用户态与内核态对应的低级别指令,代码能够掌控的范围会受到限制。 - 中断:中断处理是用户态进入内核态的主要方式。系统调用是特殊的中断(用户态程序在执行过程中,调用了一个系统调用,陷入了内核态)。 ...
  • Linux操作系统只采用了其中的0和3两个特权级别,分别对应内核态用户态内核态对应高执行级别,代码可以执行特权指令,访问任意物理内存,CPU执行级别对应内核态内核态的CS:EIP指...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 178
精华内容 71
关键字:

内核态与用户态对应