日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

關(guān)于bootsect.S Linux開機過程的分析

發(fā)信人:;huzq;(你快樂所以我快樂),;信區(qū):;LINUX;
標 題:;[轉(zhuǎn)載]Linux開機過程的分析;
發(fā)信站:;武漢白云黃鶴站;(Sat;Feb;10;14:37:30;2001),;站內(nèi)信件;

這篇文章的目的,在將linuxkernel的boot部份做一個介紹,因為筆者覺得很少有這樣的;
文章介紹一個作業(yè)系統(tǒng)最最開始的一步--把kernel本身載入至內(nèi)存中,同時進行一些機;
器相關(guān)(machinedependent)的初始化工作,由于linux剛好使用的是大家最熟悉的386,;
486系列PC,所以在說明其程序流程時,也剛好可以對其相關(guān)的PC硬體架構(gòu)做探討,可以;
說是一舉兩得,不過,我必須假設(shè)讀者對于組合語言及PC最基礎(chǔ)的架構(gòu),如寄存器,分;
段,分頁,中斷服務(wù)等有大概的認識 。;
讀者可在linuxsourcecode的/boot子目錄下找到幾個以.S作為副檔名的組合語言檔;
,本文要說明的即是其中的bootsect.S及setup.S兩個檔案,及盡量簡單的說明其所牽涉;
的相關(guān)硬體部份 。;
bootsect.S;
這個程序是linuxkernel的第一個程序,包括了linux自己的bootstrap程序,但是在;
說明這個程序前,必須先說明一般IBMPC開機時的動作(此處的開機是指"打開PC的電源";
):;
一般PC在電源一開時,是由內(nèi)存中地址FFFF:0000開始執(zhí)行(這個地址一定在ROMBIO;
S中,ROMBIOS一般是在FEOOOh到FFFFFh中),而此處的內(nèi)容則是一個jump指令,jump到另;
一個位于ROMBIOS中的位置,開始執(zhí)行一系列的動作,包括了檢查RAM,keyboard,顯示;
器,軟硬磁盤等等,這些動作是由系統(tǒng)測試碼(systemtestcode)來執(zhí)行的,隨著制作BI;
OS廠商的不同而會有些許差異,但都是大同小異,讀者可自行觀察自家機器開機時,螢;
幕上所顯示的檢查訊息 。;
緊接著系統(tǒng)測試碼之后,控制權(quán)會轉(zhuǎn)移給ROM中的啟動程序(ROMbootstraproutine);
,這個程序會將磁盤上的零道零扇區(qū)讀入內(nèi)存中(這就是一般所謂的bootsector,如果你;
曾接觸過電腦病毒,就大概聽過它的大名),至于被讀到內(nèi)存的哪里呢?--絕對位置07C0;
:0000(即07C00h處),這是IBM系列PC的特性 。而位在linux開機磁盤的bootsector上的正;
是linux的bootsect程序,也就是說,bootsect是第一個被讀入內(nèi)存中并執(zhí)行的程序 ?,F(xiàn);
在,我們可以開始來看看到底bootsect做了什么 。;
第一步;
首先,bootsect將它"自己"從被ROMBIOS載入的絕對地址0x7C00處搬到0x90000處,;
然后利用一個jmpi(jumpindirectly)的指令,跳到新位置的jmpi的下一行去執(zhí)行,關(guān)鍵;
的assemblycode如下:;
.;
(搬移bootsect本身);
.;
.;
jmpigo,INITSEC;
go:;
.;
.;
.;
表示將跳到CS為0x9000,IP為offset"go"的位置(CS:IP=0x9000:offsetgo),其中I;
NITSEC=0x9000定義于程序開頭的部份,而go這個label則恰好是下一行指令所在的位置;
。;
第二步;
接著,將其它segmentregisters包括DS,ES,SS都指向0x9000這個位置,與CS看齊;
。另外將SP及DX指向一任意位移地址(offset),這個地址等一下會用來存放磁盤參數(shù)表;
(diskpara-metertable);
提到磁盤參數(shù)表,就必須提到BIOS中斷1Eh 。先簡單的介紹一下BIOS的中斷服務(wù):80;
x86將內(nèi)存最低的256*4byte保留給256個中斷向量(每個interruptvector大小為4byte,;
所以一共有256*4=1024byte),而其中的第1Eh個向量指向"磁盤參數(shù)表",這個表會告訴;
電腦如何去讀取磁盤機,而我們所要做的事是搬移磁盤參數(shù)表到剛才所設(shè)定的任意地址;
。;
接著,改變搬移來的參數(shù)表的參數(shù),以符合我們的需要 。再將中斷向量1Eh指向我們;
所修改過的磁盤參數(shù)表,然后呼叫BIOSinterrupt的int13h(function0,即AH=0)重置磁;
盤控制卡及磁盤驅(qū)動器,之后磁盤機就會照我們的意思動作了 。如果你曾trace過DOS的;

推薦閱讀