日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
Linux開機(jī)過(guò)程的分析(關(guān)于bootsect.S )
Linux開機(jī)過(guò)程的分析(關(guān)于bootsect.S )
 更新時(shí)間:2009-8-12 16:56:29  點(diǎn)擊數(shù):0
【字體: 字體顏色
發(fā)信人: huzq (你快樂所以我快樂), 信區(qū): LINUX 
標(biāo) 題: [轉(zhuǎn)載]Linux開機(jī)過(guò)程的分析 
發(fā)信站: 武漢白云黃鶴站 (Sat Feb 10 14:37:30 2001), 站內(nèi)信件 
 
這篇文章的目的,在將linuxkernel的boot部份做一個(gè)介紹,因?yàn)楣P者覺得很少有這樣的 
文章介紹一個(gè)作業(yè)系統(tǒng)最最開始的一步--把kernel本身載入至內(nèi)存中,同時(shí)進(jìn)行一些機(jī) 
器相關(guān)(machinedependent)的初始化工作,由于linux剛好使用的是大家最熟悉的386, 
486系列PC,所以在說(shuō)明其程序流程時(shí),也剛好可以對(duì)其相關(guān)的PC硬體架構(gòu)做探討,可以 
說(shuō)是一舉兩得,不過(guò),我必須假設(shè)讀者對(duì)于組合語(yǔ)言及PC最基礎(chǔ)的架構(gòu),如寄存器,分 
段,分頁(yè),中斷服務(wù)等有大概的認(rèn)識(shí)。 
  讀者可在linuxsourcecode的/boot子目錄下找到幾個(gè)以.S作為副檔名的組合語(yǔ)言檔 
,本文要說(shuō)明的即是其中的bootsect.S及setup.S兩個(gè)檔案,及盡量簡(jiǎn)單的說(shuō)明其所牽涉 
的相關(guān)硬體部份。 
bootsect.S 
  這個(gè)程序是linuxkernel的第一個(gè)程序,包括了linux自己的bootstrap程序,但是在 
說(shuō)明這個(gè)程序前,必須先說(shuō)明一般IBMPC開機(jī)時(shí)的動(dòng)作(此處的開機(jī)是指"打開PC的電源" 
): 
  一般PC在電源一開時(shí),是由內(nèi)存中地址FFFF:0000開始執(zhí)行(這個(gè)地址一定在ROMBIO 
S中,ROMBIOS一般是在FEOOOh到FFFFFh中),而此處的內(nèi)容則是一個(gè)jump指令,jump到另 
一個(gè)位于ROMBIOS中的位置,開始執(zhí)行一系列的動(dòng)作,包括了檢查RAM,keyboard,顯示 
器,軟硬磁盤等等,這些動(dòng)作是由系統(tǒng)測(cè)試碼(systemtestcode)來(lái)執(zhí)行的,隨著制作BI 
OS廠商的不同而會(huì)有些許差異,但都是大同小異,讀者可自行觀察自家機(jī)器開機(jī)時(shí),螢 
幕上所顯示的檢查訊息。 
  緊接著系統(tǒng)測(cè)試碼之后,控制權(quán)會(huì)轉(zhuǎn)移給ROM中的啟動(dòng)程序(ROMbootstraproutine) 
,這個(gè)程序會(huì)將磁盤上的零道零扇區(qū)讀入內(nèi)存中(這就是一般所謂的bootsector,如果你 
曾接觸過(guò)電腦病毒,就大概聽過(guò)它的大名),至于被讀到內(nèi)存的哪里呢?--絕對(duì)位置07C0 
:0000(即07C00h處),這是IBM系列PC的特性。而位在linux開機(jī)磁盤的bootsector上的正 
是linux的bootsect程序,也就是說(shuō),bootsect是第一個(gè)被讀入內(nèi)存中并執(zhí)行的程序,F(xiàn) 
在,我們可以開始來(lái)看看到底bootsect做了什么。 
第一步 
  首先,bootsect將它"自己"從被ROMBIOS載入的絕對(duì)地址0x7C00處搬到0x90000處, 
然后利用一個(gè)jmpi(jumpindirectly)的指令,跳到新位置的jmpi的下一行去執(zhí)行,關(guān)鍵 
的assemblycode如下: 

(搬移bootsect本身) 


jmpigo,INITSEC 




  表示將跳到CS為0x9000,IP為offset"go"的位置(CS:IP=0x9000:offsetgo),其中I 
NITSEC=0x9000定義于程序開頭的部份,而go這個(gè)label則恰好是下一行指令所在的位置 
。 
第二步 
  接著,將其它segmentregisters包括DS,ES,SS都指向0x9000這個(gè)位置,與CS看齊 
。另外將SP及DX指向一任意位移地址(offset),這個(gè)地址等一下會(huì)用來(lái)存放磁盤參數(shù)表 
(diskpara-metertable) 
  提到磁盤參數(shù)表,就必須提到BIOS中斷1Eh。先簡(jiǎn)單的介紹一下BIOS的中斷服務(wù):80 
x86將內(nèi)存最低的256*4byte保留給256個(gè)中斷向量(每個(gè)interruptvector大小為4byte, 
所以一共有256*4=1024byte),而其中的第1Eh個(gè)向量指向"磁盤參數(shù)表",這個(gè)表會(huì)告訴 
電腦如何去讀取磁盤機(jī),而我們所要做的事是搬移磁盤參數(shù)表到剛才所設(shè)定的任意地址 
。 
  接著,改變搬移來(lái)的參數(shù)表的參數(shù),以符合我們的需要。再將中斷向量1Eh指向我們 
所修改過(guò)的磁盤參數(shù)表,然后呼叫BIOSinterrupt的int13h(function0,即AH=0)重置磁 
盤控制卡及磁盤驅(qū)動(dòng)器,之后磁盤機(jī)就會(huì)照我們的意思動(dòng)作了。如果你曾trace過(guò)DOS的 
kernel,你會(huì)發(fā)現(xiàn),上述的動(dòng)作在DOS中也有類似的對(duì)應(yīng)流程。 
現(xiàn)在讓我們來(lái)看看關(guān)鍵的程序碼:. 


push#0 
popfs 
movbx,#0x78 

(使GS:SI=FS:BX,指向磁盤參數(shù)表, 
再將GS:SI所指地址的內(nèi)容搬移6個(gè) 
word至ES:DI所指的地址) 


  此段程序是將FS:BX調(diào)整成0000:0078,接著再將GS:SI的內(nèi)容設(shè)成與FS:BX相同,此 
處0x78h即為int1Eh的起始位置(7*16+8=120,(1*16+14)*4=120)。調(diào)整ES:DI為剛才所設(shè) 
定的任意地址,從GS:SI搬移6個(gè)word(即12byte)到ES:DI所指的位置,顯然磁盤參數(shù)表的 
長(zhǎng)度就是6個(gè)word,(不過(guò)事實(shí)上,磁盤參數(shù)表的確實(shí)長(zhǎng)度是11個(gè)byte)。關(guān)于磁盤參數(shù)表 
,有興趣的讀者可自行參閱講述BIOSinterruptservices的技術(shù)手冊(cè),會(huì)有詳細(xì)的說(shuō)明。 
 
  讀者可以用debug自行觀察自家機(jī)器上DOS的磁盤參數(shù)表的起始位置(即int1Eh的內(nèi)容 
)。以下是筆者機(jī)器的情形(筆者使用的作業(yè)系統(tǒng)是MSDOS6.2): 
C:>debug 
-d0000:0000 
0000:00008A101601F4067000-1600CB04F4067000......p.......p. 
0000:0010F40670000301790E-43EB00F0EBEA00F0..p...y.C....... 
0000:002004108E340C118E34-5700CB046F00CB04...4...4W...o... 
0000:00308700CB0408079433-B700CB04F4067000.......3......p. 
0000:00400C01790E4DF800F0-41F800F0BA165F06..y.M...A....._. 
0000:005039E700F01B01790E-70118E341201790E9.....y.p..4..y. 
0000:006000E000F085175F06-6EFE00F0EE067000......_.n.....p. 
0000:007053FF00F0A4F000F0-220500003E4600C0S......."...>F.. 
^^^^^^^^ 
由上圖中可知,在DOS中磁盤參數(shù)表的起始位置(int1Eh的內(nèi)容)為0000:0522。接著觀察 
DOS中位置0000:0522開始的11個(gè)byte,也就是磁盤參數(shù)表的內(nèi)容 
C:>debug 
-d0000:0520l10 
0000:05204D53DF022502121B-FF54F60F08000000MS..%....T...... 
^^^^^^^^^^^^^^^^^^^^^^ 
此11byte即為磁盤參數(shù)表的內(nèi)容(分別是byte00h到0Ah) 
  在程序中我們所更動(dòng)的是第五個(gè)byte(byte04h),改為18h(在上圖例子中為12h),這 
個(gè)byte的功能是定義磁軌上一個(gè)磁區(qū)的資料筆數(shù)。關(guān)鍵的程序碼如下: 

movb4(di),*18 

  
第叁步 
  接著利用BIOS中斷服務(wù)int13h的第0號(hào)功能,重置磁盤控制器,使得剛才的設(shè)定發(fā)揮 
功能。 


xorah,ah 
xordl,dl 
int0x13 


第四步 
  完成重置磁盤控制器之后,bootsect就從磁盤上讀入緊鄰著bootsect的setup程序, 
也就是以后將會(huì)介紹的setup.S,此讀入動(dòng)作是利用BIOS中斷服務(wù)int13h的第2號(hào)功能。 
setup的image將會(huì)讀入至程序所指定的內(nèi)存絕對(duì)地址0x90200處,也就是在內(nèi)存中緊鄰著 
bootsect所在的位置。待setup的image讀入內(nèi)存后,利用BIOS中斷服務(wù)int13h的第8號(hào)功 
能讀取目前磁盤機(jī)的參數(shù)。 
第五步 
  再來(lái),就要讀入真正linux的kernel了,也就是你可以在linux的根目錄下看到的"v 
mlinuz"。在讀入前,將會(huì)先呼叫BIOS中斷服務(wù)int10h的第3號(hào)功能,讀取游標(biāo)位置,之 
后再呼叫BIOS中斷服務(wù)int10h的第13h號(hào)功能,在螢?zāi)簧陷敵鲎址?Loading",這個(gè)字 
符串在bootlinux時(shí)都會(huì)首先被看到,相信大家應(yīng)該覺得很眼熟吧。 
  linux的kernel將會(huì)被讀入至內(nèi)存絕對(duì)地址0x10000處,鍵關(guān)的程序碼如下: 


movax,#SYSSEG 
moves,ax 
callread_it 
callkill_motor 


  其中SYSSEG于程序開頭時(shí)定義為0x1000,先將ES內(nèi)容設(shè)為0x1000,接著在read_it這 
個(gè)子程序便以ES為目的地的節(jié)地址,將kernel讀入內(nèi)存中,至于read_it子程序的詳細(xì)內(nèi) 
容筆者并不想一一介紹,不過(guò)聰明的讀者們應(yīng)該已經(jīng)猜到,read_it一定又利用了BIOSi 
nt13h與磁盤有關(guān)的I/O中斷服務(wù)了。 
  至于kill_motor子程序,它的功能在于停止軟盤機(jī)的馬達(dá)(各位聰明的讀者會(huì)不會(huì)覺 
得這個(gè)子程序的名稱取得頗為傳神呢?),其程序碼如下: 


kill_motor: 
pushdx 
movdx,#0x3f2 
xoral,al 
outb 
popdx 
ret 


  首先利用DX指定要輸出的port,而03f2這個(gè)port則是代表了軟盤控制器(floppydis 
kcontroller)的所在,再利用outb將資料送出,而我們送出的資料,當(dāng)然就是歸零過(guò)的 
AL了。如此一來(lái),軟盤的馬達(dá)就停止了。 
第六步 
  接下來(lái)做的事是檢查rootdevice,之后就仿照一開始的方法,利用indirectjump跳 

至剛剛已讀入的setup部份,程序碼如下: 


jmpi0,SETYPSEG 
  其中SETUPSEG已在先前定義為0x9020,所以CS:IP會(huì)設(shè)定為9020:0000,即跳到絕對(duì) 
地址為0x90200,也就是setup的起點(diǎn)。而bootsect也大功告成了。 
到此為止,內(nèi)存的內(nèi)容應(yīng)該如下圖所示: 
比較 
  把大家所熟知的MSDOS與linux的開機(jī)部份做個(gè)粗淺的比較,MSDOS由位于磁盤上boo 
tsector的boot程序負(fù)責(zé)把IO.SYS載入內(nèi)存中,而IO.SYS則負(fù)有把DOS的kernel--MSDOS. 
SYS載入內(nèi)存的重責(zé)大任。而linux則是由位于bootsector的bootsect程序負(fù)責(zé)把setup及 
linux的kernel載入內(nèi)存中,再將控制權(quán)交給setup。 
  至于setup.S,就留到下一次再來(lái)討論了。 
 
  • 上一篇: Linux 的帶寬管理系統(tǒng)
  • 下一篇: 怎樣添加ReiserFS文件系統(tǒng)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1