精华内容
下载资源
问答
  • 什么是用户态和内核态
    千次阅读
    2021-08-27 10:17:07

    用户态和内核态是操作系统的两种运行状态。

    内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。

    用户态:处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,用户态下的 CPU 不允许独占,也就是说 CPU 能够被其他程序获取。 

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

    这个主要是访问能力的限制的考量,计算机中有一些比较危险的操作,比如设置时钟、内存清理,这些都需要在内核态下完成,如果随意进行危险操作,极容易导致系统崩坏。

    更多相关内容
  • CPU有4个运行级别,如下图,我们所说的内核就是Ring0当CPU运行ring0态的时候就是内核态(也就是CPL=0),此时拥有最 高的权限 而在用户态的时候就是CPL=3此时CPU处于用户态 再次提出几个问题解决...

            应该学习过一段时间的人,都能唱出来,低2GB是用户空间,高2GB是内核空间,我们如果在用户空间访问内核空间数据,直接给你一个0xC0000005异常,告诉你你没有权限访问,

           今天就给大家完全的解析什么是内核空间,什么是用户空间

    CPU有4个运行级别,如下图,我们所说的内核就是Ring0当CPU运行ring0态的时候就是内核态(也就是CPL=0),此时拥有最           高的权限

    而在用户态的时候就是CPL=3此时CPU处于用户态

        再次提出几个问题解决了这几个问题就解决了

    1.我在用户态访问高2GB内存会失败是因为我不是内核态所有访问失败的嘛?

    2.内核态真的只是高2GB的时候才能处于内核态嘛

     

    首先我使用用户态访问一个高2GB内存

    void  _declspec(naked) taolaoda(){
        __asm{
            pushad
            pushfd
            mov eax,0x8003f008
            mov ecx,[eax]
            mov edx,[eax+4]
            mov Vluae,ecx
            mov Vluae1,edx
            popfd
            popad
            retf
        }
    }
    int main(int argc, char* argv[])
    {
        char buf[6];
        char buf2[6];
        *((WORD*)&buf[4])=0x1b;                                                      //这个就是本来cs的选择子 没有改变  直接调用taolaoda函数也    是一样我用长调用的方式调用,是为了后面构造段描述符方便少该代码
        *((DWORD*)&buf[0])=(int)taolaoda;
        __asm{
            call buf;
        }
        printf("Vluae=%p  Vluae\n",Vluae,Vluae1);
        getchar();
        return 0;
    }

    结果是访问访问高2GB的   0xC0000005访问异常,这是谁不让我们访问?

    答案是页机制(没有学过页的不要紧后面我们会有一篇帖子专门介绍页),

     

      我通过Windug修改0x8003f000这个物理页的访问权看看,首先通过Windug输入 !process 0 0遍历所有进程,获得自己正在运行的Cr3,然后找到0x8003f000对应的物理页

    这我自己写的一个2-9-9-12地址拆分器

    看到下面红框起来的,可以看到找到了0x8003f000对应的物理页,数据吻合

    修改自己进程 0x8003f000对应的物理页PTE的属性 的第2位和第8位

    第2位是U/S  U/S位=1的时候  允许用户态访问CPL=3,(CPU允许CPL=0,1,2访问用户态)

                         U/S位=0的时候  允许内核态访问,此时只有CPL=0的时候访问这个页地址的时候才能通过

    第7位是G位  G=0给刷新一下CPU内部的TLB表,后面会将这章的重点是让我们明白 段和页的限制以及内核态用户态的是

    根据什么来定的

    修改PDE的属性    修改U/S=1

    这是接着上面0xC0000005运行的那个进程接着运行的没有重新运行

    这就是为什么高2GB用户态无法访问了,所有进程高2GB都是内核是共享的,操作系统通过页机制,

    把0x80000000-0xFFFFFFFF这些地址对应的物理页PTE,PDE的U/S设置0位只允许内核态访问呢就是CPL=0时候

    mov  eax,[0x8003f008]这条执行才能执行,或者把0x8003f000这个物理页的对应的PTE和PDE的 全都设置为U/S=1

    此时这条指令mov  eax,[0x8003f008],在CPL=0,1,2,3的时候都能访问。

            所以可以说是页机制将高2GB和第2GB数据分格开,由于操作系统将高2GB的内存的物理页PTE全都设置成了U/S=0只允许CPL=0的时候访问,所以高2GB又被一些人称为内核(因为此时候CPL=0才被称为内核的),https://blog.csdn.net/taolaodawho/article/details/108957337 这是我们写一的一篇段权限检查,里面描述了段机制做了什么,

    保护模式保护的是内存(和一些特权指令),段机制对保护内存做的不多,对内存的保护是页做的,能够将高2GB和第2GB分开,其实很多人对内核的理解都是有误的,本意应该是当CPU执行某条指令的时候 CPL的值,如果此时CPL=3就是用户态,CPL=0就是内核态,这说明的是CPU的状态,很多人却将其与内存对应起来,说高2GB是内核,(再次是申明一下内核态是CPU的状态,与内存无关),高2GB的内存别操作系统设置过物理页的属性,只允许CPL=0(内核态访问),而低2GBCPU运行与任何状态都可以访问,这就是页机制做的内存保护

    我们也谈一谈段对内存的保护,也有但是远远无法和页做的相比,段对内存就做就比如数据段(好你可以访问0x00000000-0xFFFFFFFF这4GB空间,以可读,或者可读可写的权限(段把内存看成一个整体,这个整体权限完全相同)),页是在段的基础上将分割成一个一个页(每个小页0x1024字节),每个一页都有它自己的属性,有的页只允许CPL=0的指令访问,有些页只读,有些页可读可写,所有说对内存的保护主要是页机制做的,因为段主要做的是加载段描述符,具有提权功能(会进行权限检查),

    我们构造一个系统段,调用们提权

    通过调用们提权后可以看到直接直接读高2GB内存的数据

    可以看到通过调用们提权后发现 调试的时候是WIndug内核调试器接受的调试信息,此时CPL=0就是内核态了,也就是说也可以访问高2GB内存了,结合所有应该能够明白了,权限说的是CPU的概念,访问不同内存需要的权限不同,所以CPL在不同级能够访问的数据不同,也有一写特权指令执行在内核态才能执行成功,段就是提升CPU权限的手段,当然也能降低。

    当段机制和页机制同时配合起来的时候,就有了高2GB是内核空间(只允许内核态访问 页限制),低2GB是用户空间(允许所有权限访问),用户空间中有些区域是只读区,有些可读可,这有是页机制的杰作

    上面的测试可以看到地址0x401050  处的指令也是在内核态,在很多正向人眼里这是用户空间,这说明他根本不知道什么是应用空间,内核空间,到这里大家应该能了解到那些是段机制做的了,那些事页机制做的。

     

     

    展开全文
  • 什么是用户态和内核态

    千次阅读 2021-03-19 10:48:38
    什么是用户态和内核态 从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。 那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,...

    什么是用户态和内核态

    在这里插入图片描述
    从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。
    那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,特殊在哪儿呢?控制计算机的硬件资源,例如协调CPU资源分配内存资源,并且提供稳定的环境供应用程序运行。

    用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。

    为什么要区分内核态和用户态

    往往我们的系统的资源是固定的,例如内存2G,CPU固定,磁盘2TB,网络接口固定。所以就需要操作系统对资源进行有效的利用。假设某个应用程序过分的访问这些资源,就会导致整个系统的资源被占用,如果不对这种行为进行限制和区分,就会导致资源访问的冲突。所以,Linux的设计的初衷:给不同的操作给与不同的“权限”。Linux操作系统就将权限等级分为了2个等级,分别就是内核态和用户态。

    各位有没有发现,前面讲了这么多内核态和用户态什么不同,其实用一句话就能概括:它们权限不同。用户态的进程能够访问的资源受到了极大的控制,而运行在内核态的进程可以“为所欲为”。一个进程可以运行在用户态也可以运行在内核态,那它们之间肯定存在用户态和内核态切换的过程。打一个比方:C库接口malloc申请动态内存,malloc的实现内部最终还是会调用brk()或者mmap()系统调用来分配内存。

    如何从用户态进入内核态

    • 系统调用:这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。例如fork()就是执行了一个创建新进程的系统调用。系统调用的机制和新是使用了操作系统为用户特别开放的一个中断来实现,所以系统调用本身就是中断,但是软件中断,跟硬中断不同。
    • 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
    • 外设中断:当外设完成用户的请求时,会向CPU发送中断信号。这时CPU会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序去执行,如果前面执行的指令时用户态下的程序,那么转换的过程自然就会是 由用户态到内核态的切换。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。

    这三种方式是系统在运行时由用户态切换到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。从触发方式上看,切换方式都不一样,但从最终实际完成由用户态到内核态的切换操作来看,步骤有事一样的,都相当于执行了一个中断响应的过程。系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本一致。

    转载自:https://zhuanlan.zhihu.com/p/69554144
    https://blog.csdn.net/qq_39823627/article/details/78736650

    展开全文
  • Linux 用户态和内核态由于 CPU 权限的限制,通信并不像想象中的使用进程间通信方式那么简单,今天这篇文章就来看看 Linux 用户态和内核态究竟有哪些通信方式。 我们平常在写代码时,一般是在用户空间,通过系统调用...
  • 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通过生成临时对象或者变量带出


     

     

    展开全文
  • 什么是内核态

    千次阅读 2018-04-06 12:15:40
    内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用。...当执行到内河空间的一段代码时,我们称程序处于内核态,而当程序执行到外部空间代码时,我们称程序处于用户态。 ...
  • Linux的内核态与用户态

    千次阅读 2021-12-12 22:36:02
    引言:最近在看Java内置锁的实现时看到重量级锁的性能开销较大,主要因为使用重量级锁需要用到一个pthread_mutex_lock系统调用,导致Java程序需要在用户态和内核态之间切换,由于不太了解用户态和内核态到底是什么,...
  • Linux下内核态-用户态高效易用的数据交互方法研究,徐明昆, 胡勇刚,Linux操作系统是一款单内核操作系统,它将各子系统包含在内核中,并为所有进程提供服务。为了保护子系统的安全,Linux将进程空间划分为��
  • 用户态和内核态的区别是,内核态运行操作系统程序,操作硬件,用户态运行用户程序;当程序运行在3级特权级上时,可以称之为运行在用户态,当程序运行在0级特权级上时,称之为运行在内核态。本文操作环境:windows10...
  • 内核态makefile指南

    2020-07-22 11:23:32
    内核态makefile指南:编译可加载的模块,所有在配置文件中标记为-m的模块将被编译成可加载模块.ko文件。如果需要将一个模块配置为可加载模块,需要在makefile中进行配置:obj-m += foo.o
  • 什么是内核态和用户态 这是程序运行的两种状态。要理解这两个状态首先要理解用户空间和内核空间。 Linux有4GB的地址空间,其中,0-3G是属于用户空间,3-4G是内核空间。 用户空间一般运行应用程序,内核空间一般运行...
  • 什么是用户态和内核态 Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,多数应用程序应该运行在最小权限下。因此,很多操作系统,将内存分成了两个区域: 内核空间...
  • 当一个任务(进程)执行系统调用而执行内核代码时,称进程处于内核内核态,此时处理器处于特权级最高的(0级)内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈...
  • 什么是用户态与内核态

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

    万次阅读 多人点赞 2018-04-13 20:33:38
    在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态。而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动。举例:intel x86 CPU有四种...
  • 什么是CPU的用户态和内核态

    千次阅读 2020-07-13 23:12:37
    之前学习并发的时候只知道挂起线程或者唤醒线程要从用户态转换到内核态,那么什么是用户态?什么是内核态?这也是一个频率较高的面试题。 首先在讲用户态和核心态的时候,为了更容易理解先说下什么是操作系统的特权...
  • 总的来说,操作系统为了保证安全,不混乱,把CPU分成了特权模式和用户模式,也就是内核态和用户态,在操作敏感地带时,只能由内核操作,或者用户向内核请求,内核操作完了传给用户,也就是说用户的操作是受限的,仅...
  • 用户态和内核态

    2020-12-02 00:02:21
    什么是内核态?CPU特权级:用户态和内核态从用户态进入内核态的方式系统调用异常中断用户态、内核态的具体切换过程结语 前言 在本文中,会涉及到中断,异常,系统调用等概念。在有些参考资料上,会将中断和系统调用...
  • 用户态与内核态之间切换详解

    千次阅读 2021-08-29 14:00:25
    用户态切换到内核态 CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0. 每个线程都对应着一个用户栈和内核栈,分别用来执行用户方法和内核方法。 用户方法就是普通...
  • 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态,这时cpu可以访问计算机的任何资源。 用户态变为内核态: a. 系统调用 这是用户态进程主动要求切换到内核态的一种方式,...
  • 文章目录前言一、用户态和内核态的区分二、为什么要区分用户态和内核CPU指令集权限三、用户态和内核态切换切换开销用户态到内核态切换的场景总结 前言 这篇文章记录笔者对于操作系统用户态和内核态的复习整理 一、...
  • 用户态与内核态用户态与内核态1、背景2、定义3、用户态访问内核态资源的方式3.1、系统调用3.2、库函数3.3、Shell脚本4、用户态到内核态怎样切换?参考 用户态与内核态 1、背景 当我们在写程序是,凡是涉及到IO读写、...
  • 这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态什么? 用户级线程和内核级线程是一个怎样的对应关系? ...
  • 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 二、指令划分 特权指令:只能由操作系统使用、用户程序不能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置...
  • 完整的linux使用eventfd进行用户态与内核态通信代码,里面还涉及linux用户态线程亲核,以及对应的内核态线程亲核问题。初学者,写了好几天,亲测,可用
  • 经过编译,synchronized标注的函数会加一个读写锁,一般不推荐使用,因为加锁解锁设计到内核态与用户态的转换,有时转化耗时比函数体执行时间还长,所以不推荐使用。 这个观点在学操作系统的时候作为常识被认知,那...
  • 文档中汇总了linux内核态中,出现竞态时,要用到的函数接口及其含义。设计到,中断使能禁止,自旋锁,读写锁,RCU,信号量,读写信号量,互斥量。
  • 用户态和内核态区别

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

    千次阅读 2020-12-22 21:30:27
    从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作: 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过。其实系统调用本身就是中断,但是软件中断,跟硬中断不同。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,817
精华内容 57,526
关键字:

内核态是什么