首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核分析与应用2-内存寻址

64位系统上,可以是4KB,8KB,最大可以是256MB 分页使得每个进程可以拥有自己独立的虚拟地址空间 (更多可参考 为什么 Linux 默认页大小是 4KB) 两页表: Linux分页模式...保护模式提供了四个特权Linux使用了其中的2个,0对应内核态,2对应用户态 (错) “段被分为了4个特权,分别为0-3,有时候我们也叫做ring0-ring3,其中,数值越小特权越高...核心代码和数据所在的段的特权都比较高,一般在ring0,而用户程序所在的段的特权较低,一般在ring3。...当低特权的任务试图在未被允许的情况下访问特权的段时,将会产生常规保护错误。 而处理器是如何区分所在段的特权,进而对其进行保护的呢?这就不得不提到CPL、DPL和RPL三者了。...保护模式特权概述 操作系统-保护模式中的特权 . 页面大小是由操作系统设计者确定的 (错) .

24230

《一个操作系统的实现》笔记(2)--保护模式

操作系统过程往往用RPL来避免低特权应用程序访问特权内的数据。 访问数据段时的特权检查: ?...遇到一致代码段也最多能从低到,而且CPL不会改变。 如果想自由地进行不同特权之间的转移,显然需要其他几种方式,即运用门描述符或者TSS。...Linux内核中并没有用到调用门。 门调用过程: ? 通过调用门进行控制转移的特权检查: ?...通过调用门和call指令,可以实现从低特权特权的转移,无论目标代码段是一致的还是非一致的。...4、进入ring3–由特权进入低特权 我们手动将ring3的cs、eip等信息压栈,然后执行ret指令就可以转移到低特权代码中了 5、进入ring0–从低特权进入特权 从低特权特权转移时需要用到

1.5K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    实战特权间的跳转 -- 原理篇

    进军保护模式 保护模式进阶 — 再回实模式 此前的文章中,我们对保护模式特权进行了简要的介绍,本文我们来切实的看看特权在程序中是如何实现对内存和代码的保护的,我们又要如何在不同特权间相互跳转。...DPL jmp — 如果目标代码段为一致代码段,CPL 必须 >= 目标代码段的 DPL,否则,CPL 必须等于目标代码段的 DPL 通过上述的描述可以看到,调用门可以让我们通过 call 指令调用特权的非一致代码段...栈切换 通过系统为某段代码预先设置的调用门,低特权的应用程序得以能够调用特权的代码段,但这仍然存在着另一个问题,那就是对栈空间的保护问题。...当低特权的程序通过调用门跳转到特权的代码段中去,如果他也随之使用特权的堆栈,那么低特权的程序就可以通过栈顶与栈指针的地址轻松实现对栈内内存的访问和修改,这是极不安全的,因此,通过调用门调用目标代码段的一个重要步骤就是栈切换...处理器寄存器状态 IO 端口权限 内部堆栈指针 先前任务对应 TSS 的段选择子 其结构如下: TSS 中定义了跳转前各个寄存器的值,主要用于硬件中断等硬件任务切换场景的现场保护,windows、linux

    57620

    虚拟化与云计算硬核技术内幕 (5) —— 把特权关进笼子

    ,而为了避免特权的滥用,又需要一些措施对特权进行限制和监督,也就是所谓的“把特权关进笼子”。...(这也是DOS操作系统下计算机病毒泛滥的根本原因) 因此,Intel在286时代引入了保护模式(Protected Mode),并在386时代将保护模式标准化。...在保护模式下处理器被分为4个特权环,分别为Ring3,Ring2,Ring1和Ring0。Ring0可以访问整个系统的所有资源,而Ring3受到最严格的限制。...以Linux系统为例,内核指令运行在Ring0下,而应用程序运行在Ring3。当处理器从低特权特权切换的时候,需要经过“调用门”。...半虚拟化的实现方式要修改操作系统内核代码,因此,如果操作系统是Windows或Unix一类非开源操作系统,将无法在Xen为代表的半虚拟化平台上运行,而即使是Linux这样的开源操作系统,其配套的驱动程序也需要进行修改后才能使用

    64210

    保护模式究竟“保护”了什么

    引言 经过一系列的文章,我们通过汇编语言,体验了保护模式下分段、分页、特权跳转、中断、异常等机制。 那么,事到如今,你是否已经深谙保护模式的设计之道了呢?...保护模式下,对内存和 IO 定义了三个位于不同位置的特权字段: 当前特权 CPL — 位于 cs 寄存器与 ss 寄存器的低两位上,记录当前正在运行的代码所在内存段的特权 描述符特权 DPL —...>= 目标代码段的 DPL jmp — 如果目标代码段为一致代码段,CPL 必须 >= 目标代码段的 DPL,否则,CPL 必须等于目标代码段的 DPL 可见,调用门可以让我们通过 call 指令调用特权的非一致代码段...,但通过栈寻址指针 esp,让我们可以在栈中访问到特权程序此前压栈的数据,这显然有着巨大的安全隐患,于是硬件系统同时实现了栈切换机制,为每个特权的进程单独设置一个栈空间,并将相关的三套 ss:esp...,他们都实现了对物理地址的保护 通过段描述符、页表项属性的描述,提供了不同划分级别下内存块的属性保护 通过特权与栈切换,实现了不同层级程序切换时的保护 保护模式下中断描述附表的引入,让中断的切换和处理也被保护起来

    1.1K20

    【STM32F407】第9章 RTX5任务运行在特权或非特权模式

    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的架构更加安全和健壮。

    1.2K20

    从进入内核态看内存管理

    ,本文将会从 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)的程序(也就是内核)访问。...) 总结 看完本文相信大家对实模式,保护模式特权转换,分段,分页等概念应该有了比较清晰的认识。

    96550

    GDT,LDT,GDTR,LDTR

    段选择子包括三部分:描述符索引(index)、TI、请求特权(RPL)。...请求特权(RPL)则代表选择子的特权,共有4个特权(0、1、2、3)。 关于特权的说明:任务中的每一个段都有一个特定的级别。...每当一个程序试图访问某一个段时,就将该程序所拥有的特权与要访问的特权进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权或级别较低特权的段。...②然后再GDT中以段选择器13位位置索引值得到段描述符。...②从LDTR寄存器中获取LDT所在段的位置索引(LDTR13位)。 ③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。 ④用段选择器13位位置索引值从LDT段中得到段描述符。

    1.3K10

    Linux内存寻址之分段机制及分页机制【转】

    也就是说,它必须支持实模式和保护模式。所以,80386在段寄存器的基础上构筑保护模式,并且保留16位的段寄存器。...例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段的特权等等。...不仅如此,由于Linux内核运行在特权0,而用户程序运行在特权级别3,根据IA32段保护机制规定,特权3的程序是无法访问特权为0的段的,所以Linux必须为内核用户程序分别创建其代码段和数据段。...这就意味着Linux必须创建4个段描述符——特权0的代码段和数据段,特权3的代码段和数据段。 总结 分段机制是IA32架构CPU的特色,并不是操作系统寻址方式的必然选择。...当特权为3的进程要想访问页面时,需要通过页保护检查,而特权为0的进程就可以绕过页保护。

    3.5K50

    Linux从头学12:读完这篇【特权】文章,你就比别人更“精通”操作系统!

    从用户程序的一个代码段(CPL = 3),跳转到另一个 DPL = 3 的代码段; 从操作系统的一个代码段(CPL = 0),跳转到另一个 DPL = 0 的代码段; 但是处理器也提供了一些特殊途径,让低特权的代码可以转移到特权的代码中去执行...: 如果在特权代码段描述中的 TYPE 字段中,C = 1,就允许低特权的代码转移进来; 通过调用门,低特权代码也可以转移到特权的代码段; 这里主要描述第一种情况,也就是当目标代码段描述符的...另外,对于上图中的代码段1,由于其C标志位是 0,只能允许相同特权的程序转移进来,从数值上表示就是: CPL == DPL RPL == DPL 最后还有一点需要记住:特权的代码,永远都不能转移到低特权的代码...数据段的特权检查 数据段的特权检查规则比较简单:特权的程序,可以访问低特权的数据,反之不可以。...在Linux系统中,只用了0 和 3这两个特权,因此每一个用户程序只需要提前准备好0特权下使用的栈就可以了。

    98320

    全局描述符表

    表示该段是否可执行,代码段可执行,此处为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位用来索引描述符

    97850

    Linux中的段

    内核代码段和数据段具有最高特权,因此其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 中索引描述符。 ? ? 学而不思则罔 计算机系统从最初发展到现在,硬件、软件都在发展着,而且二者的发展有些地方是目的相同的。

    4.5K20

    利用调用门实现特权间跳转 -- 实战篇

    引言 上一篇文章中,我们详细介绍了操作系统特权,以及利用调用门、TSS 实现不同特权之间的跳转。...利用调用门实现特权间跳转 — 原理篇 经过上一篇文章对原理的深入剖析,我们从 Ring0 跳到 Ring3 再跳转回来的代码就已经呼之欲出了。...原理回顾 这里我们再对特权跳转的实现原理进行一个简要的介绍。 2.1....从 Ring0 到 Ring3 毋庸置疑,操作系统是启动在最高特权的 Ring0 下的,那么,在操作系统中如何实现从 Ring0 特权跳转到应用程序所在的 Ring3 特权的呢?...从 Ring3 到 Ring0 从 Ring3 特权跳转到 Ring0 特权,需要借助调用门,只要调用门描述符的 DPL 大于 CPL 与 RPL,就可以实现从低特权跳转到门描述符所指定的特权目标代码了

    69520

    一文详解 32 位保护模式与内存分段机制

    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,从而避免低特权应用程序访问特权段内数据。

    1.2K31

    GDT,LDT,GDTR,LDTR 详解

    段选择子 段选择子包括三部分:描述符索引(index)、TI、请求特权(RPL)。...请求特权(RPL)则代表选择子的特权,共有4个特权(0、1、2、3)。 关于特权的说明:任务中的每一个段都有一个特定的级别。...每当一个程序试图访问某一个段时,就将该程序所拥有的特权与要访问的特权进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权或级别较低特权的段。...②然后再GDT中以段选择器13位位置索引值得到段描述符。...②从LDTR寄存器中获取LDT所在段的位置索引(LDTR13位)。 ③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。 ④用段选择器13位位置索引值从LDT段中得到段描述符。

    2.2K41

    内核态和用户态区别的重要性_cpu用户态和内核态区别

    ,然后切到保护模式时就是 0 ,这时操作系统就占了先机,成为了最高级别的运行者,由于你的程序都是由操作系统来加载的,所以当它把你加载上来后,就把你的运行状态设为 3 ,即最低级,然后才让你运行,所以没办法...2)特权 熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的方式完成相应功能的,具体的工作是由sys_fork负责实施。...,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由特权的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。...硬件已经提供了一套特权使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0特权和3特权。...也就是说在Unix/Linux系统中,一条工作在0特权的指令具有了CPU能提供的最高权力,而一条工作在3特权的指令具有CPU提供的最低或者说最基本权力。

    95920

    80386的分段机制、分页机制和物理地址的形成

    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.3K50

    80386的分段机制、分页机制和物理地址的形成

    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.1K30

    线程的用户态和内核态_缺页发生在用户态还是内核态

    至于说保护模式,是说通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。 1....2)特权 熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的 方式完成相应功能的,具体的工作是由sys_fork负责实施。...,这些显然不能随便让哪 个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由特权的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲 突。...硬件已经提供了一套特权使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于 Unix/Linux来说,只使用了0特权和3特权。...也就是说在Unix/Linux系统中,一条工作在0特权的指令具有了CPU能提供的最 权力,而一条工作在3特权的指令具有CPU提供的最低或者说最基本权力。

    1.2K20
    领券