操作系統(tǒng)的啟動(dòng)引導(dǎo)_第1頁
操作系統(tǒng)的啟動(dòng)引導(dǎo)_第2頁
操作系統(tǒng)的啟動(dòng)引導(dǎo)_第3頁
操作系統(tǒng)的啟動(dòng)引導(dǎo)_第4頁
操作系統(tǒng)的啟動(dòng)引導(dǎo)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、操作系統(tǒng)的啟動(dòng)引導(dǎo)操作系統(tǒng)的啟動(dòng)引導(dǎo)操作系統(tǒng)初探操作系統(tǒng)初探l計(jì)算機(jī)硬件結(jié)構(gòu)l計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)l什么是操作系統(tǒng)計(jì)算機(jī)硬件結(jié)構(gòu)計(jì)算機(jī)硬件結(jié)構(gòu)計(jì)算機(jī)硬件結(jié)構(gòu)計(jì)算機(jī)硬件結(jié)構(gòu)l計(jì)算機(jī)是如何在上屏幕上輸出“hello!”的?計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)l操作系統(tǒng)是計(jì)算機(jī)硬件和應(yīng)用之間的一層軟件什么是操作系統(tǒng)什么是操作系統(tǒng)l是計(jì)算機(jī)硬件和應(yīng)用之間的一層軟件p方便我們使用硬件,如使用顯存p高效的使用硬件,如開多個(gè)終端(窗口)l管理什么Linux 0.11Linux 0.11啟動(dòng)代碼分析啟動(dòng)代碼分析l計(jì)算機(jī)是如何工作的l引導(dǎo)扇區(qū)代碼:Bootsect.slSetup模塊分析lSystem模塊分析計(jì)算機(jī)是如何工作

2、的計(jì)算機(jī)是如何工作的l從白紙到圖靈機(jī)從白紙到圖靈機(jī)計(jì)算機(jī)是如何工作的計(jì)算機(jī)是如何工作的l從圖靈機(jī)到通用圖靈機(jī)從圖靈機(jī)到通用圖靈機(jī)計(jì)算機(jī)是如何工作的計(jì)算機(jī)是如何工作的l從通用圖靈機(jī)到計(jì)算機(jī)從通用圖靈機(jī)到計(jì)算機(jī)p馮渃依曼在1946年提出存儲(chǔ)程序思想p存儲(chǔ)程序的主要思想:將程序和數(shù)據(jù)存放到計(jì)算機(jī)內(nèi)部的存儲(chǔ)器中,計(jì)算機(jī)在程序的控制下一步一步進(jìn)行處理p計(jì)算機(jī)由五大部件組成:輸入設(shè)備、輸出設(shè)備、存儲(chǔ)器、運(yùn)算器、控制器計(jì)算機(jī)是如何工作的計(jì)算機(jī)是如何工作的l打開電源,計(jì)算機(jī)執(zhí)行的第一條指令打開電源,計(jì)算機(jī)執(zhí)行的第一條指令p計(jì)算模型我們要關(guān)注指針I(yè)P及其指向的內(nèi)容計(jì)算機(jī)剛打開電源時(shí),IP=?是由硬件設(shè)計(jì)者決定!

3、lx86 PCx86 PCpx86 PC剛開機(jī)時(shí)CPU處于實(shí)模式(cs:ip的尋址模式)p開機(jī)時(shí),CS=0 xFFFF; IP=0 x0000尋址0 x?(為ROM BIOSROM BIOS映射區(qū)映射區(qū))p檢查RAM,鍵盤,顯示器,軟硬磁盤p將磁盤0磁道0扇區(qū)讀入cs=0 x07c0, ip=0 x0000處,尋址0 x?計(jì)算機(jī)是如何工作的計(jì)算機(jī)是如何工作的l0 x7c000 x7c00處存放的代碼處存放的代碼p是從磁盤引導(dǎo)扇區(qū)讀入的那512個(gè)字節(jié)p引導(dǎo)扇區(qū)就是啟動(dòng)設(shè)備的第一個(gè)扇區(qū)p啟動(dòng)設(shè)備信息被設(shè)置在CMOS中CMOS是BIOS嗎?p因此,硬盤的第一個(gè)扇區(qū)上存放著開機(jī)后執(zhí)行的第一段我們可以控

4、制的程序CMOSCMOS: 互補(bǔ)金屬氧化物半導(dǎo)體(64B-128B),是電腦主板上用來保存計(jì)算機(jī)基本啟動(dòng)信息。CMOS RAM本身只是一塊存儲(chǔ)器,只有數(shù)據(jù)保存功能。對(duì)BIOSBIOS中各項(xiàng)參數(shù)的設(shè)定要通過專門的程序。因此BIOS設(shè)置有時(shí)也被叫做CMOS設(shè)置。 引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.s.globl begtext,begdata,begbss,endtext,enddata,endbss.text /文本段begtext:.data /數(shù)據(jù)段begdata:.bss /未初始化數(shù)據(jù)段begbss:entry start /關(guān)鍵字entry告訴鏈接器“程

5、序入口”start:mov ax, #BOOTSEG mov ds, axmov ax, #INITSEG mov es, axmov cx, #256sub si, si sub di,direp movwjmpi go, INITSEG.text等是偽操作符,告訴編譯器產(chǎn)生文本段,.text用于標(biāo)識(shí)文本段的開始位置。SETUPLEN = 4BOOTSEG = 0 x07c0INITSEG = 0 x9000SETUPSEG = 0 x9020SYSSEG = 0 x1000ENDSEG = SYSSEG + SYSSIZEROOT_DEV = 0X306ds=0 x07c0es=0 x90

6、00cx計(jì)數(shù)寄存器計(jì)數(shù)256W表示移動(dòng)的是字移動(dòng)多少字節(jié)呢?si=0, di=0這就是0 x7c00處存放的語句ds:si為0 x7c00,ds為數(shù)據(jù)段寄存器,si為源變址寄存器,可用來存放相對(duì)于DS段之源變址指針es:di為0 x90000,es為附加段寄存器,di為目地變址寄存器,可用來存放相對(duì)于 ES 段之目的變址指針段間跳轉(zhuǎn):cs=INITISE=0 x9000,ip=go引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.slBootsect.s首先將自身復(fù)制到地址0 x90200中,并跳轉(zhuǎn)到復(fù)制后的地址中執(zhí)行:引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBoots

7、ect.sl jmpi go, INITSEG之后go: mov ax,csmov ds,ax mov es,ax mov ss,ax mov sp,#0 xff00load_setup: /載入setup模塊mov dx,#0 x0000 mov cx,#0 x0002 mov bx,#0 x0200mov ax,#0 x0200+SETUPLEN int 0 x13 /BIOS中斷jnc ok_load_setupmov dx,#0 x0000mov ax,#0 x0000int 0 x13j load_setup /重讀 cs=0 x9000ds, es, ss=0 x9000sp=0

8、xFF00??臻g為?0 x90000- 0 x9FF00INT 0 x13,AH=02:BIOS讀磁盤扇區(qū)的中斷:dh=磁頭號(hào),dl=驅(qū)動(dòng)器號(hào),驅(qū)動(dòng)器0,磁頭0ch=柱面號(hào),cl=開始扇區(qū),磁道0,扇區(qū)2es:bx=讀出數(shù)據(jù)的緩沖區(qū)地址(es:bx為0 x90200)al=要讀的扇區(qū)數(shù)(SETUPLEN=4)如果成功,則跳轉(zhuǎn)到ok_load_setup跳轉(zhuǎn)到load_setup,重讀否則,復(fù)位磁盤引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.sl執(zhí)行jmpi go,INITSEG后就由開始的Bootsect.s跳轉(zhuǎn)到復(fù)制后的Bootsect.s中的標(biāo)號(hào)go處繼續(xù)執(zhí)行;然后B

9、ootsect.s把Setup.s從磁盤中讀取到內(nèi)存位置0 x90200處,如下圖所示:引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.s Bootsect.s Ok_load_setup: /載入setup模塊 mov dl,#0 x00 mov ax,#0 x0800 int 0 x13 mov ch,#0 x00 mov sectors,cx mov ah,#0 x03 xor bh,bh int 0 x10 /讀光標(biāo) mov cx,#24 mov bx,#0 x0007 mov bp,#msg1 mov ax,#1301 int 0 x10 /顯示字符 mov ax,#SYSSEG /S

10、YSSEG=0 x1000 mov es,ax call read_it /讀入system模塊 jmpi 0,SETUPSEGbootsect.s中的數(shù)據(jù)/在文件末尾sectors: .word 0 /磁道扇區(qū)數(shù)msg1:.byte 13,10/換行+回車.ascii “Loading system.”.byte 13,10,13,10 /2對(duì)換行+回車獲得磁盤參數(shù),dl為磁盤驅(qū)動(dòng)器號(hào)獲取光標(biāo)位置和形狀,bh為頁號(hào)cx=24表示輸出24個(gè)字符, bl=7為顯示屬性寫字符串,al=1表示字符串只包含字符碼,顯示之后更新光標(biāo)位置es:bp為字符串的段:偏移地址,bp=msg1,es=SSSEG=

11、0 x1000ip=0,cs=SETUPSEG=0 x9020,cs:ip為0 x90200,跳轉(zhuǎn)到0 x90200地址處的第一條指令繼續(xù)執(zhí)行,也就是進(jìn)入到了Setup.s中引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.sl加載完Setup.s后在屏幕上打印Loading system .l接著調(diào)用read_it把SYSTEM,也就是LINUX0.11的內(nèi)核讀取到內(nèi)存位置0 x10000處引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.sl為什么讀入system模塊還需要定義一個(gè)函數(shù)?read_it: mov ax,es cmp ax,#ENDSEG jb

12、 ok1_read retok1_read:mov ax,sectorssub ax,sread /sread是當(dāng)前磁道已讀扇區(qū)數(shù),ax未讀扇區(qū)數(shù)call read_track /讀磁道.psystem模塊可能很大,要跨越磁道!pENDSEG=SYSSEG+SYSSIZEpSYSSIZE=0 x8000 /該變量可根據(jù)Image大小設(shè)定(編譯操作系統(tǒng)時(shí))引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.sl引導(dǎo)扇區(qū)的末尾/BIOS用以識(shí)別引導(dǎo)扇區(qū)ljmpi 0, SETUPSEG跳轉(zhuǎn)至setup執(zhí)行.org 510 .word 0 xAA55 /扇區(qū)的最后兩個(gè)字節(jié)lBootSe

13、ct小結(jié):采用分段讀入的方式將OS從磁盤載入到內(nèi)存中p將自身復(fù)制到地址0 x90200處p讀入setupp在屏幕上打印啟動(dòng)Logop讀入systemSetupSetup模塊分析模塊分析lSetup.s將完成OS啟動(dòng)前的設(shè)置start: mov ax,#INITSEG mov ds,ax mov ah,#0 x03 xor bh,bh int 0 x10 mov 0,dx mov ah,#0 x88 int 0 x15 mov 2,ax . cli /不允許中斷 mov ax,#0 x0000 clddo_move: mov es,ax add ax,#0 x1000 cmp ax,#0 x90

14、00 jz end_move mov ds,ax sub di,di sub si,si mov cx,#0 x8000 rep movsw jmp do_move INITSEG = 0 x9000ds=0 x9000取光標(biāo)位置信息放在dx這是間址尋址,當(dāng)前數(shù)據(jù)段ds=0 x9000,這條指令將放在dx中的光標(biāo)位置信息存放在0 x90004+0的位置,即0 x90000獲取物理內(nèi)存大小,返回值放入AX中同理,這條指令將放在ax中的物理內(nèi)存大小信息存放在0 x9000 Imagetools/system: boot/head.o init/main.o $(DRIVERS) $(LD) boo

15、t/head.o init/main.o $(DRIVERS) -o tools/system Image為輸入文件 為軟驅(qū)AMakefileSystemSystem模塊分析模塊分析lsetup是進(jìn)入保護(hù)模式,head是進(jìn)入之后的初始化startup_32: movl $0 x10,%eax mov %ax,%ds mov %ax,%esmov %ax,%fs mov %ax,%gs /指向gdt的0 x10項(xiàng)(數(shù)據(jù)段)lss _stack_start,%esp /設(shè)置棧(系統(tǒng)棧)call setup_idtcall setup_gdt xorl %eax,%eax1:incl %eaxmov

16、l %eax,0 x000000 cmpl %eax,0 x100000je 1b /0地址處和1M地址處相同(A20沒開啟),就死循環(huán)jmp after_page_tables /設(shè)置頁表之后setup_idt: lea ignore_int,%edxmovl $0 x00080000,%eax movw %dx,%axlea _idt,%edi movl %eax,(%edi) 這是32位匯編代碼關(guān)于匯編關(guān)于匯編las86匯編:能產(chǎn)生16位代碼的Intel 8086(386)匯編pmov ax, cs /csax, 目標(biāo)操作數(shù)在前l(fā)GNU as匯編:產(chǎn)生32位代碼,使用AT&T系統(tǒng)

17、V語法pAT&T美國電話電報(bào)公司,包含貝爾實(shí)驗(yàn)室等,1983年AT&T UNIX支持組發(fā)布了系統(tǒng)Vpmovl var, %eax/(var) %eaxpmovb -4(%ebp), %al /取出一字節(jié)l內(nèi)嵌匯編,gcc編譯x.c會(huì)產(chǎn)生中間結(jié)果as匯編文件x.s_asm_(“匯編語句”: 輸出: 輸入: 破壞部分描述);_asm_(“movb %fs:%2, %al”:”=a”(_res):”0”(seg),”m”(*(addr);SystemSystem模塊分析模塊分析lhead.s所做的工作:p又一次初始化了idt表和gdt表p然后開啟20號(hào)地址線,這樣就可以訪問4G的內(nèi)存

18、了lafter_page_tablespsetup_paging執(zhí)行ret后? 會(huì)執(zhí)行函數(shù)main()p進(jìn)入main()后的棧為0,0,0,L6pmain()函數(shù)的三個(gè)參數(shù)是0,0,0pmain()函數(shù)返回時(shí)進(jìn)入L6,死循環(huán).after_page_tables:pushl $0 pushl $0 pushl $0 pushl $L6pushl $_main jmp set_pagingL6: jmp L6setup_paging: 設(shè)置頁表retSystemSystem模塊分析模塊分析l進(jìn)入main函數(shù)在init/main.c中void main(void) mem_init(); trap_init(); blk_dev_init(); chr_dev_init(); tty_i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論