64位系统上,可以是4KB,8KB,最大可以是256MB 分页使得每个进程可以拥有自己独立的虚拟地址空间 (更多可参考 为什么 Linux 默认页大小是 4KB) 两级页表: Linux四级分页模式...保护模式提供了四个特权级,Linux使用了其中的2个,0级对应内核态,2级对应用户态 (错) “段被分为了4个特权级,分别为0-3级,有时候我们也叫做ring0-ring3,其中,数值越小特权级越高...核心代码和数据所在的段的特权级都比较高,一般在ring0,而用户程序所在的段的特权级较低,一般在ring3。...当低特权级的任务试图在未被允许的情况下访问高特权级的段时,将会产生常规保护错误。 而处理器是如何区分所在段的特权级,进而对其进行保护的呢?这就不得不提到CPL、DPL和RPL三者了。...保护模式特权级概述 操作系统-保护模式中的特权级 . 页面大小是由操作系统设计者确定的 (错) .
操作系统过程往往用RPL来避免低特权级应用程序访问高特权级内的数据。 访问数据段时的特权级检查: ?...遇到一致代码段也最多能从低到高,而且CPL不会改变。 如果想自由地进行不同特权级之间的转移,显然需要其他几种方式,即运用门描述符或者TSS。...Linux内核中并没有用到调用门。 门调用过程: ? 通过调用门进行控制转移的特权级检查: ?...通过调用门和call指令,可以实现从低特权级到高特权级的转移,无论目标代码段是一致的还是非一致的。...4、进入ring3–由高特权级进入低特权级 我们手动将ring3的cs、eip等信息压栈,然后执行ret指令就可以转移到低特权级代码中了 5、进入ring0–从低特权级进入高特权级 从低特权级到高特权级转移时需要用到
进军保护模式 保护模式进阶 — 再回实模式 此前的文章中,我们对保护模式特权级进行了简要的介绍,本文我们来切实的看看特权级在程序中是如何实现对内存和代码的保护的,我们又要如何在不同特权级间相互跳转。...DPL jmp — 如果目标代码段为一致代码段,CPL 必须 >= 目标代码段的 DPL,否则,CPL 必须等于目标代码段的 DPL 通过上述的描述可以看到,调用门可以让我们通过 call 指令调用高特权级的非一致代码段...栈切换 通过系统为某段代码预先设置的调用门,低特权级的应用程序得以能够调用高特权级的代码段,但这仍然存在着另一个问题,那就是对栈空间的保护问题。...当低特权级的程序通过调用门跳转到高特权级的代码段中去,如果他也随之使用高特权级的堆栈,那么低特权级的程序就可以通过栈顶与栈指针的地址轻松实现对栈内内存的访问和修改,这是极不安全的,因此,通过调用门调用目标代码段的一个重要步骤就是栈切换...处理器寄存器状态 IO 端口权限 内部堆栈指针 先前任务对应 TSS 的段选择子 其结构如下: TSS 中定义了跳转前各个寄存器的值,主要用于硬件中断等硬件任务切换场景的现场保护,windows、linux
,而为了避免特权的滥用,又需要一些措施对特权进行限制和监督,也就是所谓的“把特权关进笼子”。...(这也是DOS操作系统下计算机病毒泛滥的根本原因) 因此,Intel在286时代引入了保护模式(Protected Mode),并在386时代将保护模式标准化。...在保护模式下处理器被分为4个特权环,分别为Ring3,Ring2,Ring1和Ring0。Ring0可以访问整个系统的所有资源,而Ring3受到最严格的限制。...以Linux系统为例,内核指令运行在Ring0下,而应用程序运行在Ring3。当处理器从低特权级向高特权级切换的时候,需要经过“调用门”。...半虚拟化的实现方式要修改操作系统内核代码,因此,如果操作系统是Windows或Unix一类非开源操作系统,将无法在Xen为代表的半虚拟化平台上运行,而即使是Linux这样的开源操作系统,其配套的驱动程序也需要进行修改后才能使用
引言 经过一系列的文章,我们通过汇编语言,体验了保护模式下分段、分页、特权级跳转、中断、异常等机制。 那么,事到如今,你是否已经深谙保护模式的设计之道了呢?...保护模式下,对内存和 IO 定义了三个位于不同位置的特权级字段: 当前特权级 CPL — 位于 cs 寄存器与 ss 寄存器的低两位上,记录当前正在运行的代码所在内存段的特权级 描述符特权级 DPL —...>= 目标代码段的 DPL jmp — 如果目标代码段为一致代码段,CPL 必须 >= 目标代码段的 DPL,否则,CPL 必须等于目标代码段的 DPL 可见,调用门可以让我们通过 call 指令调用高特权级的非一致代码段...,但通过栈寻址指针 esp,让我们可以在栈中访问到高特权级程序此前压栈的数据,这显然有着巨大的安全隐患,于是硬件系统同时实现了栈切换机制,为每个特权级的进程单独设置一个栈空间,并将相关的三套 ss:esp...,他们都实现了对物理地址的保护 通过段描述符、页表项属性的描述,提供了不同划分级别下内存块的属性保护 通过特权级与栈切换,实现了不同层级程序切换时的保护 保护模式下中断描述附表的引入,让中断的切换和处理也被保护起来
mod=viewthread&tid=93149 第9章 RTX5任务运行在特权级或非特权级模式 本章教程为大家讲解RTX5运行模式的一个重要知识点,特权级模式和非特权级模式,有些资料或者书籍将非特权级模式称为用户模式...9.1 初学者重要提示 9.2 RTX5任务特权级知识点说明 9.3 RTX5任务特权等级深入认识 9.4 实验例程说明 9.5 总结 9.1 初学者重要提示 RTX5使用非特权级模式,千万不可以开...,查看RTX系统的配置向导,如下图9.1所示: 图9.1 RTX配置向导 Run in privileged mode 此参数就是用来设置特权级和非特权级的,选上单选框表示使能任务工作在特权级模式,...当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面,handler模式总是特权级的。在系统复位后,处理器进入线程模式+特权级。...下图是特权级线程模式和用户级线程模式的切换图: 一些简单的应用程序是不需要用户级线程模式的,如下图所示: 把代码按特权级和用户级分开对待,有利于使CM3/CM4的架构更加安全和健壮。
,本文将会从 Intel CPU 的发展历史讲起,循序渐近地帮助大家彻底掌握这一概念,相信大家看了肯定有帮助,本文目录如下 CPU 运行机制 Intel CPU 历史发展史 分段 保护模式 特权级 系统调用...0,1,2,3 四个特权级,而上文提到的 DPL 表示段描述符中的特权等级(Descriptor privilege level)知道了这两个概念也就知道保护模式的实现原理了,CPU 会在两个关键点上对内存进行保护...那么对于分页保护模式又是如何起作用的呢,同样以 32 位为例,它的二级页表项(也称 page table entry)其实是以下结构 注意第三位(也就是 2 对应的位置)有个 U/S,它其实就是代表特权级...为 1 时,允许所有特权级别的程序访问;为 0 时,仅允许特权级为0、1、2(Linux 中没有 1,2)的程序(也就是内核)访问。...) 总结 看完本文相信大家对实模式,保护模式,特权级转换,分段,分页等概念应该有了比较清晰的认识。
段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。...请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。 关于特权级的说明:任务中的每一个段都有一个特定的级别。...每当一个程序试图访问某一个段时,就将该程序所拥有的特权级与要访问的特权级进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权级或级别较低特权级的段。...②然后再GDT中以段选择器高13位位置索引值得到段描述符。...②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。 ③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。 ④用段选择器高13位位置索引值从LDT段中得到段描述符。
也就是说,它必须支持实模式和保护模式。所以,80386在段寄存器的基础上构筑保护模式,并且保留16位的段寄存器。...例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段的特权级等等。...不仅如此,由于Linux内核运行在特权级0,而用户程序运行在特权级别3,根据IA32段保护机制规定,特权级3的程序是无法访问特权级为0的段的,所以Linux必须为内核用户程序分别创建其代码段和数据段。...这就意味着Linux必须创建4个段描述符——特权级0的代码段和数据段,特权级3的代码段和数据段。 总结 分段机制是IA32架构CPU的特色,并不是操作系统寻址方式的必然选择。...当特权级为3的进程要想访问页面时,需要通过页保护检查,而特权级为0的进程就可以绕过页保护。
从用户程序的一个代码段(CPL = 3),跳转到另一个 DPL = 3 的代码段; 从操作系统的一个代码段(CPL = 0),跳转到另一个 DPL = 0 的代码段; 但是处理器也提供了一些特殊途径,让低特权级的代码可以转移到高特权级的代码中去执行...: 如果在高特权级代码段描述中的 TYPE 字段中,C = 1,就允许低特权级的代码转移进来; 通过调用门,低特权级代码也可以转移到高特权级的代码段; 这里主要描述第一种情况,也就是当目标代码段描述符的...另外,对于上图中的代码段1,由于其C标志位是 0,只能允许相同特权级的程序转移进来,从数值上表示就是: CPL == DPL RPL == DPL 最后还有一点需要记住:高特权级的代码,永远都不能转移到低特权级的代码...数据段的特权级检查 数据段的特权级检查规则比较简单:高特权级的程序,可以访问低特权级的数据,反之不可以。...在Linux系统中,只用了0 和 3这两个特权级,因此每一个用户程序只需要提前准备好0特权级下使用的栈就可以了。
表示该段是否可执行,代码段可执行,此处为1,数据段不可执行为0 R:代表代码段是否可以访问,1表示可以访问,0表示不可以访问 C:表示一致性代码段,一致性代码段简单理解为操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码...在创建新的段描述符此位默认应该置0 DPL:高32位中的13~14位(共2位),表示描述符特权级,特权级的数字越小,特权级越大。...CPU进入保护模式(操作系统的代码)默认为0,用户应用程序通常处于3特权级,权限最小 P:高32位中的第15位,用来标识段是否存在内存中,1表示存在。...段选择子 实模式下,段寄存器中用来存储段基址(内存段的起始地址),在保护模式下,由于有了段描述符,并且段描述符中已经存储了段基址,因此在段寄存器中再存放段基址就显得有点无意义,保护模式下的段寄存器存入的是段选择子...由于段寄存器是16位,因此选择子的大小也为16位,段选择子的低2位含义是请求特权级(RPL);第3位TI如果为0表示从GDT中查找段描述符,如果为1表示在局部描述符表(LDT)中查找段描述;剩余的13位用来索引描述符
内核代码段和数据段具有最高特权,因此其RPL 为0,而用户代码段和数据段具有最低特权,因此其RPL 为3。可以看出,Linux 内核再次简 化了特权级的使用,使用了两个特权级而不是4 个。...按Intel 规定,GDT 中的第一项为 空,这是为了防止加电后段寄存器未经初始化就进入保护模式而使用GDT 的。第二项也没用。 从下标2~5 共4 项对应于前面的4 种段描述符值。...而在保护模式下时,由于段基址已经存入了段描述符中,所以段寄存器中再存放段基址是没有意义的,在段寄 存器中存入的是一个叫作选择子的东西– selector。...由于段寄存器是16 位,所以选择子也是16 位,在其低2 位即第O~ 1 位, 用来存储RPL,即请求特权级,可以表示0、1 、2 、3 四种特权级。...选择子的高13 位,即第3~ 15 位是 描述符的索引值,用此值在GDT 中索引描述符。 ? ? 学而不思则罔 计算机系统从最初发展到现在,硬件、软件都在发展着,而且二者的发展有些地方是目的相同的。
引言 上一篇文章中,我们详细介绍了操作系统特权级,以及利用调用门、TSS 实现不同特权级之间的跳转。...利用调用门实现特权级间跳转 — 原理篇 经过上一篇文章对原理的深入剖析,我们从 Ring0 跳到 Ring3 再跳转回来的代码就已经呼之欲出了。...原理回顾 这里我们再对特权级跳转的实现原理进行一个简要的介绍。 2.1....从 Ring0 到 Ring3 毋庸置疑,操作系统是启动在最高特权级的 Ring0 下的,那么,在操作系统中如何实现从 Ring0 特权级跳转到应用程序所在的 Ring3 特权级的呢?...从 Ring3 到 Ring0 从 Ring3 特权级跳转到 Ring0 特权级,需要借助调用门,只要调用门描述符的 DPL 大于 CPL 与 RPL,就可以实现从低特权级跳转到门描述符所指定的高特权级目标代码了
RPL 是访问特权级,可以是 0、1、2 或 3,数字越小,特权级越大。 9. GDT/LDT 描述符属性 GDT、LDT 的第 5、6 字节拥有一系列属性,如下图所示: 9.1....特权级 如图所示,IA-32 CPU 将内存分为 4 个特权级,数字越大,级别越小。 他的出发点是为了保护核心代码和数据,让处于低级别的应用无法访问和修改高级别的内存。...描述符特权级 DPL(Descriptor Privilege Level) 在附录中的 GDT 属性字段里,有另一个特权级字段 DPL。 他定义了 GDT/LDT 中对应对应内存段的特权级。...访问特权级 RPL(Requested Privilege Level) 上面提到了段选择子中的特权级字段 RPL,它位于段选择子的第 0 位与第 1 位,当程序发生跳转,会比较 CPL 与 RPL,数值更大的会被更新到...cs、ds 的最低 0、1 位,成为新的 CPL,从而避免低特权级应用程序访问高特权级段内数据。
作者:Whippet@Timeline Sec 本文字数:457 阅读时长:3~4min 声明:请勿用作违法用途,否则后果自负 0x01 简介 linux kernel一般指Linux内核。...Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。...0x02 漏洞概述 Linux内核中overlayfs文件系统中的Ubuntu特定问题,它未正确验证关于用户名称空间的文件系统功能的应用。...由于Ubuntu附带了一个允许非特权的overlayfs挂载的补丁,因此本地攻击者可以使用它来获得更高的特权。...title=CVE-2021-3493_linux_kernel_%E7%89%B9%E6%AC%8A%E6%8F%90%E5%8D%87%E6%BC%8F%E6%B4%9E/zh-cn
段选择子 段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。...请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。 关于特权级的说明:任务中的每一个段都有一个特定的级别。...每当一个程序试图访问某一个段时,就将该程序所拥有的特权级与要访问的特权级进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权级或级别较低特权级的段。...②然后再GDT中以段选择器高13位位置索引值得到段描述符。...②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。 ③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。 ④用段选择器高13位位置索引值从LDT段中得到段描述符。
,然后切到保护模式时就是 0 级,这时操作系统就占了先机,成为了最高级别的运行者,由于你的程序都是由操作系统来加载的,所以当它把你加载上来后,就把你的运行状态设为 3 级,即最低级,然后才让你运行,所以没办法...2)特权级 熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的方式完成相应功能的,具体的工作是由sys_fork负责实施。...,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。...硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。...也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。
DPL(Descriptor Privilege Level),就是描述符特权级,它占两位,其值为0~3,用来确定这个段的特权级即保护等级。0为内核级别,3为用户级别。...当C=1 时,如果当前特权级低于描述符特权级,并且当前特权级保持不变,那么代码段只能执行。所谓当前特权级CPL(Current Privilege Level),就是当前正在执行的任务的特权级。...第1、0 位是特权级,表示选择符的特权级,被称为请求者特权级RPL(Requestor Privilege Level)。...当特权级为3 的进程要想访问页面时,需要通过页保护检查,而特权级为0 的进程就可以绕过页保护,如图2.23 所示。...Linux 采用三级分页模式而不是两级。如图2.28 所示为三级分页模式,为此,Linux定义了3 种类型的表。
至于说保护模式,是说通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。 1....2)特权级 熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的 方式完成相应功能的,具体的工作是由sys_fork负责实施。...,这些显然不能随便让哪 个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲 突。...硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于 Unix/Linux来说,只使用了0级特权级和3级特权级。...也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最 高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。
领取专属 10元无门槛券
手把手带您无忧上云