亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 自己動手寫操作系統.txt

?? 學習(編程技巧_編程知識_程序代碼),是學習編程不可多得的學習精驗
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
自己動手寫操作系統
 

--------------------------------------------------------------------------------
 
第八軍團 時間:2003-12-28 14:09:21 
   
有人可能擔心自己既沒有學過計算機原理,也沒有學過操作系統原理,更不懂匯編語言,對C語言也一知半解,能寫操作系統嗎?答案是沒問題。我將帶大家一步一步完成自己的操作系統。當然如果學一學上述內容再好不過。 
首先要明確處理器(也就是CPU)控制著計算機。對PC而言,啟動的時候,CPU都處在實模式狀態,相當于只是一個Intel 8086處理器。也就是說,即使你現在擁有一個奔騰處理器,它的功能也只能是8086級別。從這一點上來講,可以使用一些軟件把處理器轉換到著名的保護模式。只有這樣,我們才可以充分利用處理器的強大功能。 

編寫操作系統開始是對BIOS控制,取出存儲在ROM里的程序。BIOS是用來執行POST(Power On Self Test,自檢)的。自檢是檢查計算機的完整性(比如外設是否工作正常、鍵盤是否連接等)。這一切完成以后,你就會聽到PC喇叭發出一聲清脆的響聲。如果一切正常,BIOS就會選擇一個啟動設備,并且讀取該設備的第一扇區(即啟動扇區),然后控制過程就會轉移到指定位置。啟動設備可能是一個軟盤、光盤、硬盤,或者其它所選擇的設備。在此我們把軟盤作為啟動設備。如果我們已經在軟盤的啟動扇區里寫了一些代碼,這時它就被執行。因此,我們的目的很明確,就是往軟盤的啟動扇區寫一些程序。 

首先使用8086匯編來寫一個小程序,然后將其拷貝至軟盤的啟動扇區。為了實現拷貝,要寫一個C程序。最后,使用軟盤啟動計算機。 


需要的工具 


● as86:這是一個匯編程序,它負責把寫的代碼轉換成目標文件。 

● ld86:這是一個連接器,as86產生的目標代碼由它來轉換成真正的機器語言。機器語言是8086能夠解讀的形式。 

● GCC:著名的C編程器。因為我們需要寫一個C程序將自己的OS轉移到軟盤中。 

● 一張空軟盤:它用于存儲編寫的操作系統,也是啟動設備。 

● 一臺裝有Linux的計算機:這臺機器可以很舊,386、486都可以。 

在大部分標準Linux發行版中都會帶有as86和ld86。在我使用的Red Hat 7.3中就包含有這兩個工具,并且在默認的情況下,它已經安裝在機器里。如果使用的Linux沒有這兩個工具,可以從網上下載(http://www.cix.co.uk/~mayday/),這兩個工具都包含在一個名為bin86的軟件包中。此外,有關的文檔也可以在網上獲得(www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html)。 


開始工作 


使用一個你喜歡的編輯器輸入以下內容: 

entry start 
start: 
mov ax,#0xb800 
mov es,ax 
seg es 
mov [0],#0x41 
seg es 
mov [1],#0x1f 
loop1: jmp loop1 


這是as86可以讀懂的一段匯編程序。第一個句子指明了程序的入口點,聲明整個過程從start處開始。第二行指明了start的位置,說明整個程序要從start處開始執行。0xb800是顯存的開始地址。#表明其后是一個立即數。執行語句: 

mov ax,#oxb800 


ax寄存器的值就變為0xb800,這就是顯存的地址。下面再將這個值移至es寄存器,es是附加段寄存器。請記住8086有一個分段的體系結構。它的各段寄存器為代碼段、數據段、堆棧段和附加段,對應的寄存器名稱分別為cs、ds、ss和es。事實上,我們把顯存地址送入了附加段,因此,任何送入附加段的東西都會被送到顯存中。 

要在屏幕上顯示字符,就需要向顯存中寫兩個字節。前一個是所要顯示字符的ASCⅡ值,第二個字節表示該字符的屬性。屬性包括字符的前景色、背景色及是否閃爍等等。seg es指明下一個將要執行的指令是指向es段的。所以,我們把值0x41(在ASCⅡ中表示的字符是A)送到顯存的第一個字節中。接下來要把字符的屬性送到下一個字節當中。在此輸入的是0x1f,該屬性指的是在藍色背景下顯示白色的字符。因此,如果執行這個程序,就可以在屏幕上得到顯示在藍底上的一個白色的A。接著是一個循環。因為在執行完顯示字符的任務后,要么讓程序結束,要么使用一個循環使其永遠運行下去。把該文件命名為boot.s,然后存盤。 

此處顯存的概念說得不是很清楚,有必要進一步解釋一下。假設屏幕由80列×25行組成,那么第一行就需要160字節,其中一個字節用于表示字符,另外一個字節用于表示字符的屬性。如果要在第三行顯示某一字符的話,就要跳過顯存的第0和1字節(它們是用于顯示第1列的),第2和3字節(它們是用于顯示第2列的),然后把需要顯示字符的ASCⅡ碼值入第4字節,把字符的屬性寫入第5字節。 


把程序寫至啟動扇區 


下面寫一個C程序,把我的操作系統寫入軟盤第一扇區。程序內容如下: 

#include <sys/types.h> /* unistd.h 需要這個文件 */ 
#include <unistd.h> /* 包含有read和write函數 */ 
#include <fcntl.h> 
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文件,然后在打開文件時把文件描述符復制到file_desc變量中。從文件中讀取510個字符,或者讀取直到文件結束。在本例中由于文件很小,所以是讀取至文件結束。然后關閉文件。 

最后4行代碼打開軟盤驅動設備(一般來說是/dev/fd0)。使用lseek找到文件開始處,然后從緩沖中向軟盤寫512個字節。 

在read、write、open和lseek的幫助頁中,可以看到與函數所有有關的參數及其使用方法。程序中有兩行比較難懂: 

boot_buf[510] = 0x55; 
boot_buf[511] = 0xaa; 


該信息是用于BIOS的,如果它識別出該設備是一個可啟動的設備,那么在第510和511的位置,該值就應該是0x55和0xaa。程序會把文件boot讀至名為boot_buf的緩沖中。它要求改變第510和第511字節,然后把boot_buf寫至軟盤之上。如果執行代碼,軟盤上的前512字節就包含了啟動代碼。最后,把文件存為write.c。 


編譯運行 


使用下面的命令把文件變為可執行文件: 

as86 boot.s -o boot.o 
ld86 -d boot.o -o boot 
cc write.c -o write 


首先將boot.s文件編譯成目標文件boot.o,然后將該文件連接成最終的boot文件。最后C程序編譯成可執行的write文件。 

插入一個空白軟盤,運行以下程序: 

./write 


重新啟動電腦,進行BIOS的界面設置,并且把軟盤設為第一個啟動的設備。然后插入軟盤,電腦從軟盤上啟動。 

啟動完成后,在屏幕上可以看到一個字母A(藍底白字),啟動速度很快,幾乎是在瞬間完成。這就意味著系統已經從我們制作的軟盤上啟動了,并且執行了剛才寫入啟動扇區的程序。現在,它正處在一個無限循環的狀態。所以,如果想進入Linux,必需拿掉軟盤,并且重啟機器。 

至此,這個操作系統就算完成了,雖然它沒有實現什么功能,但是它已經可以啟動機器了。 
我講述了如何在軟盤的啟動扇區寫一些代碼,然后再從軟盤啟動的過程。制作好一個啟動扇區,在切換到保護模式之前,我們還應該知道如何使用BIOS中斷。BIOS中斷是一些由BIOS提供的、為了使操作系統的創建更容易的低級程序。在本文中,我們將學習處理BIOS的中斷。 

為什么要用BIOS 

BIOS會把啟動扇區拷貝至RAM中,并且執行這些代碼。除此之外,BIOS還要做很多其它的事情。當一個操作系統剛開始啟動時,系統中并沒有顯卡驅動、軟盤驅動等任何驅動程序。因此,啟動扇區中不可能包含任何一個驅動程序,我們要采取其它的途徑。這個時候,BIOS就可以幫助我們了。BIOS中包含有各種可以使用的程序,包括檢測安裝的設備、控制打印機、計算內存大小等用于各種目的的程序。這些程序就是所說的BIOS中斷。 

如何調用BIOS中斷 

在一般的程序設計語言中,函數的調用是一件非常容易的事情。比如在C語言中,如果有一個名為display的程序,它帶有兩個參數,其中參數noofchar表示顯示的字符數,參數attr表示顯示字符的屬性。那么要調用它,只需給出程序的名稱即可。對于中斷的調用,我們使用的是匯編語言中的int指令。 

比如,在C語言中要顯示一些東西時,使用的指令如下所示: 

display(nofchar,attr); 
而使用BIOS時,要實現相同功能使用的指令如下: 

int 0x10 

如何傳遞參數 

在調用BIOS中斷之前,我們需要先往寄存器中送一些特定的值。假設要使用BIOS的中斷13h,該中斷的功能是把數據從軟盤傳送至內存之中。在調用該中斷之前,要先指定拷貝數據的段地址,指定驅動器號、磁道號、扇區號,以及要傳送的扇區數等等。然后,就要往相應的寄存器送入相應的值。在進行下面的步驟前,讀者有必要對這一點有比較明確地認識。 

此外,一個比較重要的事實是同一個中斷往往可以實現各種不同的功能。中斷所實現的確切功能取決于所選擇的功能號,功能號一般都存在ah寄存器之中。比如中斷13h可以用于讀磁盤、寫磁盤等功能,如果把3送入ah寄存器中,那么中斷選擇的功能就是寫磁盤;如果把2送入ah寄存器中,選擇的功能則是讀磁盤等。 

我們要做的事情 

這次我們的源代碼由兩個匯編語言程序和一個C程序組成。第一個匯編文件是引導扇區的代碼。在引導扇區中,我們寫的代碼是要把軟盤中第二扇區拷貝至內存段的0x500處(地址是0x5000,即偏移地址為0)。這時我們需要使用BIOS的中斷13h。這時啟動扇區的代碼就會把控制權轉移至0x500處。在第二個匯編文件中,代碼會使用BIOS中斷10h在屏幕上顯示一個信息。C程序實現的功能則是把可執行的文件1拷貝至啟動扇區,把可執行的文件2拷貝至軟盤的第二扇區。 

啟動扇區代碼 

使用中斷13h,啟動扇區把軟盤第二扇區里的內容加載至內存的0x5000處(段地址為0x500)。下面的代碼是用于實現這一目的的代碼,將其保存至文件sbect.s中。 

LOC1=0x500 
entry start 
start: 
mov ax,#LOC1 
mov es,ax 
mov bx,#0 
mov dl,#0 
mov dh,#0 
mov ch,#0 
mov cl,#2 
mov al,#1 
mov ah,#2 
int 0x13 
jmpi 0,#LOC1 


上面代碼第一行類似于一個宏。接下去的兩行則是把值0x500加載至es寄存器中,這是軟盤上第二扇區代碼將拷貝到的地方(第一扇區是啟動扇區)。這時,把段內的偏移設為0。 

接下來把驅動器號送入dl寄存器中,其中磁頭號送入dl寄存器中,磁道號送入ch寄存器中,扇區號送入cl寄存器中,扇區數送入al寄存器之中。我們想要實現的功能是把扇區2、磁道號為0、驅動器號為0的內容送至段地址0x500處。所有這些參數都和1.44MB的軟盤相對應。 

把2送入ah寄存器中,是選擇了由中斷13h提供的相應功能,即實現從軟驅轉移數據的功能。 

最后調用中斷13h,并且轉至偏移為0的段地址0x500處。 

第二個扇區的代碼 

第二個扇區中的代碼如下所示(把這些代碼保存至文件sbect2.s之中): 

entry start 
start: 
mov ah,#0x03 
xor bh,bh 
int 0x10 

mov cx,#26 
mov bx,#0x0007 
mov bp,#mymsg 
mov ax,#0x1301 
int 0x10 

loop1: jmp loop1 
mymsg: 
.byte 13,10 
.ascii “Operating System is Loading......” 


上面代碼將被加載至段地址為0x500處,并且被執行。在這段代碼中,使用了中斷10h來獲取目前的光標位置,然后顯示信息。 

從第3行到第5行用于得到目前光標的位置,在此中斷10h選用的是功能3。然后,清除了bh寄存器的內容,并把字符串送至ch寄存器中。在bx中,我們送入了頁碼及顯示的屬性。此處,我們想要在黑背景上顯示白色的字符。然后,把要顯示字符的地址送到bp之中,信息由兩個字節組成,其值分別為13的10,它們分別對應回車和LF(換行)的ASCⅡ值。接下來是一個由29個字符組成的串;在下面實現的功能是輸出字符串然后移動光標;最后是調用中斷,然后進入循 環。 

C程序代碼 
C程序的源代碼如下所示,將其存儲為write.c文件。 

#include /* unistd.h needs this */ 
#include /* contains read/write */ 
#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); 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久久久电影| 国产一区二区三区精品欧美日韩一区二区三区| 欧美三级中文字幕| 国产美女视频一区| 亚洲午夜精品久久久久久久久| 精品电影一区二区| 欧美日免费三级在线| 国产一区二区三区不卡在线观看 | 成人午夜免费电影| 日韩一区欧美二区| 国产视频一区在线播放| 欧美日韩国产123区| aaa国产一区| 国模套图日韩精品一区二区| 亚洲午夜免费福利视频| 亚洲国产精品99久久久久久久久| 欧美日韩在线亚洲一区蜜芽| www.性欧美| 国产大陆精品国产| 久久草av在线| 日本亚洲一区二区| 亚洲午夜激情网页| 亚洲美女淫视频| 国产精品伦一区| 久久男人中文字幕资源站| 91麻豆精品国产综合久久久久久| 色婷婷综合中文久久一本| 风间由美一区二区三区在线观看| 久久国产人妖系列| 免费观看在线综合色| 天堂资源在线中文精品| 亚洲亚洲人成综合网络| 一区二区三区四区国产精品| 亚洲丝袜精品丝袜在线| 一区免费观看视频| 中文一区二区完整视频在线观看| 久久亚洲捆绑美女| 精品成人一区二区三区四区| 日韩三级高清在线| 91麻豆精品国产91| 欧美一级在线视频| 欧美一区二区在线免费播放| 欧美精品tushy高清| 欧美日韩久久一区| 欧美久久久久中文字幕| 91精品久久久久久久久99蜜臂| 精品视频一区二区三区免费| 欧美视频日韩视频在线观看| 欧美中文字幕不卡| 欧美色电影在线| 337p亚洲精品色噜噜狠狠| 91精品国产综合久久婷婷香蕉| 91精品国产综合久久精品| 欧美一区在线视频| 2023国产精品自拍| 中文字幕久久午夜不卡| 中文字幕一区视频| 亚洲激情男女视频| 亚欧色一区w666天堂| 蜜臀久久久99精品久久久久久| 久久成人麻豆午夜电影| 国产伦精品一区二区三区免费| 国产成人午夜高潮毛片| 91丨九色丨尤物| 欧美视频在线一区二区三区 | 成人午夜私人影院| 91网页版在线| 欧美日韩国产经典色站一区二区三区| 91精品国产全国免费观看| 精品动漫一区二区三区在线观看| 欧美国产成人精品| 亚洲午夜三级在线| 国产在线精品一区二区| 99精品在线观看视频| 欧美日韩国产成人在线免费| 日韩精品中午字幕| 中文av一区特黄| 亚洲午夜久久久| 久久精品国产一区二区| 午夜日韩在线电影| 国产成人一区在线| 色妹子一区二区| 制服.丝袜.亚洲.中文.综合| 国产欧美精品一区| 亚洲欧美日本在线| 久久se精品一区精品二区| 国产成人午夜高潮毛片| 欧洲精品一区二区| 日韩一区二区在线免费观看| 国产精品色眯眯| 亚洲精品高清在线| 国产一区二区三区精品欧美日韩一区二区三区 | 五月婷婷激情综合网| 狠狠色丁香婷综合久久| 欧美在线观看视频一区二区| 日韩一级片在线观看| 综合久久国产九一剧情麻豆| 日韩专区中文字幕一区二区| 成人av在线看| 91麻豆精品91久久久久久清纯 | av午夜精品一区二区三区| 91精品一区二区三区久久久久久| 久久亚洲综合色一区二区三区 | 久久疯狂做爰流白浆xx| 在线精品视频免费播放| 精品国产精品一区二区夜夜嗨| 亚洲夂夂婷婷色拍ww47| 国产综合久久久久久鬼色| 欧美日本一区二区三区| 国产网站一区二区| 麻豆成人久久精品二区三区小说| www.欧美日韩国产在线| 欧美电影免费观看完整版| 亚洲欧美激情插| 成人免费高清视频在线观看| 99精品视频中文字幕| 国产午夜精品在线观看| 奇米精品一区二区三区在线观看 | 91激情五月电影| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲一线二线三线久久久| 久久超碰97人人做人人爱| 欧美区一区二区三区| 2020日本不卡一区二区视频| 日韩成人免费看| 成人精品视频一区二区三区 | 久久草av在线| 欧美日韩高清一区二区不卡 | 欧美国产丝袜视频| 国产乱人伦偷精品视频免下载| 欧美日韩国产一区| 亚洲高清在线视频| 色综合中文综合网| 日韩精品国产精品| 欧美综合欧美视频| 亚洲激情五月婷婷| 成人av资源网站| 中文字幕在线一区| 国产成人免费高清| 国产精品美女久久久久高潮| 国产一区二区三区四区五区入口| 精品久久久久av影院| 青青草国产成人99久久| 日韩美一区二区三区| 日韩精品国产欧美| 欧美成人r级一区二区三区| 亚洲国产美国国产综合一区二区 | 精品国一区二区三区| 国精产品一区一区三区mba桃花| 欧美日韩成人高清| 日本欧美久久久久免费播放网| 欧美亚洲国产怡红院影院| 午夜视频一区二区| 欧美日韩精品系列| 蜜桃精品视频在线| 欧美精品乱码久久久久久| 男女男精品视频网| 久久一二三国产| 国产99精品国产| 亚洲激情校园春色| 欧美视频精品在线| 久热成人在线视频| 欧美精品一区男女天堂| 成人激情开心网| 亚洲日本丝袜连裤袜办公室| 欧美性极品少妇| 亚洲成人激情社区| 日韩欧美在线不卡| 久久精品国产精品青草| 国产女同性恋一区二区| 国产成人午夜99999| 国产精品久久三区| 成人深夜在线观看| 一区二区三区四区在线免费观看 | 欧美疯狂做受xxxx富婆| 美女任你摸久久| 欧美亚洲图片小说| 丝袜国产日韩另类美女| 2欧美一区二区三区在线观看视频| 国产一区二区不卡老阿姨| 日韩理论在线观看| 欧美日韩一级黄| 国产精品一区二区久久精品爱涩| 国产精品美女久久久久av爽李琼| 欧美日韩视频不卡| 黄色资源网久久资源365| 亚洲美女精品一区| 99久久久久免费精品国产 | 亚洲成av人片www| 日本一区二区三区在线观看| 色综合天天综合网天天看片| 久久爱另类一区二区小说| 亚洲欧洲国产日韩| 精品女同一区二区| 91免费看`日韩一区二区| 免费观看在线综合色| 亚洲私人影院在线观看| 日韩午夜激情av| 91蝌蚪porny成人天涯| 亚洲成av人片观看|