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

自己動手寫操作系統(tǒng)( 四 )


#include
int main()
{
char boot_buf[512];
int floppy_desc, file_desc;
file_desc = open(“./bsect”, 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_SET);
write(floppy_desc, boot_buf, 512);
file_desc = open(“./sect2”, O_RDONLY);
read(file_desc, boot_buf, 512);
close(file_desc);
lseek(floppy_desc, 512, SEEK_SET);
write(floppy_desc, boot_buf, 512);
close(floppy_desc);
}
在上一期中,我曾經(jīng)介紹過如何操作能啟動的軟盤 。現(xiàn)在這一個過程稍微有點不同,首先把由bsect.s編譯出來的可執(zhí)行文件bsect拷貝至軟盤的啟動扇區(qū) 。然后再把由sect2.s產(chǎn)生的可執(zhí)行文件sect2拷貝至軟盤的第二個扇區(qū) 。把上述文件置于同一目錄之下,然后分別對其進(jìn)行編譯,方法如下所示:as86 bsect.s -o bsect.o
ld86 -d bsect.o -o bsect
對sect2.s文件重復(fù)以上的操作,得出可執(zhí)行文件sect2 。編譯write.c,插入軟盤后執(zhí)行write文件,命令如下所示:cc write.c -o write
./write
下一步我們要做的事情
從軟盤啟動以后,可以看到顯示出來的字符串 。這是使用了BIOS中斷來完成的 。下一期要做的事情是在這個操作系統(tǒng)中實現(xiàn)實模式向保護(hù)模式的轉(zhuǎn)換 。

現(xiàn)在,這個操作系統(tǒng)已經(jīng)越來越接近當(dāng)年Linus Torvalds的那個具有“歷史意義”的Linux內(nèi)核了 。因此,要馬上把這個系統(tǒng)切換到保護(hù)模式之下 。什么是保護(hù)模式自從1969年推出第一個微處理器以來,Intel處理器就在不斷地更新?lián)Q代,從8086、8088、80286,到80386、80486、奔騰、奔騰Ⅱ、奔騰4等,其體系結(jié)構(gòu)也在不斷變化 。80386以后,提供了一些新的功能,彌補(bǔ)了8086的一些缺陷 。這其中包括內(nèi)存保護(hù)、多任務(wù)及使用640KB以上的內(nèi)存等,并仍然保持和8086家族的兼容性 。也就是說80386仍然具備了8086和80286的所有功能,但是在功能上有了很大的增強(qiáng) 。早期的處理器是工作在實模式之下的,80286以后引入了保護(hù)模式,而在80386以后保護(hù)模式又進(jìn)行了很大的改進(jìn) 。在80386中,保護(hù)模式為程序員提供了更好的保護(hù),提供了更多的內(nèi)存 。事實上,保護(hù)模式的目的不是為了保護(hù)程序,而是要保護(hù)程序以外的所有程序(包括操作系統(tǒng)) 。簡言之,保護(hù)模式是處理器的一種最自然的模式 。在這種模式下,處理器的所有指令及體系結(jié)構(gòu)的所有特色都是可用的,并且能夠達(dá)到最高的性能 。保護(hù)模式和實模式從表面上看,保護(hù)模式和實模式并沒有太大的區(qū)別,二者都使用了內(nèi)存段、中斷和設(shè)備驅(qū)動來處理硬件,但二者有很多不同之處 。我們知道,在實模式中內(nèi)存被劃分成段,每個段的大小為64KB,而這樣的段地址可以用16位來表示 。內(nèi)存段的處理是通過和段寄存器相關(guān)聯(lián)的內(nèi)部機(jī)制來處理的,這些段寄存器(CS、DS、SS和ES)的內(nèi)容形成了物理地址的一部分 。具體來說,最終的物理地址是由16位的段地址和16位的段內(nèi)偏移地址組成的 。用公式表示為:物理地址=左移4位的段地址 偏移地址 。在保護(hù)模式下,段是通過一系列被稱之為“描述符表”的表所定義的 。段寄存器存儲的是指向這些表的指針 。用于定義內(nèi)存段的表有兩種:全局描述符表(GDT)和局部描述符表(LDT) 。GDT是一個段描述符數(shù)組,其中包含所有應(yīng)用程序都可以使用的基本描述符 。在實模式中,段長是固定的(為64KB),而在保護(hù)模式中,段長是可變的,其最大可達(dá)4GB 。LDT也是段描述符的一個數(shù)組 。與GDT不同,LDT是一個段,其中存放的是局部的、不需要全局共享的段描述符 。每一個操作系統(tǒng)都必須定義一個GDT,而每一個正在運行的任務(wù)都會有一個相應(yīng)的LDT 。每一個描述符的長度是8個字節(jié),格式如圖3所示 。當(dāng)段寄存器被加載的時候,段基地址就會從相應(yīng)的表入口獲得 。描述符的內(nèi)容會被存儲在一個程序員不可見的影像寄存器(shadow register)之中,以便下一次同一個段可以使用該信息而不用每次都到表中提取 。物理地址由16位或者32位的偏移加上影像寄存器中的基址組成 。實模式和保護(hù)模式的不同可以從圖1和圖2中很清楚地看出來 。

推薦閱讀