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

自己動(dòng)手寫操作系統(tǒng)( 二 )


把程序?qū)懼羻?dòng)扇區(qū)
下面寫一個(gè)C程序,把我的操作系統(tǒng)寫入軟盤第一扇區(qū) 。程序內(nèi)容如下:#include/* unistd.h 需要這個(gè)文件 */
#include /* 包含有read和write函數(shù) */
#include
int main()
{
char boot_buf[512];
int floppy_desc, file_desc;
file_desc = open("./boot", O_RDONLY);
read(file_desc, boot_buf, 510);
close(file_desc);
boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;
floppy_desc = open("/dev/fd0", O_RDWR);
lseek(floppy_desc, 0, SEEK_CUR);
write(floppy_desc, boot_buf, 512);
close(floppy_desc);
}
首先,以只讀模式打開boot文件,然后在打開文件時(shí)把文件描述符復(fù)制到file_desc變量中 。從文件中讀取510個(gè)字符,或者讀取直到文件結(jié)束 。在本例中由于文件很小,所以是讀取至文件結(jié)束 。然后關(guān)閉文件 。最后4行代碼打開軟盤驅(qū)動(dòng)設(shè)備(一般來說是/dev/fd0) 。使用lseek找到文件開始處,然后從緩沖中向軟盤寫512個(gè)字節(jié) 。在read、write、open和lseek的幫助頁中,可以看到與函數(shù)所有有關(guān)的參數(shù)及其使用方法 。程序中有兩行比較難懂:boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;
該信息是用于BIOS的,如果它識(shí)別出該設(shè)備是一個(gè)可啟動(dòng)的設(shè)備,那么在第510和511的位置,該值就應(yīng)該是0x55和0xaa 。程序會(huì)把文件boot讀至名為boot_buf的緩沖中 。它要求改變第510和第511字節(jié),然后把boot_buf寫至軟盤之上 。如果執(zhí)行代碼,軟盤上的前512字節(jié)就包含了啟動(dòng)代碼 。最后,把文件存為write.c 。
編譯運(yùn)行
使用下面的命令把文件變?yōu)榭蓤?zhí)行文件:as86 boot.s -o boot.o
ld86 -d boot.o -o boot
cc write.c -o write
首先將boot.s文件編譯成目標(biāo)文件boot.o,然后將該文件連接成最終的boot文件 。最后C程序編譯成可執(zhí)行的write文件 。插入一個(gè)空白軟盤,運(yùn)行以下程序:./write
重新啟動(dòng)電腦,進(jìn)行BIOS的界面設(shè)置,并且把軟盤設(shè)為第一個(gè)啟動(dòng)的設(shè)備 。然后插入軟盤,電腦從軟盤上啟動(dòng) 。啟動(dòng)完成后,在屏幕上可以看到一個(gè)字母A(藍(lán)底白字),啟動(dòng)速度很快,幾乎是在瞬間完成 。這就意味著系統(tǒng)已經(jīng)從我們制作的軟盤上啟動(dòng)了,并且執(zhí)行了剛才寫入啟動(dòng)扇區(qū)的程序 ?,F(xiàn)在,它正處在一個(gè)無限循環(huán)的狀態(tài) 。所以,如果想進(jìn)入Linux,必需拿掉軟盤,并且重啟機(jī)器 。至此,這個(gè)操作系統(tǒng)就算完成了,雖然它沒有實(shí)現(xiàn)什么功能,但是它已經(jīng)可以啟動(dòng)機(jī)器了 。
上一期,我講述了如何在軟盤的啟動(dòng)扇區(qū)寫一些代碼,然后再從軟盤啟動(dòng)的過程 。制作好一個(gè)啟動(dòng)扇區(qū),在切換到保護(hù)模式之前,我們還應(yīng)該知道如何使用BIOS中斷 。BIOS中斷是一些由BIOS提供的、為了使操作系統(tǒng)的創(chuàng)建更容易的低級(jí)程序 。在本文中,我們將學(xué)習(xí)處理BIOS的中斷 。
為什么要用BIOS
BIOS會(huì)把啟動(dòng)扇區(qū)拷貝至RAM中,并且執(zhí)行這些代碼 。除此之外,BIOS還要做很多其它的事情 。當(dāng)一個(gè)操作系統(tǒng)剛開始啟動(dòng)時(shí),系統(tǒng)中并沒有顯卡驅(qū)動(dòng)、軟盤驅(qū)動(dòng)等任何驅(qū)動(dòng)程序 。因此,啟動(dòng)扇區(qū)中不可能包含任何一個(gè)驅(qū)動(dòng)程序,我們要采取其它的途徑 。這個(gè)時(shí)候,BIOS就可以幫助我們了 。BIOS中包含有各種可以使用的程序,包括檢測安裝的設(shè)備、控制打印機(jī)、計(jì)算內(nèi)存大小等用于各種目的的程序 。這些程序就是所說的BIOS中斷 。
如何調(diào)用BIOS中斷
在一般的程序設(shè)計(jì)語言中,函數(shù)的調(diào)用是一件非常容易的事情 。比如在C語言中,如果有一個(gè)名為display的程序,它帶有兩個(gè)參數(shù),其中參數(shù)noofchar表示顯示的字符數(shù),參數(shù)attr表示顯示字符的屬性 。那么要調(diào)用它,只需給出程序的名稱即可 。對(duì)于中斷的調(diào)用,我們使用的是匯編語言中的int指令 。比如,在C語言中要顯示一些東西時(shí),使用的指令如下所示:display(nofchar,attr);

推薦閱讀