您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Linux操作系统分析-linux启动代码分析
Linux操作系统分析上次课内容回顾Linux简介Linux内核分析的一些基础知识操作系统基本概念堆栈用户态/内核态虚拟内存LinuxOperatingSystemAnalysis2基于i386体系结构的Linux启动代码分析主要内容源代码简介启动代码简介Linux内核代码组成分析Linux的启动层次Linux的启动分析LinuxOperatingSystemAnalysis4源代码来源根据《UnderstandingtheLinuxKernel》(2ndEdition),我们采用Linux-2.4.18有中文版下载地址:加压缩后,建立SourceInsight工程LinuxOperatingSystemAnalysis5SourceInsight可以用来辅助代码阅读到上可以下载到它的试用版,试用期估计在30天左右LinuxOperatingSystemAnalysis6Linux-2.6.11阅读linux目录下的README关于Linux的介绍该版本内核支持的体系结构如何配置、编译、安装LinuxOperatingSystemAnalysis7Linux内核源代码中的主要子目录Documentation内核方面的相关文档。arch与体系结构相关的代码。对应于每个支持的体系结构,有一个相应的目录如i386、arm、alpha等。每个体系结构子目录下包含几个主要的子目录:kernel与体系结构相关的核心代码mm与体系结构相关的内存管理代码lib与体系结构相关的库代码include内核头文件。对每种支持的体系结构有相应的子目录。init内核初始化代码。LinuxOperatingSystemAnalysis8kernel内核管理代码。mm内存管理代码。ipc进程间通讯代码。net网络部分代码。lib与体系结构无关的内核库代码。drivers设备驱动代码。每类设备有相应的子目录,如char、block、net等fs文件系统代码。每个支持文件系统有相应的子目录,如ext2、proc等。modules可动态加载的模块。Scripts配置核心的脚本文件。LinuxOperatingSystemAnalysis9考虑Arch为i386在arch/i386下存在如下目录I386的启动源代码文件目录I386的核心源代码文件目录I386的库源代码文件目录I386的数学仿真源代码文件目录I386的内存管理源代码文件目录I386的配置文件I386的体系相关部分的MakefileI386的Linux内核的链接描述文件LinuxOperatingSystemAnalysis10I386的启动代码文件在arch/i386/boot目录下在arch/i386/boot/compressed目录下I386的体系结构相关部分的启动代码都采用汇编码写的启动扇区中的启动代码,其目标码必然是512字节I386初始化内核解压缩LinuxOperatingSystemAnalysis11在arch/i386/kernel目录下的.S文件在init目录下32位启动代码这是体系结构无关部分,i386体系结构相关部分的启动,其目的就是进入main.c中的start_kernel处执行LinuxOperatingSystemAnalysis12阅读documentation/i386/boot.txt对于i386平台,由于一些历史的原因,因此Linux的启动比较复杂这个文档包含如下内容1、Linux/i386的启动协议(4个)2、内存布局图3、实模式下的内核头结构4、内核的命令行(commandline)LinuxOperatingSystemAnalysis135、启动配置示例6、装载Linux的剩余部分7、特殊的命令行参数8、运行内核9、高级启动回调函数关于其中的一些内容,我们将在合适的时候说明LinuxOperatingSystemAnalysis14阅读顶层目录下的Makefile找到缺省目标链接LinuxOperatingSystemAnalysis15找到vmlinux找到vmlinux所依赖的各个文件或者目标可以看到vmlinux包含如下内容i386/kernel/head.S+init/main.c+init/version.o+CORE_FILES+DRIVERS+NETWORKS+LIBSLinuxOperatingSystemAnalysis16若makeinstall在i386的Makefile中有install规则若makeboot/bzImage/zImage等等,则要找到对应的目标然后进行makeboot在顶层的Makefile中可以找到boot规则bzImage/zImage可以在i386的Makefile中找到相应规则其他的zXXX/bzXXX也都依赖于boot下的zImage/bzImage它们最终都找到i386/boot的MakefileLinuxOperatingSystemAnalysis17i386/boot的Makefile看i386/boot的Makefilez代表压缩;b代表大内核可见compressed下的vmlinux/bvmlinux为compressed/head.S+压缩后的顶层目录下的vmlinuxzImage为bootsect+setup+compressed/vmlinuxbzImage为bbootsect+bsetup+compressed/bvmlinuxLinuxOperatingSystemAnalysis18下面根据在bzImage/zImage中的顺序,我们依次看启动相关的源代码和相关概念arch/i386/boot/bootsect.Sarch/i386/boot/setup.Sarch/i386/boot/compressed/head.Sarch/i386/kernel/head.S最后进入kernel/main.CLinuxOperatingSystemAnalysis19I386机器的启动层次BIOS(BasicI/OSystem)Bootloader软盘启动、硬盘启动LinuxkernelLinuxOperatingSystemAnalysis20BIOS加电,RESET引脚初始化寄存器;CS:IP=0xfffffff0,inROMROMBIOSBIOS启动内容POST(上电自检)初始化硬件设备搜索一个操作系统来启动根据配置,操作系统可以在软盘/硬盘/CD_ROM上把对应设备的第一个扇区的内容(bootloader或部分)拷贝到RAM(0x7c00)处跳转到0x7c00处执行LinuxOperatingSystemAnalysis21Bootloader(引导装载程序)BIOS调用Bootloader来把操作系统的内核映像装载到RAM中考虑IBMPC的启动软盘启动:BIOS拷贝第一个扇区的内容(bootsect)到RAM(0x7c00)中硬盘启动:硬盘的第一个扇区:主引导记录MBR,MasterBootRecord,MBR存储该硬盘的分区表+一小段引导程序这个引导程序用来装载OS所在分区的第一个扇区(bootloader)的内容到RAM中这个引导程序也可以被替换LinuxOperatingSystemAnalysis22Linux的BootLoader典型的有:LILO和GrubLILO(LinuxLoader)可以被安装在OS分区的第一个扇区(启动扇区)也可以代替MBR中的引导程序事实上,LILO的代码尺寸大于一个扇区,因此被分成两个部分MBR或启动扇区部分剩余部分第一部分也被BIOS装载到RAM中0x7c00的位置第一部分在运行时将自己完整的装载到RAM中LinuxOperatingSystemAnalysis23Linux的BootLoader通常LILO或GRUB会显示一个已安装操作系统的列表按照用户的选择(或者按照缺省项)装载目标操作系统运行可能装载操作系统指定的启动代码运行可能直接装载操作系统内核来运行LinuxOperatingSystemAnalysis24LILO的OS启动过程显示“Loading…”操作系统前512(一个扇区大小,bootsect)的内容被装载到RAM的0x90000紧接着的内容(setup)被装在到0x90200其他操作系统内核被装载到对于小内核:0x10000(即64K处),称为低装载对于大内核:0x100000(即1M处),称为高装载跳转到setup处运行LinuxOperatingSystemAnalysis25I386内核的启动启动方式软盘启动:从bootsect开始运行硬盘启动:从setup开始运行在进入bootsect.S的源代码讲解之前,我们先看一下加载i386内核的内存布局图LinuxOperatingSystemAnalysis26硬件角度:I386实模式下的内存布局图RAM1-MBROM-BIOSVIDEO-BIOSVRAM0xA00000xC00000xF00000x00000LinuxOperatingSystemAnalysis27I386内核从实模式开始启动运行首先看一下什么是实模式实模式是为了兼容早期的CPU而设置的i386系统总是始于实模式实模式下地址总线:20位内存范围:0~1MB逻辑地址=段地址+段内偏移段地址=段寄存器中的值*16(或左移4位)段寄存器长度:16bitLinuxOperatingSystemAnalysis28加载I386内核的内存布局图zImage/Image的内核加载器所使用的经典的内存布局(1M=0x100000)低装载情况LinuxOperatingSystemAnalysis29软盘启动,bootsect.S0x7c000x900000x7c00,BIOS0x90000,lilo堆栈,0x3ff4(0x4000-12),向下增长磁盘参数表,12Bytes,0x3ff4~0x4000显示“Loading”Setup0x90200系统小内核,0x10000(64KB处),低装载大内核,0x100000(1MB处),高装载setupLinuxOperatingSystemAnalysis30硬盘启动,两阶段引导装载LILO(LInuxLOader)第一个扇区…装载LINUXBootsect.S0x90000Setup.S0x90200系统0x100000x100000跳转到setupLinuxOperatingSystemAnalysis31启动第一步,小结总之,在跳转到setup的时候,内存里面的代码布局为0x90000:bootsect0x90200:setup低装载:0x10000:带解压的vmlinux高装载:0x100000:带解压的bvmlinux实模式下的内核头结构包括bootsect的最后和setup开始的位置从bootsect的偏移0x1F1开始,具体描述参见documentation/i386/boot.txtLinuxOperatingSystemAnalysis32Setup:0x90200初始化硬件设备并为内核程序的执行建立环境内存检测键盘视频磁盘控制器IBM微通道总线MCAPS/2设备(总线鼠标)APMBIOS若低装载,将系统移动到0x1000处(4KB处)否则,不必临时IDT和临时GDTFPUPIC,16个硬件中断中断向量32~4
本文标题:Linux操作系统分析-linux启动代码分析
链接地址:https://www.777doc.com/doc-3396608 .html