版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux系统启动过程分析(下)第二节Linux0.01启动分析引导过程的描述引导流程和内核镜像文件计算机加电过程BIOS程序操作系统引导部分代码的分析Boot.s的分析head.s的分析Head.s的作用AT&T汇编语言初步引导过程的描述引导流程和内核镜像文件计算机加电过程BIOS程序引导的步骤
一般来说,操作系统的引导过程分两个步骤:首先,计算机硬件经过开机自检(PowerOnSelf-Test,POST)之后,从软盘或硬盘的固定位置装载一小段代码,这段代码一般称为“引导装载器”。然后,由引导装载器负责装入操作系统内核镜像文件并将控制权交给操作系统进行进一步的初始化和运行操作系统引导装载器非常小,一般只有几百个字节,而操作系统庞大而复杂,上述分成两阶段的引导过程,可将计算机中的固化软件保持得足够小,同时也便于实现对不同操作系统的引导。Linux0.
01内核镜像文件
由build.c程序生成写入到磁盘(makedisk&&dd)计算机加电过程当机算机的电源键被按下时,同这个键相联的电信号线就会送出一个电信号给主板,主板将此电信号传给供电系统,供电系统开始工作,为整个系统供电,并送出一个电信号给BIOS,通知BIOS供电系统已经准备完毕。随后BIOS启动一个程序,进行主机自检,主机自检的主要工作是确保系统的每一个部分都得到了电源支持,内存储器、主板上的其它芯片、键盘、鼠标、磁盘控制器及一些I/O端口正常可用,此后,自检程序将控制权还给BIOS。接下来BIOS读取BIOS设置,得到引导驱动器的顺序,然后依次检查,直到找到可以用来引导的驱动器(或说可以用来引导的磁盘,包括软盘、硬盘、光盘等),然后调用这个驱动器上磁盘的引导扇区进行引导。基本输入输出系统
BIOS
存放在ROM中的BIOS程序执行开机是系统个部分自检,经过一系列操作之后,BIOS会将有关代码和数据存放在内存低端1MB末端的64KB处,然后跳转到这个地方让CPU进入实地址模式工作将内核文件加载到内存后,LINUX不再使用BIOS功能,因此BIOS中断向量表在引导过程中被覆盖。BIOS将所检查磁盘的第一个扇区(512B)载入内存,放在0x0000:0x7c00处,如果个扇区的最后两个字节是“55AA”,那么这就是一个引导扇区,这个磁盘也就是一块可引导盘。通常这个大小为512B的程序就称为引导程序(boot)。如果最后两个字节不是“55AA”,那么BIOS就检查下一个磁盘驱动器。BIOS是怎么知道或说分辨哪一个磁盘可以用来引导的呢?引导程序所具有的特点:它的大小是512B,不能多一字节也不能少一字节,因为BIOS只读512B到内存中去。它的结尾两字节必须是“55AA”,这是引导扇区的标志。它总是放在磁盘的第一个扇区上(0磁头,0磁道,1扇区),因为BIOS只读第一个扇区。利用BIOS13号中断读取磁盘扇区AH寄存器:存放功能号,为2的时候,表示使用读磁盘功能DL寄存器:存驱动器号,表示欲读哪一个驱动器CH寄存器:存磁头号,表示欲读哪一个磁头CL寄存器:存扇区号,表示欲读的启始扇区AL寄存器:存计数值,表示欲读入的扇区数量在设置了这几个寄存器后,我们就可以使用int13这条指令调用BIOS13号中断读取指定的磁盘扇区,它将磁盘扇区读入ES:BX处,因此,在调用它之前,我们实际上还需要设置ES与BX寄存器,以指出数据在内存中存放的位置0.01版内核,以软盘启动为例:1开机2BIOS加电自检(PowerOnSelfTest,POST),内存地址为0ffff:00003将软盘第一个扇区(0头0道1扇区,也就是BootSector)读入内存地址0000:7c00处。4检查(WORD)0000:7dfe是否等于0xaa55,若不等于则转去尝试其他启动介质,如果没有其他启动介质则显示"NoROMBASIC"然后死机。5跳转到0000:7c00处执行MBR中的程序。6MBR将自己移动到9000:00007将内核模块从软盘读入到1000:00008将内核模块移动到0000:00009进入保护模式10读取COMS信息,设置有关表格,然后调用操作系统初始化程序MAIN.C1-5完全由BIOS完成,6-10由BOOT\BOOT.SHEAD.S完成其中BOOT.S的目标代码就是MBR(主引导记录MasterBootRecord)中的程序操作系统引导流程Linux0.01系统引导过程中内核代码在内存中的位置变化
操作系统引导部分代码的分析Boot.s的分析head.s的分析Head.s的作用AT&T汇编语言初步操作系统引导部分代码0.01版源代码树中/boot文件夹中的两个汇编语言程序文件Boot.sHead.sBoot.s的作用引导装载器,存放在mbr中的一段程序,负责将操作系统加载到内存合适的地方,这一部分的代码运行在实模式中,boot.s运行的最后将设置cr0进入保护模式,然后将接着执行head.s中的程序Boot.s采用intelx86汇编语法编写,使用8086汇编编译器as86和连接器ld86产生可执行代码。除了boot.s外,linux均使用gnu的as进行编译,这里使用8086的编译器的主要原因是当时gnu不支持生成实模式下的16位的代码程序,内核2.4.x起,这部分代码才完全使用as来编写Boot.s源代码分析阅读时应注意的主要重点实模式的寻址方式内核代码在内存中的位置使用bios中断访问软盘如何为进入保护模式进行初始化设置开始进入源代码世界Boot.shead.s源代码分析Head.s的作用AT&T汇编语言初步Head.s的作用这部分代码工作在保护模式下,主要的作用是为开启分页机制进行设置,开启分页机制后将控制权交给main.c程序进行进一步的初始化工作采用了AT&T语法的汇编语言语法编写并使用GNU的as(gas)编译器进行编译,由于这种语法和intel8086汇编不同,有必要先学习一下AT&T的汇编语法Head.s的分析阅读时应注意的主要重点IDT,GDT的设置如何开启分页机制分页机制的寻址方式HEAD完成后内存的布局开始进入源代码head.sAT&T汇编语言初步Linux中的汇编代码Linux0.01使用两种汇编器Linux中的汇编代码Linux中的汇编代码Linux0.01使用两种汇编器as86(与之配套的ld86链接器)gas(as)(与之配套的GNUld链接器)Linus仅用as86创建16位的引导扇区程序boot.s早期的as不支持生成16位的代码,2.4版本之后已经全部改为使用asas86语法类似于MASM,NASM等在linux中使用as86生成引导区程序bootas86–0–a–oboot.oboot.sld86–0–s–obootboot.oddif=bootof=/dev/fd0GNUas内核中除了boot.s外所有汇编语言程序(包括c语言产生的汇编程序)均使用gas编译。gas(现在称为as),汇编器最初是专门用于汇编由gcc产生的中间汇编程序的。因此支持很多c语言特性。(编译c语言时gcc编译器会首先输出一个作为中间结果的as汇编语言文件,然后调用as汇编器进行编译)as基本命令格式as[选项][-oobjfile][srcfile.s]比如单独编译boot/head.sas–ohead.ohead.sas局部符号1:incl%eaxmovl%eax,0x000000cmpl%eax,0x100000je1b
as汇编命令.align存储对齐汇编命令,比如.align3表示把位置计数器值增加后其最右边0的个数为3,就是把位置计数器增加到8的倍数上.byte.word分别定义一个字节,字.fillrepeat,size,value该汇编命令会产生repeat个大小为size字节的重复拷贝,value是填充的值,默认为0.guad定义多个用逗号分开的8字节大数as语法-AT&T汇编格式1.
在AT&T汇编格式中,寄存器名要加上'%'作为前缀;而在Intel汇编格式中,寄存器名不需要加前缀。AT&T的汇编语言语法Intel语法AT&T语法moveax,8movl$8,%eaxmovebx,0ffffhmovl$0xffff,%ebxint80hint$0x80在Intel的语法中,立即数没有前缀。但是在AT&T中立即数前冠以“$”AT&T的汇编语言语法Intel与AT&T操作数的方向正好相反。在Intel语法中,第一个操作数是目的操作数,第二个操作数源操作数。而在AT&T中,第一个数是源操作数,第二个数是目的操作数。由此可以看出,AT&T的语法符合人们通常的阅读习惯。Intel
moveax,ecxAT&Tmovl%ecx,%eax内存单元操作数内存操作数也有所不同。在Intel的语法中,基寄存器用“[]”括起来,而在AT&T中,用“()”括起来。Intelmoveax,[ebx+5]AT&Tmovl5(%ebx),%eaxAT&T的汇编语言语法例子例子的解释Linux是一个运行在保护模式下的32位操作系统,采用flatmemory模式,目前最常用到的是ELF格式的二进制代码。一个ELF格式的可执行程序通常划分为如下几个部分:.text、.data和.bss,其中.text是只读的代码区,.data是可读可写的数据区,而.bss则是可读可写且没有初始化的数据区。代码区和数据区在ELF中统称为section,根据实际需要你可以使用其它标准的section,也可以添加自定义section,但一个ELF可执行程序至少应该有一个.text部分例子的解释上面两个汇编程序采用的语法虽然完全不同,但功能却都是调用Linux内核提供的sys_write来显示一个字符串,然后再调用sys_exit退出程序。Linux系统有效的系统调用列表安装在:
/usr/man/man2/unistd.h
/usr/include/sys/syscall.h.
/usr/include/asm/unistd.h,可以找到所有系统调用的定义内容总结linux系统启动过程分析(下)。然后,由引导装载器负责装入操作系统内核镜像文件并将控制权交给操作系统进行进一步的初始化和运行操作系统。通常这个大小为512B的程序就称为引导程序(boot)。它的结尾两字节必须是“55AA”,这是引导扇区的标志。DL寄存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年紫藤萝瀑布片段教学设计
- 项目一任务1教案(参考)
- 2025-2026学年中班戏剧活动教案
- 二、机器人是怎样工作的教学设计小学信息技术(信息科技)六年级下册电子工业版(宁夏)
- 2026年学前儿童语言教育试题(含答案)
- §2 特征向量在生态模型中的简单应用说课稿2025学年高中数学北师大版2011选修4-2矩阵与变换-北师大版2006
- 智齿冠周炎的布洛芬止痛
- 八年级语文下册 任务三 举办演讲比赛教案 新人教版
- 东南西北(辨认东南西北)(教学设计)二年级下册数学北师大版
- 2026年中医食疗学测试题及答案
- 古建筑工程施工组织设计方案
- 【MOOC】民事诉讼法学-西南政法大学 中国大学慕课MOOC答案
- 2023年高考辽宁卷化学真题(解析版)
- 《论语》导读(复旦版)学习通超星期末考试答案章节答案2024年
- 压力管道使用单位压力管道安全日管控制度及压力管道安全员守则和每日压力管道安全检查记录
- 品管圈:汇报提高儿科护士桡动脉采血的穿刺成功率课件
- 船体装配工、高级理论复习题
- 马克思主义基本原理-2023版-课后习题答案
- 100以内加减法混合竖式练习题
- 2023年江西新余中考历史真题及答案
- 【人教版】八年级数学下册《一次函数与方程、不等式》基础测试卷及答案
评论
0/150
提交评论