《linux系統(tǒng)啟動過程分析(下)資料課件》由會員分享,可在線閱讀,更多相關(guān)《linux系統(tǒng)啟動過程分析(下)資料課件(42頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、,單擊此處編輯母版標(biāo)題樣式,*,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,linux,系統(tǒng)啟動過程分析(下),第二節(jié),Linux0.,0,1,啟動分析,引導(dǎo)過程的描述,引導(dǎo)流程和內(nèi)核鏡像文件,計(jì)算機(jī)加電過程,BIOS,程序,操作系統(tǒng)引導(dǎo)部分代碼的分析,Boot.s,的分析,head.s,的分析,Head.s,的作用,AT&T,匯編語言初步,引導(dǎo)過程的描述,引導(dǎo)流程和內(nèi)核鏡像文件,計(jì)算機(jī)加電過程,BIOS,程序,引導(dǎo)的步驟,一般來說,操作系統(tǒng)的引導(dǎo)過程分兩個步驟:,首先,計(jì)算機(jī)硬件經(jīng)過開機(jī)自檢(,Power On Self-Test,POST),之后,從軟盤或硬盤的固定位置裝載一
2、小段代碼,這段代碼一般稱為“引導(dǎo)裝載器”。,然后,由引導(dǎo)裝載器負(fù)責(zé)裝入操作系統(tǒng),內(nèi)核鏡像文件,并將控制權(quán)交給操作系統(tǒng)進(jìn)行進(jìn)一步的初始化和運(yùn)行操作系統(tǒng),引導(dǎo)裝載器非常小,一般只有幾百個字節(jié),而操作系統(tǒng)龐大而復(fù)雜,上述分成兩階段的引導(dǎo)過程,可將計(jì)算機(jī)中的固化軟件保持得足夠小,同時(shí)也便于實(shí)現(xiàn)對不同操作系統(tǒng)的引導(dǎo)。,Linux0.,0,1,內(nèi)核鏡像文件,由,build.c,程序生成,寫入到磁盤(,make disk&dd),計(jì)算機(jī)加電過程,當(dāng)機(jī)算機(jī)的電源鍵被按下時(shí),同這個鍵相聯(lián)的電信號線就會送出一個電信號給主板,主板將此電信號傳給供電系統(tǒng),供電系統(tǒng)開始工作,為整個系統(tǒng)供電,并送出一個電信號給,BIOS
3、,,,通知,BIOS,供電系統(tǒng)已經(jīng)準(zhǔn)備完畢。隨后,BIOS,啟動一個程序,進(jìn)行主機(jī)自檢,主機(jī)自檢的主要工作是確保系統(tǒng)的每一個部分都得到了電源支持,內(nèi)存儲器、主板上的其它芯片、鍵盤、鼠標(biāo)、磁盤控制器及一些,I/O,端口正常可用,此后,自檢程序?qū)⒖刂茩?quán)還給,BIOS,。,接下來,BIOS,讀取,BIOS,設(shè)置,得到引導(dǎo)驅(qū)動器的順序,然后依次檢查,直到找到可以用來引導(dǎo)的驅(qū)動器(或說可以用來引導(dǎo)的磁盤,包括軟盤、硬盤、光盤等),然后調(diào)用這個驅(qū)動器上磁盤的引導(dǎo)扇區(qū)進(jìn)行引導(dǎo)。,基本輸入輸出系統(tǒng),BIOS,存放在,ROM,中的,BIOS,程序執(zhí)行開機(jī)是系統(tǒng)個部分自檢,經(jīng)過一系列操作之后,,BIOS,會將有關(guān)
4、代碼和數(shù)據(jù)存放在內(nèi)存低端1,MB,末端的64,KB,處,然后跳轉(zhuǎn)到這個地方讓,CPU,進(jìn)入實(shí)地址模式工作,將內(nèi)核文件加載到內(nèi)存后,,LINUX,不再使用,BIOS,功能,因此,BIOS,中斷向量表在引導(dǎo)過程中被覆蓋。,BIOS,將所檢查磁盤的第一個扇區(qū)(,512,B,),載入內(nèi)存,放在,0,x0000:0 x7c00,處,如果個扇區(qū)的最后兩個字節(jié)是,“55,AA”,,,那么這就是一個引導(dǎo)扇區(qū),這個磁盤也就是一塊可引導(dǎo)盤。通常這個大小為,512,B,的程序就稱為引導(dǎo)程序(,boot,)。,如果最后兩個字節(jié)不是,“55,AA”,,,那么,BIOS,就檢查下一個磁盤驅(qū)動器。,BIOS,是怎么知道或說
5、分辨哪一個磁盤可以用來引導(dǎo)的呢?,引導(dǎo)程序所具有的特點(diǎn):,它的大小是,512,B,,,不能多一字節(jié)也不能少一字節(jié),因?yàn)?BIOS,只讀,512,B,到內(nèi)存中去。,它的結(jié)尾兩字節(jié)必須是,“55,AA”,,,這是引導(dǎo)扇區(qū)的標(biāo)志。,它總是放在磁盤的第一個扇區(qū)上(,0,磁頭,,0,磁道,,1,扇區(qū)),因?yàn)?BIOS,只讀第一個扇區(qū)。,利用,BIOS 13,號中斷讀取磁盤扇區(qū),AH,寄存器:存放功能號,為,2,的時(shí)候,表示使用讀磁盤功能,DL,寄存器:存驅(qū)動器號,表示欲讀哪一個驅(qū)動器,CH,寄存器:存磁頭號,表示欲讀哪一個磁頭,CL,寄存器:存扇區(qū)號,表示欲讀的啟始扇區(qū),AL,寄存器:存計(jì)數(shù)值,表示欲讀
6、入的扇區(qū)數(shù)量,在設(shè)置了這幾個寄存器后,我們就可以使用,int 13,這條指令調(diào)用,BIOS 13,號中斷讀取,指定的磁盤扇區(qū),它將磁盤扇區(qū)讀入,ES:BX,處,因此,在調(diào)用它之前,我們實(shí)際上還需要,設(shè)置,ES,與,BX,寄存器,以指出數(shù)據(jù)在內(nèi)存中存放的位置,0.01版內(nèi)核,以軟盤啟動為例:,1 開機(jī),2,BIOS,加電自檢(,Power On Self Test,POST),,內(nèi)存地址為 0,ffff:0000,3,將軟盤第一個扇區(qū)(0頭0道1扇區(qū),也就是,Boot Sector),讀入內(nèi)存地址 0000:7,c00,處。,4 檢查(,WORD)0000:7dfe,是否等于 0,xaa55,,
7、若不等于則轉(zhuǎn)去嘗試其他啟動介質(zhì),如果沒有其他啟動介質(zhì)則顯示,No ROM BASIC,然后死機(jī)。,5 跳轉(zhuǎn)到 0000:7,c00,處執(zhí)行,MBR,中的程序。,6,MBR,將自己移動到9000:0000,7 將內(nèi)核模塊從軟盤讀入到1000:0000,8 將內(nèi)核模塊移動到0000:0000,9 進(jìn)入保護(hù)模式,10 讀取,COMS,信息,設(shè)置有關(guān)表格,然后調(diào)用操作系統(tǒng)初始化程序,MAIN.C,1-5,完全由,BIOS,完成,6-10由,BOOTBOOT.S HEAD.S,完成,其中,BOOT.S,的目標(biāo)代碼就是,MBR(,主引導(dǎo)記錄,Master Boot Record),中的程序,操作系統(tǒng)引導(dǎo)流
8、程,Linux0.01,系統(tǒng)引導(dǎo)過程中內(nèi)核代碼在內(nèi)存中的位置變化,操作系統(tǒng)引導(dǎo)部分代碼的分析,Boot.s,的分析,head.s,的分析,Head.s,的作用,AT&T,匯編語言初步,操作系統(tǒng)引導(dǎo)部分代碼,0.01版源代碼樹中/,boot,文件夾中的兩個匯編語言程序文件,Boot.s,Head.s,Boot.s,的作用,引導(dǎo)裝載器,存放在,mbr,中的一段程序,負(fù)責(zé)將操作系統(tǒng)加載到內(nèi)存合適的地方,這一部分的代碼運(yùn)行在實(shí)模式中,,boot.s,運(yùn)行的最后將設(shè)置,cr0,進(jìn)入保護(hù)模式,然后將接著執(zhí)行,head.s,中的程序,Boot.s,采用,intelx86,匯編語法編寫,使用8086匯編編譯器
9、,as86,和連接器,ld86,產(chǎn)生可執(zhí)行代碼。,除了,boot.s,外,linux,均使用,gnu,的,as,進(jìn)行編譯,這里使用8086的編譯器的主要原因是當(dāng)時(shí),gnu,不支持生成實(shí)模式下的16位的代碼程序,內(nèi)核2.4.,x,起,這部分代碼才完全使用,as,來編寫,Boot.s,源代碼分析,閱讀時(shí)應(yīng)注意的主要重點(diǎn),實(shí)模式的尋址方式,內(nèi)核代碼在內(nèi)存中的位置,使用,bios,中斷訪問軟盤,如何為進(jìn)入保護(hù)模式進(jìn)行初始化設(shè)置,開始進(jìn)入源代碼世界,Boot.s,head.s,源代碼分析,Head.s,的作用,AT&T,匯編語言初步,Head.s,的作用,這部分代碼工作在保護(hù)模式下,主要的作用是為開啟分
10、頁機(jī)制進(jìn)行設(shè)置,開啟分頁機(jī)制后將控制權(quán)交給,main.c,程序進(jìn)行進(jìn)一步的初始化工作,采用了,AT&T,語法的匯編語言語法編寫并使用,GNU,的,as(gas),編譯器進(jìn)行編譯,由于這種語法和,intel8086,匯編不同,有必要先學(xué)習(xí)一下,AT&T,的匯編語法,Head.s,的分析,閱讀時(shí)應(yīng)注意的主要重點(diǎn),IDT,GDT,的設(shè)置,如何開啟分頁機(jī)制,分頁機(jī)制的尋址方式,HEAD,完成后內(nèi)存的布局,開始進(jìn)入源代碼,head.s,AT&T,匯編語言初步,Linux,中的匯編代碼,Linux0.01,使用兩種匯編器,Linux,中的匯編代碼,Linux,中的匯編代碼,Linux0.01,使用兩種匯編
11、器,as86 (,與之配套的,ld86,鏈接器),gas(as)(,與之配套的,GNU ld,鏈接器),Linus,僅用,as86,創(chuàng)建16位的引導(dǎo)扇區(qū)程序,boot.s,早期的,as,不支持生成16位的代碼,2.4版本之后已經(jīng)全部改為使用,as,as86,語法類似于,MASM,NASM,等,在,linux,中使用,as86,生成引導(dǎo)區(qū)程序,boot,as86,0,a,o boot.o boot.s,ld86,0,s,o boot boot.o,dd if=boot of=/dev/fd0,GNU as,內(nèi)核中除了,boot.s,外所有匯編語言程序(包括,c,語言產(chǎn)生的匯編程序)均使用,gas
12、,編譯。,gas(,現(xiàn)在稱為,as),,匯編器最初是專門用于匯編由,gcc,產(chǎn)生的中間匯編程序的。因此支持很多,c,語言特性。(編譯,c,語言時(shí),gcc,編譯器會首先輸出一個作為中間結(jié)果的,as,匯編語言文件,然后調(diào)用,as,匯編器進(jìn)行編譯),as,基本命令格式,as,選項(xiàng)-,o objfile srcfile.s,比如單獨(dú)編譯,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、把位置計(jì)數(shù)器值增加后其最右邊0的個數(shù)為3,就是把位置計(jì)數(shù)器增加到8的倍數(shù)上,.,byte.word,分別定義一個字節(jié),字,.,fill repeat,size,value,該匯編命令會產(chǎn)生,repeat,個大小為,size,字節(jié)的重復(fù)拷貝,,value,是填充的值,默認(rèn)為0,.,guad,定義多個用逗號分開的8字節(jié)大數(shù),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,的語法中,立即數(shù)沒有前綴。但是在,AT&T,中立即數(shù)前冠以,“,$,”,AT&T,的匯編語言語法,Intel,與,AT&T,操作數(shù)的方向正好相反。在,Intel,語法中,第一個操作數(shù)是目的操作數(shù),第二個操作數(shù)源操作數(shù)。而在,AT&T,中,第一個數(shù)是源操作數(shù),第二個數(shù)是目的操作數(shù)。由此可以看出,,AT&T,的語法符合人們通常的閱讀習(xí)慣。,Intel,mov eax,ecx,AT&T movl%ecx,%eax,內(nèi)存單元操作數(shù),內(nèi)存操作數(shù)也有所不同。在,Intel,的語法中,基寄存器用,“,”,括起來,而在,
15、AT&T,中,用,“,(),”,括起來。,Intel mov eax,ebx+5,AT&T movl 5(%ebx),%eax,AT&T,的匯編語言語法,例子,例子的解釋,Linux,是一個運(yùn)行在保護(hù)模式下的 32 位操作系統(tǒng),采用,flat memory,模式,目前最常用到的是,ELF,格式的二進(jìn)制代碼。一個,ELF,格式的可執(zhí)行程序通常劃分為如下幾個部分:.,text、.data,和.,bss,,其中.,text,是只讀的代碼區(qū),.,data,是可讀可寫的數(shù)據(jù)區(qū),而.,bss,則是可讀可寫且沒有初始化的數(shù)據(jù)區(qū)。代碼區(qū)和數(shù)據(jù)區(qū)在,ELF,中統(tǒng)稱為,section,,根據(jù)實(shí)際需要你可以使用其它標(biāo)準(zhǔn)的,section,,也可以添加自定義,section,,但一個,ELF,可執(zhí)行程序至少應(yīng)該有一個.,text,部分,例子的解釋,上面兩個匯編程序采用的語法雖然完全不同,但功能卻都是調(diào)用,Linux,內(nèi)核提供的,sys_write,來顯示一個字符串,然后再調(diào)用,sys_exit,退出程序。,Linux,系統(tǒng)有效的系統(tǒng)調(diào)用列表安裝在:,/,usr/man/man2/unistd.h,/usr/include/sys/syscall.h./usr/include/asm/unistd.h,,,可以找到所有系統(tǒng)調(diào)用的定義,