資源描述:
《自己動(dòng)手寫(xiě)操作系統(tǒng)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、自己動(dòng)手寫(xiě)操作系統(tǒng)自己動(dòng)手寫(xiě)操作系統(tǒng)(一)作者:伊梅自由軟件社區(qū)是一個(gè)充滿自由和夢(mèng)想的地方,在10余年的時(shí)間里它創(chuàng)造了一個(gè)又一個(gè)奇跡。然而,這些奇跡的創(chuàng)造者不只是Stallman,也不只是LinusTorvalds,而是活躍在世界各地的不計(jì)其數(shù)的開(kāi)發(fā)人員。在使用各種功能強(qiáng)大的自由軟件時(shí),我總會(huì)對(duì)其開(kāi)發(fā)者充滿崇敬之情,期盼有朝一日自己也能成為他們中的一員。很多對(duì)自由社區(qū)充滿向往之情的人,雖然也想努力融身于其中,但又不知該怎么做。那么,就請(qǐng)與我們一起從編寫(xiě)一個(gè)簡(jiǎn)單的操作系統(tǒng)開(kāi)始吧!我們要做的事情有人可能擔(dān)心自己既沒(méi)有學(xué)過(guò)計(jì)算機(jī)原理,也沒(méi)有學(xué)過(guò)操作系統(tǒng)原理,更不懂匯編語(yǔ)言,對(duì)C
2、語(yǔ)言也一知半解,能寫(xiě)操作系統(tǒng)嗎?答案是沒(méi)問(wèn)題。我將帶大家一步一步完成自己的操作系統(tǒng)。當(dāng)然如果學(xué)一學(xué)上述內(nèi)容再好不過(guò)。首先要明確處理器(也就是CPU)控制著計(jì)算機(jī)。對(duì)PC而言,啟動(dòng)的時(shí)候,CPU都處在實(shí)模式狀態(tài),相當(dāng)于只是一個(gè)Intel8086處理器。也就是說(shuō),即使你現(xiàn)在擁有一個(gè)奔騰處理器,它的功能也只能是8086級(jí)別。從這一點(diǎn)上來(lái)講,可以使用一些軟件把處理器轉(zhuǎn)換到著名的保護(hù)模式。只有這樣,我們才可以充分利用處理器的強(qiáng)大功能。編寫(xiě)操作系統(tǒng)開(kāi)始是對(duì)BIOS控制,取出存儲(chǔ)在ROM里的程序。BIOS是用來(lái)執(zhí)行POST(PowerOnSelfTest,自檢)的。自檢是檢查計(jì)算機(jī)的完
3、整性(比如外設(shè)是否工作正常、鍵盤(pán)是否連接等)。這一切完成以后,你就會(huì)聽(tīng)到PC喇叭發(fā)出一聲清脆的響聲。如果一切正常,BIOS就會(huì)選擇一個(gè)啟動(dòng)設(shè)備,并且讀取該設(shè)備的第一扇區(qū)(即啟動(dòng)扇區(qū)),然后控制過(guò)程就會(huì)轉(zhuǎn)移到指定位置。啟動(dòng)設(shè)備可能是一個(gè)軟盤(pán)、光盤(pán)、硬盤(pán),或者其它所選擇的設(shè)備。在此我們把軟盤(pán)作為啟動(dòng)設(shè)備。如果我們已經(jīng)在軟盤(pán)的啟動(dòng)扇區(qū)里寫(xiě)了一些代碼,這時(shí)它就被執(zhí)行。因此,我們的目的很明確,就是往軟盤(pán)的啟動(dòng)扇區(qū)寫(xiě)一些程序。首先使用8086匯編來(lái)寫(xiě)一個(gè)小程序,然后將其拷貝至軟盤(pán)的啟動(dòng)扇區(qū)。為了實(shí)現(xiàn)拷貝,要寫(xiě)一個(gè)C程序。最后,使用軟盤(pán)啟動(dòng)計(jì)算機(jī)。需要的工具●as86:這是一個(gè)匯編程序
4、,它負(fù)責(zé)把寫(xiě)的代碼轉(zhuǎn)換成目標(biāo)文件?!駆d86:這是一個(gè)連接器,as86產(chǎn)生的目標(biāo)代碼由它來(lái)轉(zhuǎn)換成真正的機(jī)器語(yǔ)言。機(jī)器語(yǔ)言是8086能夠解讀的形式?!馟CC:著名的C編程器。因?yàn)槲覀冃枰獙?xiě)一個(gè)C程序?qū)⒆约旱腛S轉(zhuǎn)移到軟盤(pán)中?!褚粡埧哲洷P(pán):它用于存儲(chǔ)編寫(xiě)的操作系統(tǒng),也是啟動(dòng)設(shè)備?!褚慌_(tái)裝有Linux的計(jì)算機(jī):這臺(tái)機(jī)器可以很舊,386、486都可以。在大部分標(biāo)準(zhǔn)Linux發(fā)行版中都會(huì)帶有as86和ld86。在我使用的RedHat7.3中就包含有這兩個(gè)工具,并且在默認(rèn)的情況下,它已經(jīng)安裝在機(jī)器里。如果使用的Linux沒(méi)有這兩個(gè)工具,可以從網(wǎng)上下載(http://www.cix.c
5、o.uk/~mayday/),這兩個(gè)工具都包含在一個(gè)名為bin86的軟件包中。此外,有關(guān)的文檔也可以在網(wǎng)上獲得(www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html)。開(kāi)始工作使用一個(gè)你喜歡的編輯器輸入以下內(nèi)容:entrystartstart:movax,#0xb800moves,axsegesmov[0],#0x41segesmov[1],#0x1floop1:jmploop1這是as86可以讀懂的一段匯編程序。第一個(gè)句子指明了程序的入口點(diǎn),聲明整個(gè)過(guò)程從start處開(kāi)始。第二行指明了start的位置,說(shuō)明整個(gè)程序要
6、從start處開(kāi)始執(zhí)行。0xb800是顯存的開(kāi)始地址。#表明其后是一個(gè)立即數(shù)。執(zhí)行語(yǔ)句:movax,#oxb800ax寄存器的值就變?yōu)?xb800,這就是顯存的地址。下面再將這個(gè)值移至es寄存器,es是附加段寄存器。請(qǐng)記住8086有一個(gè)分段的體系結(jié)構(gòu)。它的各段寄存器為代碼段、數(shù)據(jù)段、堆棧段和附加段,對(duì)應(yīng)的寄存器名稱分別為cs、ds、ss和es。事實(shí)上,我們把顯存地址送入了附加段,因此,任何送入附加段的東西都會(huì)被送到顯存中。要在屏幕上顯示字符,就需要向顯存中寫(xiě)兩個(gè)字節(jié)。前一個(gè)是所要顯示字符的ASCⅡ值,第二個(gè)字節(jié)表示該字符的屬性。屬性包括字符的前景色、背景色及是否閃爍等等。
7、seges指明下一個(gè)將要執(zhí)行的指令是指向es段的。所以,我們把值0x41(在ASCⅡ中表示的字符是A)送到顯存的第一個(gè)字節(jié)中。接下來(lái)要把字符的屬性送到下一個(gè)字節(jié)當(dāng)中。在此輸入的是0x1f,該屬性指的是在藍(lán)色背景下顯示白色的字符。因此,如果執(zhí)行這個(gè)程序,就可以在屏幕上得到顯示在藍(lán)底上的一個(gè)白色的A。接著是一個(gè)循環(huán)。因?yàn)樵趫?zhí)行完顯示字符的任務(wù)后,要么讓程序結(jié)束,要么使用一個(gè)循環(huán)使其永遠(yuǎn)運(yùn)行下去。把該文件命名為boot.s,然后存盤(pán)。此處顯存的概念說(shuō)得不是很清楚,有必要進(jìn)一步解釋一下。假設(shè)屏幕由80列×25行組成,那么第一行就需要1