当前课程知识点:Linux 内核分析与应用 >  第2章 内存寻址 >  2.2 段机制 >  Video

返回《Linux 内核分析与应用》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《Linux 内核分析与应用》慕课在线视频列表

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内核》第二章的内容

最后希望大家带着思考离开

在硬件设计和操作系统设计中

到底进行怎样的取舍和折中 谢谢大家

Linux 内核分析与应用课程列表:

第1章 概述

-1.1 Linux操作系统概述

--1.1 Linux 操作系统概述

-1.2 Linux内核结构以及内核模块编程

--Video

-1.3 Linux内核源码中的双链表结构

--Video

-1.4 源码分析-内核中的哈希表

--Video

-1.5 动手实践-Linux内核模块的插入和删除

--Video

-第1章 概述--章节测验

-第1章导学--引领你进入Linux内核的大门

第2章 内存寻址

-2.1 内存管理之内存寻址

--Video

-2.2 段机制

--Video

-2.3分页机制

--Video

-2.4 动手实践-把虚拟地址转换成物理地址

--Video

-第2章 内存寻址--章节测验

-第二章导学-从零打造自己的操作系统

第3章 进程管理

-3.1 进程概述

--Video

-3.2 Linux进程创建

--Video

-3.3 Linux进程调度

--Video

-3.4 动手实践-打印进程描述符task_struct中的字段

--Video

-3.5工程实践-基于内核模块的负载监控

--Video

-第3章 进程管理--章节测验

-第三章导学-进程背后琳琅满目的宝贝到哪里挖?

第4章 内存管理

-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章 中断

-5.1 中断机制概述

--Video

-5.2 中断处理机制

--Video

-5.3 中断下半部处理机制

--Video

-5.4 时钟中断机制

--Video

-5.5 动手实践-中断上半部的代码分析及应用

--Video

-5.6 动手实践-中断下半部的代码分析及应用

--Video

-第5章 中断--章节测验

第6章 系统调用

-6.1 Linux中的各种API

--Video

-6.2 系统调用机制

--Video

-6.3 动手实践-添加系统调用(系统调用日志收集系统)

--Video

-第6章 系统调用--章节测验

第7章 内核同步

-7.1 内核同步概述

--Video

-7.2 内核同步机制

--Video

-7.3 动手实践-内核多任务并发实例(上)

--Video

-7.4 动手实践-内核多任务并发实例(下)

--Video

-第7章 内核同步--章节测验

第8章 文件系统

-8.1 虚拟文件系统的引入

--Video

-8.2 虚拟文件系统的主要数据结构

--Video

-8.3 文件系统中的各种缓存

--Video

-8.4 页高速缓存机制以及读写

--Video

-8.5 动手实践-编写一个文件系统(上)

--Video

-8.6 动手实践-编写一个文件系统(中)

--Video

-8.7 动手实践-编写一个文件系统(下)

--Video

-第8章 文件系统--章节测验

第9章 设备驱动

-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

直播视频:从Linux内核学习到自主操作系统研发

-从Linux内核学习到自主操作系统研发

附录:实验代码、课件以及相关素材

-各章实验代码

-《Linux内核分析与应用》课件

-《Linux操作系统原理与应用》教材课堂视频

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。