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

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


kernel,你會發(fā)現(xiàn),上述的動作在DOS中也有類似的對應(yīng)流程 。;
現(xiàn)在讓我們來看看關(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ù)表的;
長度就是6個(gè)word,(不過事實(shí)上,磁盤參數(shù)表的確實(shí)長度是11個(gè)byte) 。關(guān)于磁盤參數(shù)表;
,有興趣的讀者可自行參閱講述BIOSinterruptservices的技術(shù)手冊,會有詳細(xì)的說明 。;

讀者可以用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);
在程序中我們所更動的是第五個(gè)byte(byte04h),改為18h(在上圖例子中為12h),這;
個(gè)byte的功能是定義磁軌上一個(gè)磁區(qū)的資料筆數(shù) 。關(guān)鍵的程序碼如下:;
.;
movb4(di),*18;
.;
 ;
第叁步;
接著利用BIOS中斷服務(wù)int13h的第0號功能,重置磁盤控制器,使得剛才的設(shè)定發(fā)揮;
功能 。;
.;
.;
xorah,ah;
xordl,dl;
int0x13;
.;
.;
第四步;
完成重置磁盤控制器之后,bootsect就從磁盤上讀入緊鄰著bootsect的setup程序,;
也就是以后將會介紹的setup.S,此讀入動作是利用BIOS中斷服務(wù)int13h的第2號功能 。;
setup的image將會讀入至程序所指定的內(nèi)存絕對地址0x90200處,也就是在內(nèi)存中緊鄰著;
bootsect所在的位置 。待setup的image讀入內(nèi)存后,利用BIOS中斷服務(wù)int13h的第8號功;
能讀取目前磁盤機(jī)的參數(shù) 。;
第五步;
再來,就要讀入真正linux的kernel了,也就是你可以在linux的根目錄下看到的"v;
mlinuz" 。在讀入前,將會先呼叫BIOS中斷服務(wù)int10h的第3號功能,讀取游標(biāo)位置,之;
后再呼叫BIOS中斷服務(wù)int10h的第13h號功能,在螢?zāi)簧陷敵鲎址?Loading",這個(gè)字;
符串在bootlinux時(shí)都會首先被看到,相信大家應(yīng)該覺得很眼熟吧 。;
linux的kernel將會被讀入至內(nèi)存絕對地址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);
容筆者并不想一一介紹,不過聰明的讀者們應(yīng)該已經(jīng)猜到,read_it一定又利用了BIOSi;
nt13h與磁盤有關(guān)的I/O中斷服務(wù)了 。;
至于kill_motor子程序,它的功能在于停止軟盤機(jī)的馬達(dá)(各位聰明的讀者會不會覺;
得這個(gè)子程序的名稱取得頗為傳神呢?),其程序碼如下:;

推薦閱讀