linux系统启动过程分析(下)资料课件



《linux系统启动过程分析(下)资料课件》由会员分享,可在线阅读,更多相关《linux系统启动过程分析(下)资料课件(42页珍藏版)》请在装配图网上搜索。
1、,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,linux,系统启动过程分析(下),第二节,Linux0.,0,1,启动分析,引导过程的描述,引导流程和内核镜像文件,计算机加电过程,BIOS,程序,操作系统引导部分代码的分析,Boot.s,的分析,head.s,的分析,Head.s,的作用,AT&T,汇编语言初步,引导过程的描述,引导流程和内核镜像文件,计算机加电过程,BIOS,程序,引导的步骤,一般来说,操作系统的引导过程分两个步骤:,首先,计算机硬件经过开机自检(,Power On Self-Test,POST),之后,从软盘或硬盘的固定位置装载一
2、小段代码,这段代码一般称为“引导装载器”。,然后,由引导装载器负责装入操作系统,内核镜像文件,并将控制权交给操作系统进行进一步的初始化和运行操作系统,引导装载器非常小,一般只有几百个字节,而操作系统庞大而复杂,上述分成两阶段的引导过程,可将计算机中的固化软件保持得足够小,同时也便于实现对不同操作系统的引导。,Linux0.,0,1,内核镜像文件,由,build.c,程序生成,写入到磁盘(,make disk&dd),计算机加电过程,当机算机的电源键被按下时,同这个键相联的电信号线就会送出一个电信号给主板,主板将此电信号传给供电系统,供电系统开始工作,为整个系统供电,并送出一个电信号给,BIOS
3、,,,通知,BIOS,供电系统已经准备完毕。随后,BIOS,启动一个程序,进行主机自检,主机自检的主要工作是确保系统的每一个部分都得到了电源支持,内存储器、主板上的其它芯片、键盘、鼠标、磁盘控制器及一些,I/O,端口正常可用,此后,自检程序将控制权还给,BIOS,。,接下来,BIOS,读取,BIOS,设置,得到引导驱动器的顺序,然后依次检查,直到找到可以用来引导的驱动器(或说可以用来引导的磁盘,包括软盘、硬盘、光盘等),然后调用这个驱动器上磁盘的引导扇区进行引导。,基本输入输出系统,BIOS,存放在,ROM,中的,BIOS,程序执行开机是系统个部分自检,经过一系列操作之后,,BIOS,会将有关
4、代码和数据存放在内存低端1,MB,末端的64,KB,处,然后跳转到这个地方让,CPU,进入实地址模式工作,将内核文件加载到内存后,,LINUX,不再使用,BIOS,功能,因此,BIOS,中断向量表在引导过程中被覆盖。,BIOS,将所检查磁盘的第一个扇区(,512,B,),载入内存,放在,0,x0000:0 x7c00,处,如果个扇区的最后两个字节是,“55,AA”,,,那么这就是一个引导扇区,这个磁盘也就是一块可引导盘。通常这个大小为,512,B,的程序就称为引导程序(,boot,)。,如果最后两个字节不是,“55,AA”,,,那么,BIOS,就检查下一个磁盘驱动器。,BIOS,是怎么知道或说
5、分辨哪一个磁盘可以用来引导的呢?,引导程序所具有的特点:,它的大小是,512,B,,,不能多一字节也不能少一字节,因为,BIOS,只读,512,B,到内存中去。,它的结尾两字节必须是,“55,AA”,,,这是引导扇区的标志。,它总是放在磁盘的第一个扇区上(,0,磁头,,0,磁道,,1,扇区),因为,BIOS,只读第一个扇区。,利用,BIOS 13,号中断读取磁盘扇区,AH,寄存器:存放功能号,为,2,的时候,表示使用读磁盘功能,DL,寄存器:存驱动器号,表示欲读哪一个驱动器,CH,寄存器:存磁头号,表示欲读哪一个磁头,CL,寄存器:存扇区号,表示欲读的启始扇区,AL,寄存器:存计数值,表示欲读
6、入的扇区数量,在设置了这几个寄存器后,我们就可以使用,int 13,这条指令调用,BIOS 13,号中断读取,指定的磁盘扇区,它将磁盘扇区读入,ES:BX,处,因此,在调用它之前,我们实际上还需要,设置,ES,与,BX,寄存器,以指出数据在内存中存放的位置,0.01版内核,以软盘启动为例:,1 开机,2,BIOS,加电自检(,Power On Self Test,POST),,内存地址为 0,ffff:0000,3,将软盘第一个扇区(0头0道1扇区,也就是,Boot Sector),读入内存地址 0000:7,c00,处。,4 检查(,WORD)0000:7dfe,是否等于 0,xaa55,,
7、若不等于则转去尝试其他启动介质,如果没有其他启动介质则显示,No ROM BASIC,然后死机。,5 跳转到 0000:7,c00,处执行,MBR,中的程序。,6,MBR,将自己移动到9000:0000,7 将内核模块从软盘读入到1000:0000,8 将内核模块移动到0000:0000,9 进入保护模式,10 读取,COMS,信息,设置有关表格,然后调用操作系统初始化程序,MAIN.C,1-5,完全由,BIOS,完成,6-10由,BOOTBOOT.S HEAD.S,完成,其中,BOOT.S,的目标代码就是,MBR(,主引导记录,Master Boot Record),中的程序,操作系统引导流
8、程,Linux0.01,系统引导过程中内核代码在内存中的位置变化,操作系统引导部分代码的分析,Boot.s,的分析,head.s,的分析,Head.s,的作用,AT&T,汇编语言初步,操作系统引导部分代码,0.01版源代码树中/,boot,文件夹中的两个汇编语言程序文件,Boot.s,Head.s,Boot.s,的作用,引导装载器,存放在,mbr,中的一段程序,负责将操作系统加载到内存合适的地方,这一部分的代码运行在实模式中,,boot.s,运行的最后将设置,cr0,进入保护模式,然后将接着执行,head.s,中的程序,Boot.s,采用,intelx86,汇编语法编写,使用8086汇编编译器
9、,as86,和连接器,ld86,产生可执行代码。,除了,boot.s,外,linux,均使用,gnu,的,as,进行编译,这里使用8086的编译器的主要原因是当时,gnu,不支持生成实模式下的16位的代码程序,内核2.4.,x,起,这部分代码才完全使用,as,来编写,Boot.s,源代码分析,阅读时应注意的主要重点,实模式的寻址方式,内核代码在内存中的位置,使用,bios,中断访问软盘,如何为进入保护模式进行初始化设置,开始进入源代码世界,Boot.s,head.s,源代码分析,Head.s,的作用,AT&T,汇编语言初步,Head.s,的作用,这部分代码工作在保护模式下,主要的作用是为开启分
10、页机制进行设置,开启分页机制后将控制权交给,main.c,程序进行进一步的初始化工作,采用了,AT&T,语法的汇编语言语法编写并使用,GNU,的,as(gas),编译器进行编译,由于这种语法和,intel8086,汇编不同,有必要先学习一下,AT&T,的汇编语法,Head.s,的分析,阅读时应注意的主要重点,IDT,GDT,的设置,如何开启分页机制,分页机制的寻址方式,HEAD,完成后内存的布局,开始进入源代码,head.s,AT&T,汇编语言初步,Linux,中的汇编代码,Linux0.01,使用两种汇编器,Linux,中的汇编代码,Linux,中的汇编代码,Linux0.01,使用两种汇编
11、器,as86 (,与之配套的,ld86,链接器),gas(as)(,与之配套的,GNU ld,链接器),Linus,仅用,as86,创建16位的引导扇区程序,boot.s,早期的,as,不支持生成16位的代码,2.4版本之后已经全部改为使用,as,as86,语法类似于,MASM,NASM,等,在,linux,中使用,as86,生成引导区程序,boot,as86,0,a,o boot.o boot.s,ld86,0,s,o boot boot.o,dd if=boot of=/dev/fd0,GNU as,内核中除了,boot.s,外所有汇编语言程序(包括,c,语言产生的汇编程序)均使用,gas
12、,编译。,gas(,现在称为,as),,汇编器最初是专门用于汇编由,gcc,产生的中间汇编程序的。因此支持很多,c,语言特性。(编译,c,语言时,gcc,编译器会首先输出一个作为中间结果的,as,汇编语言文件,然后调用,as,汇编器进行编译),as,基本命令格式,as,选项-,o objfile srcfile.s,比如单独编译,boot/head.s,as o head.o head.s,as,局部符号,1:,incl%eax,movl%eax,0 x000000,cmpl%eax,0 x100000,je 1b,as,汇编命令,.,align,存储对齐汇编命令,比如.,align 3,表示
13、把位置计数器值增加后其最右边0的个数为3,就是把位置计数器增加到8的倍数上,.,byte.word,分别定义一个字节,字,.,fill repeat,size,value,该汇编命令会产生,repeat,个大小为,size,字节的重复拷贝,,value,是填充的值,默认为0,.,guad,定义多个用逗号分开的8字节大数,as,语法-,AT&T,汇编格式,1.,在,AT&T,汇编格式中,寄存器名要加上%作为前缀;而在,Intel,汇编格式中,寄存器名不需要加前缀。,AT&T,的汇编语言语法,Intel,语法,AT&T,语法,mov eax,8 movl$8,%eax,mov ebx,0ffffh
14、 movl$0 xffff,%ebx,int 80h int$0 x80,在,Intel,的语法中,立即数没有前缀。但是在,AT&T,中立即数前冠以,“,$,”,AT&T,的汇编语言语法,Intel,与,AT&T,操作数的方向正好相反。在,Intel,语法中,第一个操作数是目的操作数,第二个操作数源操作数。而在,AT&T,中,第一个数是源操作数,第二个数是目的操作数。由此可以看出,,AT&T,的语法符合人们通常的阅读习惯。,Intel,mov eax,ecx,AT&T movl%ecx,%eax,内存单元操作数,内存操作数也有所不同。在,Intel,的语法中,基寄存器用,“,”,括起来,而在,
15、AT&T,中,用,“,(),”,括起来。,Intel mov eax,ebx+5,AT&T movl 5(%ebx),%eax,AT&T,的汇编语言语法,例子,例子的解释,Linux,是一个运行在保护模式下的 32 位操作系统,采用,flat memory,模式,目前最常用到的是,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,,,可以找到所有系统调用的定义,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。