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

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


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

推薦閱讀