当前课程知识点:Linux 内核分析与应用 > 第2章 内存寻址 > 2.2 段机制 > Video
大家好 这一讲我们来讲一下
保护模式下的段机制
那么我们首先从一个简单的“hello world”程序说起
那么这个程序是大家熟悉的打印“hello world”的程序
那么对于这样一个简单的程序
我们通过编译 汇编 链接 装载
以及执行以后 看它是一个什么样的状况
我们说 程序通过编译器gcc将其编译成汇编程序
那么经过汇编器将其汇编成目标代码
经过链接器把它链接形成可执行文件
最后通过装载器装到内存
那么问题来了 链接以后形成的地址空间是虚地址还是实地址
装入程序把可执行代码装入到虚拟内存还是物理内存
CPU访问的是虚地址还是物理地址
带着这几个问题呢我们来进一步的介绍
那么通过objdump命令我们对这个程序进行反汇编
反汇编以后 我们看到程序的地址空间是这样子的
那么这是编译链接之后形成的64位地址空间
最左边的是虚地址
中间的是指令码
右边的是AT&T格式的汇编指令
那么我们可以看到当我们编译链接以后形成的虚地址
就是CPU要访问的地址
那么CPU把虚地址送给MMU
MMU就是内存管理单元
它和CPU是在一起的
然后MMU把虚地址
转换成物理地址送给存储器
那么我们进一步的来看一下MMU到底包含了什么
我们看到MMU分为两个阶段
第一个阶段是把虚拟地址转换为线性地址
是通过段机制 第二个阶段是把线性地址
转换为物理地址 是通过分页机制
那么这个MMU呢它属于硬件单元
它的作用是把虚地址转换为物理地址
我们来看一下如何把虚拟地址空间的一个虚地址呢
转换为线性地址空间的一个线性地址
左边呢是虚拟地址空间 右边呢是线性地址空间
虚拟地址空间中偏移量从0的limit范围内的一个段呢
映射到线性地址空间中 就是从base到base+limit
那么 如何来描述这种转换关系
我们用段描述符表来描述
那么其中段号描述的是虚拟地址
空间的段的编号
基地址是线性地址空间中段的起始地址
段描述符表中的每一个表项呢
我们叫做段描述符
在这张表里头有三个组成部分
一个叫基地址 一个叫界限 一个叫属性
旁边这个索引号我们把它叫做段号
段描述符具体来说
到底如何进行描述呢 这里有一张图
从这个图里可以看出一个段描述符描述了段的
32位的基地址
和20位的段的界限也就是段长
其中用1.5个字节用于描述段的属性
那么这里头提一个问题
这个表的格式是由谁来确定的
下面我们来看一下在保护模式下
段寄存器中存放什么
我们说它实际上存放的是索引或者叫作段号
因此这里的段寄存器也叫选择符
也就是说从
描述符表中选择某个段
段的选择符是这样的 最高的13位放的是索引
最低的两位放的是请求者的特权级
第3列放的是表的索引
来表示我们这个段表呢
是在全局描述符表还是在局部描述符表里
那么这里我们特别强调一下保护模式下的特权级
保护模式提供了4个特权级
分别用0到3这4个数字来表示
在很多操作系统里头
包括Linux Windows 只使用了其中最低和最高的两个
也就是说 用0表示高特权级
对应内核态 用3表示低特权级 对应用户态
而且呢保护模式规定
高特权级可以访问低特权级
而低特权级不能够随意访问高特权级
这也就是保护模式存在的意义
也就是说通过设置特权级
使得操作系统受到了保护
下面我们来介绍一下保护模式下的
其它的描述符表
一个叫全局描述符表 一个叫中断描述符表
一个叫局部描述符表
系统中为了加快对这些表的访问呢
Intel设计了专门的寄存器
以存放这些表的基地址及表的长度界限
那么这些寄存器只供操作系统来使用
有关这些表的详细内容请参看有关保护模式的参考书
下面我们来说一下Linux中的段
那么保护模式规定段是必选项页是可选项
可是现在大多数的RISC机器呢
它是以分页为主的
那么Linux内核在设计代码的时候要巧妙的绕过段机制
如何绕过段机制呢 那么
我们说线性地址等于段的起始地址加偏移量
因此呢当把段的起始地址
赋为0的时候我们让线性地址等于偏移量
那么这样呢我们就绕过了段机制
Linux在启动过程中设置了段寄存器的值和全局描述符表的内容
内核代码中可以定义四个段
分别为内核代码段 内核数据段 用户代码段和用户数据段
那么对照这个
段描述符表的各个字段的定义呢
我们可以看到呢
在内核代码段它的特权级为0
在用户段它的特权级为3
下面我们来给一个保护模式下
寻址的例子是一个汇编语言
那么我们对这个内容给一个解释
那么上面这一段程序展示了系统进入保护模式以及在保护模式中呢
利用寄存器寻址的一个过程
首先lgdt指令呢
将全局描述符表的地址以及表的长度呢
装入到全局描述符表寄存器中
在全局描述符表标识符的地方呢
存放一个字即一个双字节
那么前者为0x17表示表的长度也就是字节数
那么后者呢表示表的物理地址
那么紧接着呢
cr0的保护模式开启被打开
这个时候系统便进入了保护模式
开始采用保护模式的寻址模式进行地址的转换
这时候内存中有全局描述符表的3个表项了
进入保护模式后 系统立即执行了一个长跳转指令
由于是在保护模式中
所以前者被当作段选择子 而后者是偏移地址
段选择子的值是0x8
于是对应的段描述符会是表中的第一个项
0x0表示段首址是0
所以最终得到物理地址为0加protcseg
程序便跳到这个标识符所标识的位置来执行
那么在之后执行一个mov指令
那么mov指令把ebx
寄存器的值再加0x20呢
移到eax寄存器中
如图所示 我们可以知道段的基地址为0
于是它的物理地址就是0+
0x20+0xf000000最后我们得到一个值
那么内存中这个位置的一个双字节就会被复制到
eax寄存器中
这里能访问到的是0到4G的地址空间
实际上是虚拟地址空间
在开启分页机制以后 还要经过页表转换才能得到真实的地址
而在开启分页之前系统一般会控制在自访问低的地址范围
在讲解了这些内容以后我们希望大家能够动手实践
在Linux内核之旅网站的在电子
杂志的第二期我们有《i386体系结构》(上)
上半部分让大家认识一下Intel系统中
内存寻址和虚拟内存的来龙去脉
希望大家能够下载代码并进行调试
最后参考资料呢
希望大家认真阅读《深入理解Linux内核》第二章的内容
最后希望大家带着思考离开
在硬件设计和操作系统设计中
到底进行怎样的取舍和折中 谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video