久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

從頭開(kāi)始編寫(xiě)操作系統(tǒng)(4) 第3章:引導(dǎo)加載器 - xiaoxiaoyaya的專(zhuān)欄 - C...

 qdhtxxlhz 2011-04-22
  從頭開(kāi)始編寫(xiě)操作系統(tǒng)(4) 第3章:引導(dǎo)加載器 收藏
譯自:http://www./Resources/OSDev3.html

第3 章:引導(dǎo)加載器
by Mike, 2008, 2009
本系列文章旨在向您展示并說(shuō)明如何從頭開(kāi)發(fā)一個(gè)操作系統(tǒng),。
介紹
歡迎,!這正是您等待的一篇教程,在這一章包括的主題有:
引導(dǎo)步驟——它是怎么工作的
引導(dǎo)加載器理論
開(kāi)發(fā)一個(gè)簡(jiǎn)單的引導(dǎo)加載器
使用NASM 匯編器匯編引導(dǎo)加載器
使用VFD (虛擬磁盤(pán)驅(qū)動(dòng)器)軟件:創(chuàng)建一個(gè)軟盤(pán)映像
使用PartCopy :將引導(dǎo)加載器復(fù)制到軟盤(pán)映像
使用Bochs ——基本設(shè)置和應(yīng)用:測(cè)試引導(dǎo)加載器
準(zhǔn)備好了嗎,?
引導(dǎo)過(guò)程
當(dāng)電源按鈕按下時(shí)
當(dāng)我們按下電源按鈕是到底發(fā)生了什么,?當(dāng)這個(gè)按鈕被按下后,連接到這個(gè)按鈕的線(xiàn)纜會(huì)向主板發(fā)送一個(gè)電信號(hào),,主板簡(jiǎn)單的把這個(gè)信號(hào)轉(zhuǎn)發(fā)給電源(PSU ),。
這個(gè)信號(hào)只包含1 比特信息。如果是0 ,,表示沒(méi)電(計(jì)算機(jī)關(guān)閉,,主板不活動(dòng))。如果是1 (活動(dòng)信號(hào)),,意味著系統(tǒng)已經(jīng)加電,。
為了更好的理解,記住計(jì)算機(jī)的基礎(chǔ)是二值邏輯,。8 “比特”僅僅表示8 條可以導(dǎo)電的“線(xiàn)纜”,,0 代表線(xiàn)上沒(méi)有電流,而1 表示線(xiàn)上有電流,。這些與邏輯門(mén),,一起構(gòu)成了數(shù)字邏輯點(diǎn)了的基礎(chǔ),而在此之上構(gòu)建的整個(gè)計(jì)算機(jī),。
當(dāng)PSU 收到這個(gè)活動(dòng)信號(hào),,它開(kāi)始向系統(tǒng)的其余部分供電。當(dāng)所有設(shè)備都得到正確數(shù)量的供電時(shí),,就可以確定PSU 會(huì)持續(xù)向它們供電而不發(fā)生大的問(wèn)題,。
PSU 會(huì)發(fā)送一個(gè)“供電正常(power_good )”的信號(hào)到主板的基本輸入輸出系統(tǒng) (BIOS) 。
BIOS POST
到那個(gè)BIOS 接收到“power_good ”信號(hào),,BIOS 開(kāi)始一個(gè)稱(chēng)為POST(Power On Self Test 加電自檢) 的初始化過(guò)程,。POST 通過(guò)測(cè)試確保供電正確,設(shè)備已安裝 ( 如:鍵盤(pán),、鼠標(biāo),、USB ,、串口等) ,并確保內(nèi)存狀態(tài)良好 ( 通過(guò)檢測(cè)內(nèi)存損傷) ,。
POST 向BIOS 交出控制權(quán),。POST 將BIOS 加載到內(nèi)存的末尾( 可能是0xFFFFF0) 并且在內(nèi)存的第一個(gè)字節(jié)處放置一個(gè)跳轉(zhuǎn)指令。
處理器指令指針 (CS:IP) 被設(shè)置為0 ,,然后處理器得到控制權(quán),。
什么意思呢?處理器會(huì)在地址0x0 處開(kāi)始執(zhí)行指令,。這里,,它是一條POST 程序放置的跳轉(zhuǎn)指令,這條指令跳轉(zhuǎn)到0xFFFFF0 處( 或者其他BIOS 被加載到的地址) ,,然后處理器開(kāi)始執(zhí)行BIOS ,。
BIOS 得到控制權(quán)……
BIOS
基本輸入輸出系統(tǒng)(BIOS) 會(huì)做一些工作。它創(chuàng)建一個(gè)中斷向量表 (IVT), 并提供基本的中斷服務(wù),。BIOS 然后會(huì)做一些檢查以確保沒(méi)有硬件問(wèn)題,。BIOS 也提供一個(gè)設(shè)置的功能。
BIOS 需要找到一個(gè)操作系統(tǒng),。根據(jù)您在BIOS 設(shè)置中指定的引導(dǎo)順序,,BIOS 執(zhí)行0x19 號(hào)中斷來(lái)找出一個(gè)可引導(dǎo)設(shè)備。
如果沒(méi)有找到可引導(dǎo)設(shè)備 (INT 0x19 返回了) ,,BIOS 會(huì)嘗試引導(dǎo)順序列表中的下一個(gè)設(shè)備,。如果再?zèng)]有可供嘗試的設(shè)備,BIOS 會(huì)打印一個(gè)類(lèi)似于“操作系統(tǒng)未找到”的信息,,并停止系統(tǒng)的運(yùn)行,。
中斷與中斷向量表 (IVT)
一個(gè)中斷是可以被許多不同的程序調(diào)用的子程序。這些中斷被保存在從地址0x0 開(kāi)始的被稱(chēng)為中斷向量表的空間中,。比如,,一個(gè)常見(jiàn)的中斷INT 0x21 被用于DOS 系統(tǒng)。
注意:這兒沒(méi)有DOS ,!“只有”BIOS 設(shè)置的中斷才有效,,沒(méi)有其他的!使用其他的中斷會(huì)導(dǎo)致系統(tǒng)執(zhí)行不存在的程序,,這將導(dǎo)致你的系統(tǒng)崩潰,。
注意:如果切換處理器模式,IVT 會(huì)變得無(wú)效,。這意味著,,任何的中斷(無(wú)論軟硬件,包括BIOS )全都無(wú)效,。 對(duì)于32 位操作系統(tǒng),,我們不得不這樣做,。
BIOS 0x19 中斷
INT 0x19 ——引導(dǎo)程序加載器
通過(guò)“熱重啟”重啟系統(tǒng),不會(huì)清空內(nèi)存,,也不會(huì)恢復(fù)中斷向量表,。
該中斷由BIOS 執(zhí)行。它讀入磁盤(pán)的第一個(gè)扇區(qū)( 扇區(qū)(Sector ) 1, 磁頭(Head ) 0, 磁道(Track ) 0) ,。
扇區(qū)Sectors
扇區(qū)即一個(gè)512 字節(jié)的組,,扇區(qū)1 表示磁盤(pán)最前面的512 字節(jié)數(shù)據(jù)。
磁頭Heads
磁頭( 或“面”) 表示磁盤(pán)的一面,。磁頭0 是正面,,磁頭1 是背面. 多數(shù)磁盤(pán)值由一個(gè)面,,因此只有一個(gè)磁頭,。
磁道Tracks
為了理解磁道,看下面的圖:
 
圖中的磁盤(pán)代表硬盤(pán)或軟盤(pán),,我們看到的是磁頭0 (正面),,并且每扇區(qū)512 字節(jié)。磁道是扇區(qū)的集合,。
注意:記住1 扇區(qū)是512 字節(jié),,軟盤(pán)的1 磁道又18 扇區(qū),這一點(diǎn)在加載文件時(shí)很重要,。
如果磁盤(pán)可引導(dǎo),,則引導(dǎo)扇會(huì)被加載到0x7C00 , INT 0x19 會(huì)跳轉(zhuǎn)到哪里,,將控制權(quán)交給一點(diǎn)加載器,。
注意:引導(dǎo)加載器會(huì)被加載掃0x7C00 ,這很重要,!
注意:有些系統(tǒng)在按下“熱重啟”按鈕,,會(huì)在地址0x0040:0072 處放置一個(gè)0x1234 再跳轉(zhuǎn)到0xFFFF:0 。冷重啟則會(huì)用0x0 代替,。
現(xiàn)在,,我們的1337 引導(dǎo)加載器得到控制權(quán)!
引導(dǎo)加載器理論
關(guān)于引導(dǎo)加載器我們已經(jīng)看了不少?,F(xiàn)在,,把其中重要的部分放在一起。
引導(dǎo)加載器是……
……與主引導(dǎo)記錄(Master Boot Record (MBR) )在一起,。
……在磁盤(pán)的第一個(gè)扇區(qū),。
……大小是一個(gè)扇區(qū) (512 字節(jié))。
……已經(jīng)被BIOS 的INT 0x19 加載到地址0x7C00 處,。
如你所想,,我們不能在512 字節(jié)里做很多事情,。我們要做什么呢?
在匯編語(yǔ)言中我們很容易超過(guò)512 字節(jié),。盡管代碼看起來(lái)不錯(cuò),,可是只有一部分 在內(nèi)存中,比如,,想想下面的例子:
mov     ax, 4ch
inc     bx         ; 512 byte
mov     [var], bx  ; 514 byte
在匯編語(yǔ)言中,,從上往下執(zhí)行。但,,要記得當(dāng)向內(nèi)存加載文件時(shí),,以扇區(qū)為單位。 每扇區(qū)512 字節(jié),,因此只能復(fù)制幾個(gè)512 字節(jié)到內(nèi)存中,。
如果只有第一個(gè)扇區(qū)被加載到內(nèi)存,我們僅僅復(fù)制到第512 字節(jié) (inc bx 那一行) ,。這樣最后的mov 指令仍在磁盤(pán)上,,不在內(nèi)存中 !
那當(dāng)處理器執(zhí)行完inc bx 之后會(huì)做什么呢?處理器會(huì)繼續(xù)執(zhí)行第514 字節(jié),。但是我們的代碼不在內(nèi)存中,,它會(huì)跨過(guò)文件的末尾! 結(jié)果呢,?崩潰,。
但是,再加載第二(或更多)扇區(qū)到指定地址并執(zhí)行是可能的,。這樣文件中剩余的數(shù)據(jù)就會(huì)加載到內(nèi)存中,,會(huì)工作的很好。
這種方法是可行的,,但難以使用,。常見(jiàn)的方法是將引導(dǎo)加載器控制在512 字節(jié),用來(lái)搜索,、加載和執(zhí)行第二段引導(dǎo)加載器,。這個(gè)我們會(huì)在后面看到。
硬件異常Hardware Exceptions
硬件異常與軟件異常相似不過(guò)它由處理器 而不是軟件執(zhí)行,。
有時(shí),,我們必須避免所有異常的產(chǎn)生。比如,,在我們切換處理器狀態(tài)后,,整個(gè)中斷向量表失效,此時(shí),,任何的軟硬件中斷都會(huì)使我們的系統(tǒng)崩潰 ,。我們?cè)诤竺嬖敿?xì)說(shuō)明,。
CLI 和 STI 指令
您可以使用STI 和CLI 指令允許或禁止所有的中斷,大部分系統(tǒng)不允許應(yīng)用程序執(zhí)行這兩條指令,,因?yàn)檫@可能會(huì)帶來(lái)大問(wèn)題(盡管系統(tǒng)可以模擬它們),。
cli            ; 禁止中斷
 
; do something...
 
sti            ; 允許中斷——我們前面禁止了!
雙重錯(cuò)誤(Double Fault )的硬件異常
如果處理器在處理異常的時(shí)候發(fā)現(xiàn)了問(wèn)題(如,,非法指令,,除0 ,等),,處理器會(huì)執(zhí)行雙重錯(cuò)誤處理程序,,即0x8 中斷。
我們?cè)诤竺鏁?huì)看到一個(gè)雙重錯(cuò)誤,。如果處理器在雙重錯(cuò)誤之后還不能恢復(fù),,它會(huì)執(zhí)行一個(gè)三重錯(cuò)誤(Triple Fault )。
三重錯(cuò)誤Triple Fault
前面我們見(jiàn)到過(guò)這個(gè)條目嗎,?CPU 的三重錯(cuò)誤意味著系統(tǒng)重啟,。
在早期階段,,比如在引導(dǎo)加載過(guò)程中,,你代碼中的錯(cuò)誤,會(huì)產(chǎn)生一個(gè)三重錯(cuò)誤,。這表明你的代碼有問(wèn)題,。
開(kāi)發(fā)一個(gè)簡(jiǎn)單的引導(dǎo)加載器
總算到了我們等的了!
讓我們?cè)诳纯次覀兊牧斜恚?
與主引導(dǎo)記錄(Master Boot Record (MBR) )在一起,。
在磁盤(pán)的第一個(gè)扇區(qū),。
大小是一個(gè)扇區(qū) (512 字節(jié))。
已經(jīng)被BIOS 的INT 0x19 加載到地址0x7C00 處,。
打開(kāi)任意的文本編輯器(我使用Visual Studio 2005 ), 但Notepad (記事本)就足夠了,。
這里是引導(dǎo)加載器 (Boot1.asm)...
;*********************************************
;       Boot1.asm
;              - A Simple Bootloader
;
;       Operating Systems Development Tutorial
;*********************************************
 
org            0x7c00                         ; 我們已經(jīng)被BIOS 加載到 0x7C00
 
bits    16                                    ; 我們?cè)?6 位實(shí)模式
Start:
 
        cli                                   ; 禁止中斷
        hlt                                   ; 系統(tǒng)停機(jī)
       
times 510 - ($-$$) db 0                              ; 我們得有512 字節(jié),將剩余的部分清零
dw 0xAA55                                     ; 引導(dǎo)標(biāo)志
這些并沒(méi)有什么令人興奮的,,下面我們一行行分析:
org            0x7c00
記?。築IOS 把我們加載到0x7C00 ,上面的代碼告訴 NASM 確保相對(duì)地址為0x7C00 ,。這表示,,第一條指令在0x7C00 處
bits    16
還記得第2 章嗎?在那一章里,,我解釋了x86 系列向后兼容老DOS 系統(tǒng),。因?yàn)槔螪OS 系統(tǒng)是16 位的,所有的x86 兼容機(jī)引導(dǎo)時(shí)為16 位模式 ,,也就是:
我們受限在1 MB 內(nèi)存,。
我們受限在16 為寄存器,。
我們會(huì)在后面將計(jì)算機(jī)切換到32 位模式。
times 510 - ($-$$) db 0
我希望這里有文檔可以參考,。在NASM 中,,美元符($) 表示當(dāng)前行的地址。$$ 表示第一條指令的地址(0x7C00) ,。所以,,$-$$ 返回當(dāng)前行到起點(diǎn)共有多少字節(jié) ( 這里就是程序的大小) 。
dw 0xAA55
這需要一些解釋,。
BIOS INT 0x19 會(huì)搜索可引導(dǎo)磁盤(pán),。那它怎么知道一個(gè)磁盤(pán)是否可以引導(dǎo)呢?因?yàn)橐龑?dǎo)標(biāo)志,。如果511 字節(jié)是0xAA 且512 字節(jié)是0x55 ,,INT 0x19 會(huì)加載它,并執(zhí)行引導(dǎo)加載器,。
因?yàn)橐龑?dǎo)表示必須是引導(dǎo)扇的最后兩個(gè)字節(jié),。我們使用times 關(guān)鍵字填充到第510 個(gè)字節(jié),而不是第512 個(gè)字節(jié),。
使用NASM 匯編
NASM 是命令行匯編器,,因此必須通過(guò)命令行或批處理腳本執(zhí)行。匯編Boot1.asm 這么做:
nasm -f bin Boot1.asm -o Boot1.bin
-f 選項(xiàng)用于告訴 NASM 生成哪種類(lèi)型的文件,,這里是二進(jìn)制文件,。
-o 選項(xiàng)由于給出輸出文件名,這里是Boot1.bin
匯編之后你會(huì)得到一個(gè)名為"Boot1.bin"512 字節(jié)的文件,。
注意:因?yàn)橐恍┰騑indows 文件瀏覽器會(huì)顯示文件的大小為1 KB ,,但查看文件屬性時(shí)你會(huì)發(fā)現(xiàn)它確實(shí)是512 字節(jié)。
使用VFD ( 虛擬軟盤(pán)驅(qū)動(dòng)器)
我們使用VFD 來(lái)創(chuàng)建我們的操作系統(tǒng)要保存的虛擬軟盤(pán),。下面解釋如何使用它,。
打開(kāi) vfdwin.exe.
在Driver 標(biāo)簽下,點(diǎn)擊Start 按鈕,,以啟動(dòng)驅(qū)動(dòng)器,。
點(diǎn)擊Drive0 或Drive1 標(biāo)簽。
點(diǎn)擊Open
你會(huì)看到這個(gè):
 
確保Media Type (媒體類(lèi)型)是st 和ard 3.5" 1.44 MB floppy (標(biāo)準(zhǔn)的3.5" 1.44 MB 軟盤(pán)),,并且類(lèi)型是RAM ,。同樣的,確保Write Protect (寫(xiě)保護(hù))打開(kāi)(不選中),。點(diǎn)擊 "Create".
到“我的電腦”( 在“您”的計(jì)算機(jī)上) 您會(huì)見(jiàn)到一個(gè)新的軟盤(pán)驅(qū)動(dòng)器,。
在驅(qū)動(dòng)器圖標(biāo)上右擊-> 屬性,格式化軟盤(pán)。在VFD 標(biāo)簽處會(huì)有一個(gè)格式化選項(xiàng),。
PartCopy ——復(fù)制引導(dǎo)加載器
好,,現(xiàn)在我們有了自己的引導(dǎo)加載器,怎么把它復(fù)制到硬盤(pán)中呢,?你可能知道,,Windows 不允許我們將文件直接復(fù)制到磁盤(pán)的第一個(gè)扇區(qū)上,所以我們用一個(gè)命令來(lái)完成,。
在第1 章中我們見(jiàn)到了debug 命令,,如果你決定使用那個(gè)命令,請(qǐng)?zhí)^(guò)這一節(jié),。
PartCopy 是一個(gè)命令行出現(xiàn),,它使用下面的語(yǔ)法:
partcopy file first_byte last_byte drive
PartCopy 不僅僅用于復(fù)制文件,它可以將制定的字節(jié)復(fù)制到扇區(qū)或從扇區(qū)復(fù)制出來(lái),,感謝它的語(yǔ)法(見(jiàn)上面),,這是一個(gè)安全的方法。
因?yàn)槟憧梢阅M軟驅(qū),,你可以使用驅(qū)動(dòng)器號(hào)(如A: )來(lái)代表驅(qū)動(dòng)器,。
要復(fù)制引導(dǎo)驅(qū)動(dòng)器,這么做:
partcopy Boot1.bin 0 200 -f0
f0 代表0 號(hào)軟驅(qū),。你可以使用f0 或f1 等,,這要根據(jù)你的軟盤(pán)在那個(gè)驅(qū)動(dòng)器里。Boot1.bin 是我們要復(fù)制的文件,。從第一個(gè)字節(jié)(0x0) 復(fù)制到最后一個(gè)字節(jié) (0x200, 十進(jìn)制的512) ,。注意partcopy 只接受16 進(jìn)制的數(shù)據(jù),。
警告:如果使用不小心,,可能會(huì)導(dǎo)致磁盤(pán)數(shù)據(jù)損壞。上面的命令值適用于軟盤(pán),,不要在硬盤(pán)上嘗試,。
Bochs: 測(cè)試引導(dǎo)加載器
Bochs 是一個(gè)32 位PC 仿真器,我們使用它來(lái)調(diào)試和測(cè)試,。
Bochs 使用配置文件來(lái)描述要仿真的硬件,。如下例,是我使用的配置文件:
# ROM 和 VGA BIOS images ---------------------------------------------
 
romimage:    file=BIOS-bochs-latest, address=0xf0000
vgaromimage: VGABIOS-lgpl-latest
 
# boot from floppy using our disk image -------------------------------
 
floppya: 1_44=a:, status=inserted  # Boot from drive A
 
# logging 和 reporting -----------------------------------------------
 
log:         OSDev.log              # All errors and info logs will output to OSDev.log
error:       action=report
info:        action=report
配置文件使用# 注釋,。它試圖從一個(gè)在驅(qū)動(dòng)器A 中的軟盤(pán)引導(dǎo),。
ROM BIOS 和VGA BIOS 映像文件是和Bochs 一起的,所以別為它擔(dān)心,。
定位BIOS ROM
配置文件中的大部分都很簡(jiǎn)單,。有一行需要再看看:
romimage:    file=BIOS-bochs-latest, address=0xf0000
這行告訴Bochs 把BIOS 放到內(nèi)存的什么位置。要知道BIOS 的大小是可變的,BIOS 必須放在1MB 的末尾,,即BIOS 的最后一個(gè)字節(jié)必須在0xFFFFF ,。
因此你可能需要改變BIOS 的位置。這可以通過(guò)獲得BIOS 映像的大?。ㄋ贐ochs 文件夾下的BIOS-bochs-latest ),。這個(gè)大小以字節(jié)為單位。
這樣從0xFFFFF 減去BIOS 文件的大?。ㄒ宰止?jié)為單位),。這就是新的BIOS 地址,更新這一行的address ,,把BIOS 移到一個(gè)新位置,。
你可能不需要這一步。如果你被告知“BIOS 必須在0xFFFFF 結(jié)束”時(shí),,你就要這么做了,。
如何使用Bochs
使用Bochs:
執(zhí)行bochs.exe
選擇option 2 (Read options form) ;按回車(chē),。
輸入配置文件名 ( 我們上面創(chuàng)建的那個(gè)) ,; 回車(chē)。
你會(huì)返回到主菜單,。選option 5:Begin Simulation (開(kāi)始仿真),,回車(chē)。
一個(gè)新的窗口會(huì)打開(kāi),,你會(huì)看到:
 
如果Bochs 退出并重啟了
……你有了一個(gè)三重錯(cuò)誤的經(jīng)歷,。返回到代碼,找找哪里出了錯(cuò),。如果你需要幫助,,聯(lián)系我吧。
如果窗口出現(xiàn),,但什么也沒(méi)發(fā)生
恭喜,!這是我們的cli 和hlt 指令使系統(tǒng)停止了,我們的引導(dǎo)加載器在執(zhí)行了,。
構(gòu)建步驟——總結(jié)
和我們?cè)谇耙徽吕锾岬降臉?gòu)建步驟相比較,,一旦你跟著做了,你會(huì)發(fā)現(xiàn)這很簡(jiǎn)單,。
從此往后,,我們將步驟詳細(xì)重復(fù)這個(gè)構(gòu)建步驟。
下次見(jiàn)
 
本文來(lái)自CSDN博客,,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xiaoxiaoyaya/archive/2011/04/13/6321590.aspx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多