当前课程知识点:Linux 内核分析与应用 > 第2章 内存寻址 > 2.1 内存管理之内存寻址 > Video
大家好 我们今天开始讲第二章内容 内存寻址
这一讲我们开始对内存寻址进行概要的介绍
那么为什么首先讲内存寻址
就从图灵机说起
图灵机是一种通用自动的机器模型
它的理念是
有一个二端无限延伸的纸带作为存储装置
输入 输出和状态转移函数呢
是机器的三要素
这三要素组合并变形可成为一切机器的原型
可解决一切图灵机能解决的问题
那么紧接着介绍冯诺伊曼结构
冯诺依曼体系结构与图灵机有什么样的关系呢
图灵机听起来是纸上谈兵
但它却是当代冯诺依曼计算机体系的理论鼻祖
它带来的数据连续存储和选择读取思想
是目前我们使用的几乎所有机器运行背后的灵魂
计算机体系结构中的核心问题之一就是如何有效地进行内存寻址
因为所有运算的前提都是先要从内存中取得数据
所以内存寻址技术从某程度上
代表了计算机技术
刚才我们说图灵机是冯诺依曼计算机体系的鼻祖
而目前的大多数CPU的体系鼻祖呢
又是冯诺伊曼体系
那么我们看这张图 Intel的x86结构 AMD
当然ARM的体系结构 它源于哈佛结构
这张图呢给出了Linux内核源代码的结构
Linux在内核的设计中呢
目前几乎支持所有主流的CPU架构
其设计理念遵循了分离体系结构相关代码的原则
在上图中呢Linux支持的众多的CPU体系结构中
与体系结构相关的代码
专门存放在arch目录下
那么其中呢大家最熟悉的就是X86
因此我们所介绍的内存寻址
也是以此为背景的
而且是以32位的寻址为主
下面我们介绍一下x86内存寻址的不同时期
我们把它分为四个时期
分别为石器时期 青铜时期
白银时期和黄金时期
那么我们先看一下石器时期
石器时期其实就是八位的寻址
在微处理器的历史上
第一块微处理器芯片是4004
是由Intel推出的4位的机器
在4004之后呢 Intel推出了一款八位的处理器
叫8080
那时还没有段的概念
访问内存都要通过绝对地址
因此程序中的地址 必须进行硬编码
也就是说你要给出具体的物理地址
而且难以重定位
那么紧接着呢就到了青铜时期
那么这个时期呢也就是8086的时代
引入了段的概念
那么8086处理器的目标定位呢
寻址空间要达到1M
于是它的地址总线扩大到了20位
可是呢数据总线只有16位
也就是说它要把1M大的空间呢
分为数个64k的段来进行管理
那么段呢描述了一块有限的内存区域
区域的起始位置呢
存在专门的寄存器中 也就是我们说的段寄存器中
我们看一下8086的寻址方式
如何把一个16位的地址能寻址到
1M的地址空间
实际上它是把16位的段地址呢
移4位以后再与16位的偏移量相加
便获得一个20位的内存地址
也就实现了从16位内存地址到20位实际地址的转换
或者呢我们叫做映射
那么这种模式呢也叫做”实模式”
下面我们到了第三个阶段 也就是保护模式的引入
80286的地址总线增加到了24位
从此开始引入了一个全新的理念 也就是保护模式
这个时候访问内存时不能直接从段寄存器中获得段的起始地址
而需要经过额外的转化或检查
现在到了黄金时期
内存寻址的飞跃 386是一个32位的CPU
其寻址能力达到了4GB
Intel选择了在段寄存器的基础上构置保护模式
并且保留段寄存器依然是16位
在保护模式下它的段范围呢
不再受限于64K而是可以达到了4个GB
这真正的解放了软件工程师
他们不必再费心的去压缩程序的规模
软件功能也因此迅速得到了提升
从80386以后从32位到目前的64位
Intel的CPU经历了各种型号
但基本上属于同一种体系结构的改进和加强
而无本质的变化所以我们把
386以后的处理器通称为X86
那么实模式或保护模式下
它们寄存器有什么样的差异
通过这张图 我们看到了它们寄存器有相当的差异
在保护模式下的寄存器有很大的变化
一些寄存器是专门属于操作系统使用的
比如用于分页的控制器
CR0到CR3
一般普通用户是不能使用的
有一些寄存器是系统的地址寄存器
那么还有一些寄存器呢专门用于
调试或测试 分别有七个寄存器
那么这些呢都是保护模式下所特有的寄存器
在这里呢我们特别介绍一下保护模式下的几个页表寄存器
那么这里面有4个页表寄存器
CR0到CR3
我们主要的介绍一下CR0寄存器
CR0中包含了六个预定义的标志
这里介绍内核中用到的0位和31位
0位是保护允许位
主要用于启动保护模式
如果PE位置1则保护模式启动
如果为0则在实模式下运行
CR0的第31位是分页允许位
它表示芯片上的分页部件是被允许工作
由于PG位和PE位定义的操作方式呢
可以由下面这个图可以看出
这个我们看到呢00组合呢
它是实模式 也就是8080的操作
那么01组合呢是保护模式 但不允许分页
10组合呢就是出错
11组合就是允许分页的保护模式
这也是我们操作系统所要讲的模式
下面我们来介绍一下Linux内核代码中
所使用的C语言和汇编语言
那么C语言用的是GNU的扩展C
汇编语言使用的是AT&T的汇编格式
与Intel的汇编格式稍有差异
那么在C语言中也可以嵌入汇编语言
叫做GCC嵌入式汇编
关于这些语言的差异性
以及在内核代码中的使用呢
我们具体的参见教材的2.5节
这节的参考资料呢 介绍大家
来参考《深入理解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