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

下載本文檔

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

文檔簡介

1、操作系統(tǒng)的啟動引導(dǎo)操作系統(tǒ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高效的使用硬件,如開多個終端(窗口) l管理什么 Linux 0.11Linux 0.11啟動代碼分析啟動代碼分析 l計(jì)算機(jī)是如何工作的 l引導(dǎo)扇區(qū)代碼:Bootsect.s lSetup模塊分析

2、lSystem模塊分析 計(jì)算機(jī)是如何工作的計(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年提出存儲程序思想 p存儲程序的主要思想:將程序和數(shù)據(jù)存放到計(jì)算機(jī)內(nèi) 部的存儲器中,計(jì)算機(jī)在程序的控制下一步一步進(jìn)行 處理 p計(jì)算機(jī)由五大部件組成:輸入設(shè)備、輸出設(shè)備、存儲 器、運(yùn)算器、控制器 計(jì)算機(jī)是如何工作的計(jì)算機(jī)是如何工作的 l打開電源,計(jì)算機(jī)執(zhí)行的第一條指令打開電源,計(jì)算機(jī)執(zhí)行的第一條指令 p計(jì)算模型我們要關(guān)注指

3、針I(yè)P及其指向的內(nèi)容 計(jì)算機(jī)剛打開電源時,IP=?是由硬件設(shè)計(jì)者決定! lx86 PCx86 PC px86 PC剛開機(jī)時CPU處于實(shí)模式(cs:ip的尋址模式) p開機(jī)時,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個字節(jié) p引導(dǎo)扇區(qū)就是啟動設(shè)備的第一個扇區(qū) p啟動設(shè)備信息被設(shè)置在

4、CMOS中 CMOS是BIOS嗎? p因此,硬盤的第一個扇區(qū)上存放著開機(jī)后執(zhí)行的第一 段我們可以控制的程序 CMOSCMOS: 互補(bǔ)金屬氧化物半導(dǎo) 體(64B-128B),是電腦主板 上用來保存計(jì)算機(jī)基本啟動 信息。CMOS RAM本身只是一 塊存儲器,只有數(shù)據(jù)保存功 能。 對BIOSBIOS中各項(xiàng)參數(shù)的設(shè)定要 通過專門的程序。因此BIOS 設(shè)置有時也被叫做CMOS設(shè)置。 引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.s .globl begtext,begdata,begbss,endtext,enddata,endbss .text /文本段 begtext: .dat

5、a /數(shù)據(jù)段 begdata: .bss /未初始化數(shù)據(jù)段 begbss: entry start /關(guān)鍵字entry告訴鏈接器“程序入口” start: mov ax, #BOOTSEG mov ds, ax mov ax, #INITSEG mov es, ax mov cx, #256 sub si, si sub di,di rep movw jmpi go, INITSEG .text等是偽操作符,告訴編譯器產(chǎn)生文 本段,.text用于標(biāo)識文本段的開始位置。 SETUPLEN = 4 BOOTSEG = 0 x07c0 INITSEG = 0 x9000 SETUPSEG = 0 x

6、9020 SYSSEG = 0 x1000 ENDSEG = SYSSEG + SYSSIZE ROOT_DEV = 0X306 ds=0 x07c0es=0 x9000cx計(jì)數(shù)寄存器計(jì)數(shù)256W表示移動的是字 移動多 少字節(jié) 呢? si=0, di=0 這就是0 x7c00處存放的語句 ds:si為0 x7c00,ds為數(shù)據(jù)段寄存器,si為源變址寄 存器,可用來存放相對于DS段之源變址指針 es:di為0 x90000,es為附加段寄存器,di為目地變址 寄存器,可用來存放相對于 ES 段之目的變址指針 段間跳轉(zhuǎn):cs=INITISE=0 x9000, ip=go 引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼

7、:Bootsect.sBootsect.s lBootsect.s首先將自身復(fù)制到地址0 x90200中 ,并跳轉(zhuǎn)到復(fù)制后的地址中執(zhí)行: 引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.s l jmpi go, INITSEG之后 go: mov ax,cs mov ds,ax mov es,ax mov ss,ax mov sp,#0 xff00 load_setup: /載入setup模塊 mov dx,#0 x0000 mov cx,#0 x0002 mov bx,#0 x0200 mov ax,#0 x0200+SETUPLEN int 0 x13 /BIOS中斷 j

8、nc ok_load_setup mov dx,#0 x0000 mov ax,#0 x0000 int 0 x13 j load_setup /重讀 cs=0 x9000 ds, es, ss=0 x9000 sp=0 xFF00 ??臻g為? 0 x90000 - 0 x9FF00 INT 0 x13,AH=02:BIOS讀磁盤扇區(qū)的中斷: dh=磁頭號,dl=驅(qū)動器號,驅(qū)動器0,磁頭0 ch=柱面號,cl=開始扇區(qū),磁道0,扇區(qū)2 es:bx=讀出數(shù)據(jù)的緩沖區(qū)地址(es:bx為 0 x90200) al=要讀的扇區(qū)數(shù)(SETUPLEN=4) 如果成功,則跳轉(zhuǎn)到 ok_load_setup

9、跳轉(zhuǎn)到load_setup,重 讀 否則,復(fù)位磁盤 引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.s l執(zhí)行jmpi go,INITSEG后就由開始的 Bootsect.s跳轉(zhuǎn)到復(fù)制后的Bootsect.s中的標(biāo) 號go處繼續(xù)執(zhí)行;然后Bootsect.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 sect

10、ors,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 /SYSSEG=0 x1000 mov es,ax call read_it /讀入system模塊 jmpi 0,SETUPSEG bootsect.s中的數(shù)據(jù)/在文件末尾 sectors: .word 0 /磁道扇區(qū)數(shù) msg1:.byte 13,10/換行+回車 .ascii “Loading system.” .byte 13,1

11、0,13,10 /2對換行+回車 獲得磁盤參數(shù),dl為磁盤驅(qū)動器號獲取光標(biāo)位置和形狀,bh為頁號 cx=24表示輸出24個字符, bl=7為顯示屬 性 寫字符串,al=1表示字符串只包含 字符碼,顯示之后更新光標(biāo)位置 es:bp為字符串的段:偏移地址, bp=msg1,es=SSSEG=0 x1000 ip=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.s l加載完Setup.s后在屏幕上打印Loading sys

12、tem . l接著調(diào)用read_it把SYSTEM,也就是LINUX0.11 的內(nèi)核讀取到內(nèi)存位置0 x10000處 引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.s l為什么讀入system模塊還需要定義一個函數(shù)? read_it: mov ax,es cmp ax,#ENDSEG jb ok1_read ret ok1_read: mov ax,sectors sub ax,sread /sread是當(dāng)前磁道已讀扇區(qū)數(shù),ax未讀扇區(qū) 數(shù) call read_track /讀磁道. psystem模塊可能很大,要跨越磁道! pENDSEG=SYSSEG+SYSSIZE p

13、SYSSIZE=0 x8000 /該變量可根據(jù)Image大小設(shè)定(編 譯操作系統(tǒng)時) 引導(dǎo)扇區(qū)代碼:引導(dǎo)扇區(qū)代碼:Bootsect.sBootsect.s l引導(dǎo)扇區(qū)的末尾/BIOS用以識別引導(dǎo)扇區(qū) ljmpi 0, SETUPSEG跳轉(zhuǎn)至setup執(zhí)行 .org 510 .word 0 xAA55 /扇區(qū)的最后兩個字 節(jié) lBootSect小結(jié):采用分段讀入的方式將OS從磁 盤載入到內(nèi)存中 p將自身復(fù)制到地址0 x90200處 p讀入setup p在屏幕上打印啟動Logo p讀入system SetupSetup模塊分析模塊分析 lSetup.s將完成OS啟動前的設(shè)置 start: mov

14、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 cld do_move: mov es,ax add ax,#0 x1000 cmp ax,#0 x9000 jz end_move mov ds,ax sub di,di sub si,si mov cx,#0 x8000 rep movsw jmp do_move INITSEG = 0 x9000 ds=0 x900 0 取光標(biāo)位置信息放

15、在dx 這是間址尋址,當(dāng)前數(shù)據(jù) 段ds=0 x9000,這條指令 將放在dx中的光標(biāo)位置信 息存放在0 x90004+0的 位置,即0 x90000 獲取物理內(nèi)存大小,返回值放入AX中 同理,這條指令將放在ax 中的物理內(nèi)存大小信息存 放在0 x9000 Image tools/system: boot/head.o init/main.o $(DRIVERS) $(LD) boot/head.o init/main.o $(DRIVERS) -o tools/system Image為輸入文件 為軟驅(qū)A Makefile SystemSystem模塊分析模塊分析 lsetup是進(jìn)入保護(hù)模式,

16、head是進(jìn)入之后的初始化 startup_32: movl $0 x10,%eax mov %ax,%ds mov %ax,%es mov %ax,%fs mov %ax,%gs /指向gdt的0 x10項(xiàng)(數(shù)據(jù)段) lss _stack_start,%esp /設(shè)置棧(系統(tǒng)棧) call setup_idt call setup_gdt xorl %eax,%eax 1:incl %eax movl %eax,0 x000000 cmpl %eax,0 x100000 je 1b /0地址處和1M地址處相同(A20沒開啟),就死循環(huán) jmp after_page_tables /設(shè)置頁表之

17、后 setup_idt: lea ignore_int,%edx movl $0 x00080000,%eax movw %dx,%ax lea _idt,%edi movl %eax,(%edi) 這是32位匯編代碼 關(guān)于匯編關(guān)于匯編 las86匯編:能產(chǎn)生16位代碼的Intel 8086(386)匯編 pmov ax, cs /csax, 目標(biāo)操作數(shù)在前 lGNU as匯編:產(chǎn)生32位代碼,使用AT _asm_(“movb %fs:%2, %al” :”=a”(_res) :”0”(seg),”m”(*(addr) ); SystemSystem模塊分析模塊分析 lhead.s所做的工作:

18、 p又一次初始化了idt表和gdt表 p然后開啟20號地址線,這樣就可以訪問4G的內(nèi)存了 lafter_page_tables psetup_paging執(zhí)行ret后? 會執(zhí)行函數(shù)main() p進(jìn)入main()后的棧為0,0,0,L6 pmain()函數(shù)的三個參數(shù)是0,0,0 pmain()函數(shù)返回時進(jìn)入L6,死循環(huán). after_page_tables: pushl $0 pushl $0 pushl $0 pushl $L6 pushl $_main jmp set_paging L6: jmp L6 setup_paging: 設(shè)置頁表ret SystemSystem模塊分析模塊分析 l進(jìn)入main函數(shù) 在init/main.c中 void main(void) mem_init(); trap_init(); blk_dev_init(); chr_dev_init(); tty_init(); time_init();

溫馨提示

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

評論

0/150

提交評論