基于i386体系结构的Linux启动代码分析.ppt_第1页
基于i386体系结构的Linux启动代码分析.ppt_第2页
基于i386体系结构的Linux启动代码分析.ppt_第3页
基于i386体系结构的Linux启动代码分析.ppt_第4页
基于i386体系结构的Linux启动代码分析.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux操作系统分析 主讲 陈香兰助教 贾永泉 毛熠璐xlanchen 3606864 83 西区电三421 Autumn2007 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 2 上次课内容回顾 Linux简介Linux内核分析的一些基础知识操作系统基本概念堆栈用户态 内核态虚拟内存 基于i386体系结构的Linux启动代码分析 xlanchen 2007 9 13 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 4 主要内容 源代码简介启动代码简介Linux内核代码组成分析Linux的启动层次Linux的启动分析 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 5 源代码来源 根据 UnderstandingtheLinuxKernel 2ndEdition 我们采用Linux 2 4 18有中文版下载地址 ftp ftp kernel org pub linux kernel v2 6 linux 2 4 18 tar gz加压缩后 建立SourceInsight工程 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 6 SourceInsight 可以用来辅助代码阅读到 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 7 Linux 2 6 11 阅读linux目录下的README关于Linux的介绍该版本内核支持的体系结构如何配置 编译 安装 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 8 Linux内核源代码中的主要子目录 Documentation内核方面的相关文档 arch与体系结构相关的代码 对应于每个支持的体系结构 有一个相应的目录如i386 arm alpha等 每个体系结构子目录下包含几个主要的子目录 kernel与体系结构相关的核心代码mm与体系结构相关的内存管理代码lib与体系结构相关的库代码include内核头文件 对每种支持的体系结构有相应的子目录 init内核初始化代码 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 9 kernel内核管理代码 mm内存管理代码 ipc进程间通讯代码 net网络部分代码 lib与体系结构无关的内核库代码 drivers设备驱动代码 每类设备有相应的子目录 如char block net等fs文件系统代码 每个支持文件系统有相应的子目录 如ext2 proc等 modules可动态加载的模块 Scripts配置核心的脚本文件 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 10 考虑Arch为i386 在arch i386下存在如下目录 I386的启动源代码文件目录 I386的核心源代码文件目录 I386的库源代码文件目录 I386的数学仿真源代码文件目录 I386的内存管理源代码文件目录 I386的配置文件 I386的体系相关部分的Makefile I386的Linux内核的链接描述文件 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 11 I386的启动代码文件 在arch i386 boot目录下在arch i386 boot compressed目录下 I386的体系结构相关部分的启动代码都采用汇编码写的 启动扇区中的启动代码 其目标码必然是512字节 I386初始化 内核解压缩 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 12 在arch i386 kernel目录下的 S文件在init目录下 32位启动代码 这是体系结构无关部分 i386体系结构相关部分的启动 其目的就是进入main c中的start kernel处执行 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 13 阅读documentation i386 boot txt 对于i386平台 由于一些历史的原因 因此Linux的启动比较复杂这个文档包含如下内容1 Linux i386的启动协议 4个 2 内存布局图3 实模式下的内核头结构4 内核的命令行 commandline xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 14 5 启动配置示例6 装载Linux的剩余部分7 特殊的命令行参数8 运行内核9 高级启动回调函数关于其中的一些内容 我们将在合适的时候说明 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 15 阅读顶层目录下的Makefile 找到缺省目标 链接 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 16 找到vmlinux找到vmlinux所依赖的各个文件或者目标可以看到vmlinux包含如下内容i386 kernel head S init main c init version o CORE FILES DRIVERS NETWORKS LIBS xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 17 若makeinstall在i386的Makefile中有install规则若makeboot bzImage zImage等等 则要找到对应的目标然后进行makeboot在顶层的Makefile中可以找到boot规则bzImage zImage可以在i386的Makefile中找到相应规则其他的zXXX bzXXX也都依赖于boot下的zImage bzImage它们最终都找到i386 boot的Makefile xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 18 i386 boot的Makefile 看i386 boot的Makefilez代表压缩 b代表大内核可见compressed下的vmlinux bvmlinux为compressed head S 压缩后的顶层目录下的vmlinuxzImage为bootsect setup compressed vmlinuxbzImage为bbootsect bsetup compressed bvmlinux xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 19 下面根据在bzImage zImage中的顺序 我们依次看启动相关的源代码和相关概念arch i386 boot bootsect Sarch i386 boot setup Sarch i386 boot compressed head Sarch i386 kernel head S最后进入kernel main C xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 20 I386机器的启动层次 BIOS BasicI OSystem Bootloader软盘启动 硬盘启动Linuxkernel xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 21 BIOS 加电 RESET引脚初始化寄存器 CS IP 0 xfffffff0 inROMROM BIOSBIOS启动内容POST 上电自检 初始化硬件设备搜索一个操作系统来启动根据配置 操作系统可以在软盘 硬盘 CD ROM上把对应设备的第一个扇区的内容 bootloader或部分 拷贝到RAM 0 x7c00 处跳转到0 x7c00处执行 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 22 Bootloader 引导装载程序 BIOS调用Bootloader来把操作系统的内核映像装载到RAM中考虑IBMPC的启动软盘启动 BIOS拷贝第一个扇区的内容 bootsect 到RAM 0 x7c00 中硬盘启动 硬盘的第一个扇区 主引导记录MBR MasterBootRecord MBR存储该硬盘的分区表 一小段引导程序这个引导程序用来装载OS所在分区的第一个扇区 bootloader 的内容到RAM中这个引导程序也可以被替换 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 23 Linux的BootLoader 典型的有 LILO和GrubLILO LinuxLoader 可以被安装在OS分区的第一个扇区 启动扇区 也可以代替MBR中的引导程序事实上 LILO的代码尺寸大于一个扇区 因此被分成两个部分MBR或启动扇区部分剩余部分第一部分也被BIOS装载到RAM中0 x7c00的位置第一部分在运行时将自己完整的装载到RAM中 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 24 Linux的BootLoader 通常LILO或GRUB会显示一个已安装操作系统的列表按照用户的选择 或者按照缺省项 装载目标操作系统运行可能装载操作系统指定的启动代码运行可能直接装载操作系统内核来运行 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 25 LILO的OS启动过程 显示 Loading 操作系统前512 一个扇区大小 bootsect 的内容被装载到RAM的0 x90000紧接着的内容 setup 被装在到0 x90200其他操作系统内核被装载到对于小内核 0 x10000 即64K处 称为低装载对于大内核 0 x100000 即1M处 称为高装载跳转到setup处运行 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 26 I386内核的启动 启动方式软盘启动 从bootsect开始运行硬盘启动 从setup开始运行在进入bootsect S的源代码讲解之前 我们先看一下加载i386内核的内存布局图 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 27 硬件角度 I386实模式下的内存布局图 RAM 1 MB ROM BIOS VIDEO BIOS VRAM 0 xA0000 0 xC0000 0 xF0000 0 x00000 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 28 I386内核从实模式开始启动运行 首先看一下什么是实模式实模式是为了兼容早期的CPU而设置的i386系统总是始于实模式实模式下地址总线 20位内存范围 0 1MB逻辑地址 段地址 段内偏移段地址 段寄存器中的值 16 或左移4位 段寄存器长度 16bit xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 29 加载I386内核的内存布局图 zImage Image的内核加载器所使用的经典的内存布局 1M 0 x100000 低装载情况 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 30 软盘启动 bootsect S 0 x7c00 0 x900000 x7c00 BIOS0 x90000 lilo堆栈 0 x3ff4 0 x4000 12 向下增长磁盘参数表 12Bytes 0 x3ff4 0 x4000显示 Loading Setup 0 x90200系统小内核 0 x10000 64KB处 低装载大内核 0 x100000 1MB处 高装载setup xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 31 硬盘启动 两阶段引导 装载LILO LInuxLOader 第一个扇区 装载LINUXBootsect S 0 x90000Setup S 0 x90200系统0 x100000 x100000跳转到setup xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 32 启动第一步 小结 总之 在跳转到setup的时候 内存里面的代码布局为0 x90000 bootsect0 x90200 setup低装载 0 x10000 带解压的vmlinux高装载 0 x100000 带解压的bvmlinux实模式下的内核头结构包括bootsect的最后和setup开始的位置从bootsect的偏移0 x1F1开始 具体描述参见documentation i386 boot txt xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 33 Setup 0 x90200 初始化硬件设备并为内核程序的执行建立环境内存检测键盘视频磁盘控制器IBM微通道总线MCAPS 2设备 总线鼠标 APMBIOS 若低装载 将系统移动到0 x1000处 4KB处 否则 不必临时IDT和临时GDTFPUPIC 16个硬件中断 中断向量32 47实模式 保护模式Startup 32 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 34 在compressed head S和head S中都定义了startup 32但是head S中 被压缩在vmlinux中还没有解压缩只有compressed head S的startup 32是可用的zImage中 在0 x1000处bzImage中 在0 x100000处 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 35 Compressed head S Startup 32初始化段寄存器和一个临时堆栈初始化BSS段解压缩高装载或低装载 解压缩 0 x100000 1MB 跳转到0 x100000处 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 36 解压缩后 vmlinux在0 x100000处根据vmlinux lds vmlinux的地址被链接为0 xc0000000 0 x100000处如何正确运行呢 此时仍然是实模式 还没有进入保护模式 分页 映射好没有长跳转 只使用采用相对地址的近距离跳转 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 37 Head S Startup 32初始化段寄存器建立进程0的内核堆栈Setup idt拷贝系统参数识别处理器GDT IDTStart kernel xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 38 与内存相关的一些概念 在实模式下 地址总线20位 访存范围为1MB 物理地址使用段址 偏移的方式表示段址保存在段寄存器中 段寄存器有 cs ds es fs gs16位寄存器 偏移也是16位 因此最大段长为216 0 x10000 64KB物理地址 段寄存器 16 偏移 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 39 保护模式下 地址总线32位 访存范围为4GB原来的段寄存器现在被称作段选择子 与GDT表配合使用GDT表由gdtr指示其位置和长度使用特殊的指令进行操作 sgdt lgdt xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 40 图示 xlanchen 2007 9 13 LinuxOperatingSystemAnalysis 41 查看setup S和head

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论