| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux从头学08:Linux 是如何保护内核代码的?【从实模式到保护模式】 -> 正文阅读 |
|
[系统运维]Linux从头学08:Linux 是如何保护内核代码的?【从实模式到保护模式】 |
文章目录在之前的 7 篇文章中,我们一直学习的是最原始的
8086 处理器中的最底层的基本原理,重点是
内存的寻址方式。
也就是: 不知道你是否发现了一个问题: 所有的程序都可以对内存中的任意位置的数据进行读取和修改,即使这个位置并不属于这个应用程序。 这是非常危险的,想一想那些心怀恶意的黑帽子黑客,如果他们想做一些坏事情,可以说是随心所欲! 面对这样的不安全行为,处理器一点办法都没有。 所以,Intel 从
虽然 这篇文章,我们就从 保护模式究竟保护了谁? 底层是通过什么机制来实现保护模式的? 我们的学习目标,就是弄明白下面这张图: 从 16 位进入到 32 位8086 的 16 位模式在 也正因为如此,处理器为了能够得到
还记得我们第 以上这些寄存器都是 而且每一个段的偏移地址,最大只能到
80386 的 32 位模式进入到 从寄存器的名称上可以出,在最前面增加了字母 这些
下面这张图是 在
是不是感觉到上面的寄存器示意图中漏掉了什么东西? 是的,图中没有展示出段寄存器( 这是因为在 它们不再表示段的基地址,而是表示一个索引值以及其他信息。 通过这个索引值(或者叫索引号),到一个表中去查找该段的真正基地址(有点类似于中断向量表的查找方式):
正是因为处理器有 但是由于 这里请大家不要绕晕了:刚才描述的段寄存器的内容时,仅仅是说明如何来找到一个段的基地址,也即是说:
找到了这个段的基地址之后,在访问内存的时候,仍然是按照段机制+偏移量的方式。 由于在 这样的分段方式,称作“平坦模型”,也可以理解为没有分段。 看到这里,是否联想起之前的一篇文章中,我们曾经画过一张 Linux 操作系统中的分段模型: 现在是不是大概就明白了:为什么这 从实模式进入到保护模式如何进入保护模式
在处理器内部,有一个寄存器
在处理器上电之后,默认状态下是工作在实模式。 当操作系统做好进入保护模式的一切准备工作之后,就把 也就是说:在 当 GDT 全局描述符表由于这张表中的每一个条目(
从上图中可以看出: 黄色部分:表示这个段在内存中的基地址。 绿色部分:表示这个段的最大长度是多少。 第一次看到这张图时,是不是心中有
第一个问题的答案是:历史原因(兼容性)。 第二问题的答案是:在每一个描述符中的标志位
为了完整性,我把所有标志位的含义都汇总如下,方便参考: D/B (bit22):用来决定数据段 L (bit21):在 AVL (bit20):处理器没有使用这一位内容,被操作系统可以利用这一位来做一些事情。 P (bit15):表示这个段的内容,当前是否已经驻留在物理内存中。 在 这些应用程序在虚拟内存中的代码段、数据段等等,最终都是要映射到物理内存中的。 但是物理内存的空间毕竟是有限的,当物理内存紧张的时候,操作系统就会把当前不在执行的那些段的内容,临时保存在硬盘上(此时,这个段描述符的 当这个被换出的段需要执行时,处理器发现 DPL (bit14 ~ 13):指定段的特权级别,处理器一共支持 比如:操作系统的代码段的特权级别是
S (bit12):决定这个段的类型。 TYPE (bit11 ~ 8):用来描述段的一些属性,例如:可读、可写、扩展方向、代码段的执行特性等等。 这里的依从属性不太好理解,它主要用于决定:从一个低特权级别的代码,是否可以进入另一个高特权级别的代码。 如果可以进入,那么当前任务的请求级别 另外,操作系统可以把 这样的话,就可以避免把最近频繁访问的物理内存换出,达到更好的系统性能。 GDTR 全局描述符表寄存器还有一个问题需要处理: 那么: 它存放在内存中的什么位置呢?CPU 又怎么能知道这个起始位置呢? 在处理器的内部,有一个寄存器: 我们可以从上一篇文章Linux从头学07:【中断】那么重要,它的本质到底是什么?中,中断向量表的安装过程中进行类比:
也就是说:处理器是到固定的地址 而对于 只要把这个位置存放到寄存器 GDTR 中,处理器在需要的时候就可以通过
从 这个长度一共是 这个数字,对于操作系统或者是一般的应用程序来说,是绰绰有余了。 段描述符的查找原理在上面的段寄存器示意图中,我们只说明了段寄存器依然是 在保护模式下,对其中内容的解释,与实模式下是大不相同的。 我们以代码段寄存器
假设当前代码段寄存器
找到了这个段描述符条目之后,就可以从中获取到这个代码段的具体信息了:
另外,从上文描述的 我们再从代码段寄存器中,描述符索引字段所占据的
至此,处理器就在保护模式下,查找到了一个段的所有信息。 下面步骤就是:到这个段所在的内存空间中,执行其中的代码,或者读写其中的数据。 下一篇文章我们继续。。。 这篇文章主要描述了 从描述的内容来看,已经和我们的最终目标: 因为这些底层知识,都是 理解了这些基础内容,后面在学习 最后,如果这篇文章对您有一点帮助,请转发给身边的技术小伙伴,也是对我继续输出文章的最大鼓励和动力! 让我们一起出发,向着目标继续迈进! 推荐阅读 【1】C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 11:43:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |