看图说话:学习Linux内核(1)-ver-1.0

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

内存管理(cont.1)
• 8086(16位系统)只有分段机制
– 总结
• 通过分段机制把“段地址”和“偏移地址”转化成物理地址
偏移地址
分段单元
物理地址
段地址
内存管理(cont.2)
• 80x86的分段/分页
– 概述:
• 通过分段机制把“段选择符”和“逻辑地址”转换 成“线性地址(也称虚拟地址)” • 通过分页机制把“虚拟地址”转换成“物理地址”
内存管理(cont.10)
• 80x86分段/分页
– PAE的实现,先看常规分页的图:
第31bit 由分段机制产生出来的线性地址 第0bit
10bit页目录索引
10bit页表索引
12bit页内偏移 物理内存页
页表
某字节
这里还有 一个变量
CR3寄存器
页目录
页表项 页目录项
页目录基地址的物理地址
内存管理(cont.10)
页表
物理内存页 某字节
CR4寄存器
标志是否开启PAE
PDPT
页目录
页表项 页目录项
CR3寄存器
PDPT基地址的物理地址
PDPT项
内存管理(cont.11)
• 80x86内存访问优化
– TLB和Cache – TLB
• 缓存已经转换好的<线性地址↔物理地址>对 • 当CR3的值发生变化时,所有表项失效
提纲
• 前言 • 概述
– Linux发展简史 – Linux内核简介
• 内存管理
– 实模式 – 保护模式 – 虚拟地址到物理地址的总体映射关系(分区)
• 进程内存空间布局 • 内核态虚拟地址空间
– 异常、中断、陷入、软中断、软件中断、底半(BH) – 上下文、抢占、内核栈、中断栈
• 总结
内存管理
• 80x86的分段/分页
– 分页概览
• 分页
– 打白条,拆东墙补西墙 – 也可能相反
• 把线性地址(虚拟地址)空间中的某块和物理地址(物理内存)中的 某块映射起来
– 利用索引找到基地址 – 加上偏移量
• 这种映射是以固定大小(页)为单位
– 80x86是4096,但是支持扩展分页到4M
• 其过程是:
线性地址 逻辑地址 分段单元 分页单元 物理地址
段选择符(给出段地址)
内存管理(cont.3)
• 80x86的分段/分页
– 分段概览
内存中:段描述符表
段地址
内存的某段
段描述符
输入:段选择符(段寄存器)
某字节
16bit
输入:逻辑地址
32bit
段地址
输出:线性地址
32bit
内存管理(cont.4)
• 80x86的分段/分页
内存管理(cont.5)
GDTR/LDTR
32bit
内存中:段描述符表 段地址 8 内存的某段
非编程寄存器装段描述符
段描述符 32bit 某字节
输入:段选择符(段寄存器)
13bit的index 1bit的TI 2bit的RPL
输入:逻辑地址
32bit
段地址
输出:线性地址
32bit
内存管理(cont.6)
– Linux发展的三条线索
• UNIX的发展 • GNU的发展 • Linux内核的出现
概述(cont.1)
• Linux发展的三条线索
– UNIX的发展
• 世界上没有一个操作系统叫UNIX——白马非马 • 1969年,Ken Thompson和Dennis Ritchie在AT&T贝尔实验室实现了 Unix→Multics涅磐 • 1973年,用C语言重写Unix→飞速发展 • AT&T以分发许可证的方式,把Unix分发给大学和研究机构,及至 Unix第六版,AT&T意识到商业价值,成立USL,并宣布对Unix所有 权→开放到封闭 • 同时伯克利成立CSRG,开发并发布BSD Unix→Tcp/IP • AT&T引入BSD的一些优点,发布Unix System V→它和BSD成为现 代UNIX的两个分支 • 很多公司基于这两个分支发布自己的系统Solaris,HP-UX,AIX等→
– 分段实现
• 段描述符表怎么找到?
– GDTR或LDTR寄存器 – 由段选择符的TI比特决定GDTR还是LDTR
段选择符
13bit的index 1bit的TI 2bit的RPL
• 段描述符查找过程优化
– 有一个非编程寄存器(8字节?) – 当一个段选择符被装入段寄存器时,相应的段描述符就被装入该非编程 寄存器中。
内存管理(cont.10)
• 80x86的分段/分页
– 当物理内存大于4G时,如何利用之
• 80x86的寻址能力是64G(36bit地址宽度)
– PAE和PSE,PSE不被Linux支持
• 原理很简单,32 → 36
– 实现很难: » 区分虚拟地址空间 » 兼容扩展分页机制 » 注意这是硬件层面
• 因为已经解耦,页表项存的 基地址+页内偏移=36即 可
概述(cont.4)
• UNIX及UNIX-like系统的族谱
概述(cont.5)
• Linux内核简介
– 特点
• • • • • • • • • 实现Posix标准,BSD和System V择优实现 单内核 模块动态加载 支持进程抢占和内核抢占 独特的线程实现方式 有限的支持内核线程 面向对象的设备管理框架 使用GCC编译 ......
第31bit
由分段机制产生出来的线性地址
第0bit
10bit页目录索引
22bit页表索引 物理内存页4M
页目录
某字节
CR3寄存器
页目录项
页目录基地址的物理地址
内存管理(cont.9)
• 80x86分段/分页
– 分页机制的硬件支持回顾
• • • • 硬件做了什么?为什么说这是硬件支持的? 多级分页时,查找页表的过程是硬件完成的吗? 这个过程中需要软件支持吗? 分页机制对线性地址的解析是10/10/12,扩展分页 是10/22。能不能是13/10,或者其他?能随便分配 吗? • 拆东墙补西墙的反例是什么?
• 概述
– 一个计算机系统(硬件)包括:
• 中央处理器 • 存储器 • 外设
– 存储器
• 是一切操作的场地(Arena) • 操作系统的操作都必须在一个内存空间中完成
– – – – 运行进程 中断处理 系统服务 I/O处理
– 解析内存管理的思路:
• 硬件支持和接口 → Linux对内核态虚拟地址的映射 → 用户态虚拟地 址的映射
• 进程内存空间布局 • 内核态虚拟地址空间
– 异常、中断、陷入、软中断、软件中断、底半(BH) – 上下文、抢占、内核栈、中断栈
• 总结
前言
• 内核 → 操作系统
– 内核:管理硬件资源,提供进程运行环境
• • • • 设备管理 进程管理 内存管理 文件管理
– 操作系统:内核+系统软件+其他常用软件
内存管理(cont.1)
• 涉及到的机制
– 硬件方面:分段/分页/TLB/Cache – 软件方面:分页/VMA
• 8086(16位系统)只有分段机制
– 20bit的物理地址 = 段地址 x 16 + 偏移地址 20bit
输入:段地址(在段寄存器里)
16bit
输入:偏移地址
0000
16bit 输出:物理地址进地址线 20bit
• 核心进程 • 编辑器 • 交互界面等
前言(cont.1)
• 操作系统(内核)的讲法
– 内存管理 – 系统调用 – 中断处理 – 内核同步 – I/O管理 – 文件系统......
• 我们
– 以内存管理为线索,把部分几个串起来
提纲
• 前言 • 概述
– Linux发展简史 – Linux内核简介
概述(cont.3)
• Linux发展的三条线索
– Linux内核出现
• GNU已经完成了对几乎全部UNIX的软件的重写,除了内核 • GNU的内核项目Hurd,进展缓慢 • 1991年,Linus Torvalds在一个教学的UNIX-like的操作系统Minix基础上 开发了Linux内核,并以GPL发布 • Linux内核实现了Posix标准,能很好的和GNU软件配合,成为了GNU系 统的内核 • Linux内核飞速发展,很多公司利用GNU软件+Linux内核发布自己的操作 系统,例如RedHat、Debian、FedoraCore和Gentoo等,这些系统被称 为GNU/Linux系统,一般就直接叫做Linux
看图说话:学习Linux内核(1)-ver1.0
——以内存管理为线索
腾讯研究院/北京分院/无线组 周晓波(xiaobozhou) 2010-03-29
提纲
• 前言 • 概述
– Linux发展简史 – Linux内核简介
• 内存管理
– 实模式 – 保护模式 – 虚拟地址到物理地址的总体映射关系(分区)
• 80x86分段/分页
– PAE的实现:增加一级(注意页表项/页目录项是8字节,其中 24bit用于和页内偏移来合成物理地址) – CR3每指定一个PDPT就可以寻址4G – 如何在程序中使用呢?
第31bit 由分段机制产生出来的线性地址 第0bit
2bit PDPT 9bit页目录索引 9bit页表索引 12bit页内偏移
第31bit
由分段机制产生出来的线性地址
第0bit
10bit页目录索引
10bit页表索引
12bit页内偏移 物理内存页
页表
某字节
页目录
页表项
CR3寄存器
页目录项
页目录基地址的物理地址
内存管理(cont.8)
• 80x86中的分段/分页
– 分页实现 – 硬件支持的扩展分页(4M或2M) – 注意兼容性的考虑
• Linux在80x86平台上的分段
– – – – 段基地址都是0x00000000 → 线性地址==逻辑地址 四个主要段 → 用户代码段、用户数据段、内核代码段和内核数据段 段选择符中的RPL → CPU当前级别CPL:内核态和用户段(其实有4个) 段描述符中DPL → 该段的级别DPL:当CPL高于DPL时可被访问
标记
某块内存 (多字节)
内存管理(cont.14)
• 80x86内存访问优化
– Cache
组关联映射
标记 某块内存 (多字节)
线 性 地 址
内 存 块 号 组 号 块 内 偏 移
商业版本繁荣 • POSIX→标准化
概述(cont.2)
• Linux发展的三条线索
– GNU的发展
• UNIX并不是免费的,其软件也不是开源的 • Richard Stallman在1983年发起开源软件项目,为了构建一个免费的操作 系统:包括编辑器、编译器、文本处理和内核等 • 很多UNIX上的软件都被重写,并以GPL发布 • Emacs和GCC是旗舰项目
内 存 块 号 块 内 偏 移
标记
标记
某块内存 (多字节)
内存管理(cont.13)
• 80x86内存访问优化
– Cache
全关联映射
比较运算 线 性 地 址 标记 某块内存 (多字节) 某块内存 (多字节)
内 存 块 号 块 内 偏 移
标记
全关联中,缓存中的块 和物理内存中的块没有 函数关系,必须挨个比 较“标记”来检查缓存中是 有该块。 硬件可以用一次比较来 实现,但是复杂度高。
标记 标记 物理地址 物理地址
0/1 0/1
内存管理(cont.12)
• 80x86内存访问优化
– Cache
• 改善分页机制 • 缓存<内存中的内容↔线性地址>对 • 直接映射 → 全关联映射 → 组关联映射
直接映射
函数运算 线 性 地 址 标记 某块内存 (多字节) 某块内存 (多字节)
内存中的块和缓存中的块 是多对一,而且不可变。 例如:内存块映射到内存 块基地址mod缓存的总块 数
• 内存管理
– 实模式 – 保护模式 – 虚拟地址到物理地址的总体映射关系(分区)
• 进程内存空间布局 • 内核态虚拟地址空间
– 异常、中断、陷入、软中断、软件中断、底半(BH) – 上下文、抢占、内核栈、中断栈
• 总结
概述
• 约定
– 用Linux表示使用Linux内核的操作系统,即发行版本,如Debian – 用Linux内核来表达一个内核
• Linux发展简史
– Linux是一个UNIX-like操作系统内核 – UNIX是个商标,被Open Group拥有 – UNIX用来表达符合Unix标准的操作系统
• 被Open Group的“Single UNIX Specification”认证通过才可使用UNIX 商标,否则被称为UNIX-like系统
– 先分指标,按需给实物
• 究Βιβλιοθήκη Baidu本质:
– 把虚拟地址空间(指标)的分配和实物(物理内存)的分配解耦
• 推理:
– 如果虚拟地址空间对应的不是物理内存呢?
内存管理(cont.7)
• 80x86中的分段/分页
– 分页实现:硬件?软件? – 硬件支持的常规分页方式:2级(注意页目录项/页表项都是4字节,其中20bit 用于和偏移量来合成物理地址)
相关文档
最新文档