




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告:基于x86体系结构分析linux-2.6.26的启动过程 仅考虑32位体系结构 不考虑多核多处理器 要求1:分析流程按照开机->BIOS->grub->Linux的顺序进行,到start_kernel结束 要求2:结合几个关键的Makefile文件和缺省编译linux的输出信息,给出Linux映像的make过程分析,说明编译链接的结果有哪些? 要求3:结合GRUB和几个链接描述文件,说明GRUB是如何加载bzImage的,GRUB将跳转到内存的哪个地址上开始运行Linux,该地址的代码对应于哪个Linux源文件中的哪处? 要求4:给出Linux中的启动相关的几个关键
2、源文件的执行顺序,分析setup和内核解压缩前后这三个阶段的主要流程(直到start_kernel)。1. 编译内核过程分析首先分析linux-2.6.26的顶层Makefile文件,我们发现这里没有bzImage,不过有如下语句其中的include $(srctree)arch/$(ARCH)/Makefile, 对于x86架构而言,ARCH将会展开成x86,由于bzImage目标在当前的Makefile中并未找到,因此会到该Makefile中包含的子Makefile中寻找。进入/linux-2.6.26/arch/x86/Makefile中分析代码从图中我们可以看到bz
3、Image是依赖于目标vmlinux的,于是下文我们将分两部分分析1.vmlinux的生成A.依赖分析首先在/linux-2.6.26/Makefile中,我们找到vmlinux的定义我们可以看出vmlinux 依赖于vmlinux-lds ,vmlinux-init ,vmlinux-main 和kallsysm.o 变量。然后我们继续查找这些变量可看到:从这里可以看出vmlinux-init依赖于(head-y) $(init-y),vmlinux-main依赖于$(core-y) $(libs-y) $(drivers-y) $
4、(net-y)接下来我们需要分析这些是什么.我们可以找到相关的定义,如下图由图中可以看出,首先这些*-y变量代表着不用的文件夹地址(kernel/ init/ net/等等等)经过patsubst是实现匹配替换的,在这里将文件夹的尾部替换为'/built-in.o' 。例如,init-y初始值为init/经过patsubst替换为“init/built-in.o” 在内核根目录有以下子目录:init 内核初始化代码。提供main.c,包含start kernel函数。kernel 内核管理代码。mm 内存管理代码。ipc 进程间通讯代码。net 网络部分代码
5、。lib 与体系结构无关的内核库代码。drivers 设备驱动代码。每类设备有相应的子目录,如char、block、netfs 文件系统代码。每个支持文件系统有相应的子目录,如ext2、proc等。通过上述分析,我们发现,vmlinux的生成是依赖于这些文件夹内部的built-in.o的,然后最终这些.o文件经过vmlinux-lds的链接描述规则,连接成为vmlinux.至此,vmlinux生成依赖分析完毕。B.生成规则重新找到vmlinux的生成规则其中$(call if changed rule, vmlinux)即调用rule_vmlnux_找到rule_vmlinux_的相关定义,如
6、下根据定义,可以看出它的作用是调用cmd_vmlinux_最终生成并检验System.map找到cmd_vmlinux_可以分析出,它定义了根据vmlinux-lds的规定了链接vmlinux-init以及vmlinux-main生成vmlinux的规则。2.bzImage的生成首先找到/arch/x86/Makefile中bzImage的规则,如下可以观察得知它只是一个链接,链接到文件夹下找到/arch/x86/boot/Makefile的中bzImage根据规则可以看出来bzImage依赖于setup.bin以及vimlinux.bin.而vmlinux.bin有指的是/compresse
7、d/vmlinux,我们需要找到compressed目录下的Makefile,如下:根据规则可以看出来这里的vmlinux依赖于以下文件vmlinux_32.lds(本来就有),head_32.o,misc.o以及piggy.o。其中,head_32.o以及misc.o是用于解压缩和重定位的代码,piggy.o我们可以追溯编译时的console输出情况,最终发现,piggy.o是由vmliux经过一系列过程产生的。具体过程如下A>objcopy 主Makefile生成的位于SOURCE_HOME下的那个vmlinux生成arch/x86/compressed/vmlinux.b
8、in B>arch/x86/compressed/relocs提取SOURCE_HOME/vmlinux的重定位信息输出到arch/x86/compressed/vmlinux.relocs. E>vmlinux.src和vmlinux.bin.gz被链接为piggy.o.综上所述,我们/arch/x86/boot目录下的bzImage是由setup.bin以及一个具有自解压缩的vmlinux.bin组成的。二. Linux启动分析整体启动流程图如下图所示:1. BIOS启动阶段BIOS调用Bootloader来把操作系统的内核映像加载到
9、系统RAM中。(1) 当PC的电源打开后,80x86架构的cpu将自动进入实模式,并从地址0xFFFF0(CS:0xFFFF,IP:0x0)开始自动执行程序代码,这个地址通常是BIOS的地址。(2) BIOS的首先进行POST(Power On Self Test即加电后自检),检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。此时显卡还没有初始化,如果发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),BIOS会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。(3) 然后物理地址0处开始初始化中断向量(注意:这个BIOS的中断向
10、量很重要,后边的很多和硬盘等的交互都是通过此中断向量完成的)。(4) 此后,BIOS将启动设备的第一个扇区(第0磁道第一个扇区被称为MBR即主引导记录,它的大小是512字节,里面存放了用汇编语言编写的预启动信息、分区表信息、魔数0x55AA),读入内存绝对地址0x7C00处,并跳转到这个地址并执行。其实被复制到物理内存0x7C00处的内容就是Boot Loader,对于较早的内核不靠grub启动的,它就是bootsect.S程序,而对于现在PC多数使用grub引导启动的,就是lilo或者grub了。2. Bootloader(以grub为例)启动过程经过BIOS启动阶段,此时我们所需要的boo
11、tloader已经被载入到0x7C00并执行程序。我们分为2个版本讨论grub的启动过程,grub以及grub2:(1) grub:早期版本的grub分为以下3个阶段启动:stage1,stage1_5, stage2l stage1grub的stage1存放在MBR(master boot record,主引导记录),也就是说存放在MBR是磁盘的0柱面,0磁道,1扇区(扇区从1开始计数)。具体存储结构如下图所示:在图中我们可以观察到,stage1写在了MBR的前446个字节中,剩下的60来个字节用来放分区表。stage1的主要作用是:stage1判断磁盘处于CHS或者LBR模式并运行相应代码
12、,将stage1.5装载到内存并运行stage1.5。l stage1_5stage1_5负责识别文件系统和加载stage2,所以stage1_5往往有多个,以支持不同文件系统的读取。在存储方面,stage1.5在“MBR gap”中,也就是MBR与第一个分区之间的那点儿间隙,因为现在的磁盘空间都很大,为了提高性能,好的分区工具默认都是兆字节以上对齐的,所以这个间隙常常在1M以上,但怕的就是例外,所以stage1.5一般保持在31Kb以下。l stage2stage2存放在文件系统中(这主要得益于stage1_5能够识别文件系统并访问)stage2负责显示启动菜单和提供用户交互接口,并根据用户
13、选择或默认配置加载操作系统内核。(2) grub2新的grub启动分两个阶段:l boot.img、cdboot.img、pexboot.img这些是一个阶段。和之前版本相比,这个阶段相应于stage1阶段。l core.img阶段.和原来的grub相比较,core.img对应于stage1.5阶段,因为它们储存的位置是一样的(当然,core.img也可以安装在其它地方),但是,新的grub在core.img阶段之后,基本的功能已经有了,即使所有的分区全部格式化了,还能抛出一个mini shell。这就是相对健壮的原因。经过这个阶段,我们的Bootloader已经把所选择的内核代码加载到了ra
14、m内存中,加载Linux内核的内存布局图如下所示(基于X86)我们可以发现bzImage被分成了3部分装载到ram中:l bootsector(512字节)l setupl protected-mode kernel。bootsector被装载到0x90000处,setup被装载到0x90200处操作系统protected-mode kernel则被装载到:对于小内核:0x10000(即64K处),称为低装载对于大内核:0x100000(即1M处),称为高装载装载完毕之后,grub将跳转到0x90200处运行代码,也就是我们setup部分的代码。setup用于体系结构相关的硬件初始化工作,在a
15、rch目录中的每个系统机构的平台相关都有类似功能的代码。在32位的X86平台中setup的入口时arch/x86/boot/header.s中的_start。3. 实模式setup阶段查看_start代码我们可以看到_start的主要功能是: l 跳转到start of setup l 检查setup 的signature l 清除BSS 段 l 跳转到main 执行 其中,Main 用来初始化硬件设备并为内核程序的执行建立环境象内存检测、键盘、视频等等arch/x86/boot/ma
16、in.c 中,main 函数最后调用go_to_ protected_mode 函数,如下4. 保护模式阶段在setup.bin 中,系统从实模式到了保护模式,在这里我们会调用一个compressed/head_32.S 的startup_32函数这个函数作用是: l 初始化段寄存器和一个临时堆栈l 初始化BSS 段 l 解压缩decompress kernel l 无论高装载或低装载解压缩后,都在物理地址0x100000 (1MB)处 l 跳转到0x100000&
17、#160;处下面是startup_32的截图解压的内核镜像以包含在arch/x86/kernel/head.S中的另一个startup_32()函数开始。这两个函数使用相同的名字不会产生任何问题因为这两个函数会跳转到自己的起始物理地址去执行。 第二个startup_32()函数为第一个linux进程(进程0)建立执行环境。该函数执行以下操作: A.初始化段寄存器 B设置页目录和页表,分页 C.建立进程0 的内核堆栈 D.Setup idt E.拷贝系统参数F.识别处理器G.GDT、IDT H.跳转到i386 start_kernel下面是arch/x86/kernel/head.S中的另一个startup_32的截图start_kernel()函数完成linux内核的初始化工作。几乎每天内核部件都是由这个函数进行初始化的,我们只提及其中的少部分。调用sched_init()函数来初始化调度程序。 调用build_all_zonelists()函数来初始化内存管理区。调用page_alloc_init()函数来初始化伙伴系统分配程序。 调用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业互联网平台数字水印技术在工业互联网平台安全防护中的应用报告
- 行政管理对社会变迁的响应研究试题及答案
- 行政管理的文书写作技巧试题及答案
- 学习难点2025年行政管理试题及答案
- 成功案例分析2025年工程项目管理试题及答案
- 2025年公共关系学考试动态试题及答案回顾
- 2025年智能投顾平台风险管理框架与合规策略研究报告
- 行政管理学基础知识试题及答案
- 行政管理的继承与发展研究试题及答案
- 2025年中医药现代化进程在黑山市场的拓展前景分析报告
- 桩顶地系梁专项施工方案
- 胶粘剂制造业行业营销方案
- 【课件】《“敬畏生命珍爱生命”》主题班会课件
- 【江淮汽车公司财务现状及其盈利能力问题分析(10000字论文)】
- 每日安全检查表
- 学会宽容快乐生活主题班会课件
- 毕业生就业意向调查表
- 《食品安全事故处置方案》
- 国家电网招聘之其他工学类复习提高资料打印
- 婴儿抚触与婴儿操-婴儿抚触的手法(婴幼儿抚触与按摩课件)
- 学校食堂病媒生物防治管理制度范本(通用8篇)
评论
0/150
提交评论