在計算機系統中,數據存儲採用三級存儲架構——寄存器,內存和硬盤。寄存器在CPU的芯片內,其訪問速度和CPU的計算速度差不多,但成本比較高,而且CPU的體積也決定了寄存器不可能有較大的容量。在編寫focus系統的啓動代碼部分,因爲要使用彙編語言,因此,就需要直接操作寄存器。那麼我們就先了解下CPU內部的一些寄存器。
這裏andrew感到很抱歉,因爲沒有辦法深入的去介紹細節性的東西了,如果andrew要將focus編寫過程中所有的細節都詳細的介紹,那麼andrew光寫文章都要寫幾個月,這個有點不太現實,所以andrew想了想,遇到一些知識點,如果這些點大家很容易找到的話,andrew就對這些點大致的介紹一下,給大家指一個方向,大家知道該自學一些什麼內容,其實andrew介紹的話,也是和別人的資料差不多,相當於複述一下,意義也不大,而且還是消耗很多時間去寫這些東西,所以,請朋友們見諒哈。
通用寄存器
AX——累加寄存器
CX——計數寄存器
DX——數據寄存器
BX——基址寄存器
SP——棧指針寄存器
BP——基址指針寄存器
SI——源變址寄存器
DI——目的變址寄存器
CPU中有8個通用寄存器,這8個寄存器都是16位的,這些寄存器既具有一般功能,也具有各自的特殊功能。
其中AX,CX,DX和BX寄存器還可以當作兩個8位寄存器使用。
AL——累加寄存器低位
AH——累加寄存器高位
CL——計數寄存器低位
CH——計數寄存器高位
DL——數據寄存器低位
DH——數據寄存器高位
BL——基址寄存器低位
BH——基址寄存器高位
在INTER的CPU中,數據在用小端模式存儲,即數據的低位放在低地址,數據的高位放在高地址。以AX寄存器爲例,如果AX寄存器中的數據爲0x1234,那麼AL裏存放的是低位0x34,AH裏存放的是高位0x12。
段寄存器
ES——附加段寄存器
CS——代碼段寄存器
SS——堆棧段寄存器
DS——數據段寄存器
段寄存器用於存放對數據訪問時的段基址。
CPU還有狀態寄存器,內存管理寄存器和控制寄存器。狀態寄存器記錄CPU運行過程中的狀態和運算結果等,內存管理寄存器用於存儲對內存方位需要的數據信息,控制寄存器控制這CPU工作的模式等。這一部分內容可以參考INTER的編程指南,大家可以在http://download.csdn.net/detail/andrew_yau/7429355
下載,andrew上傳的,可以免費下載,但好像要申請一個CSDN帳號。後面在編程的時候,也會適當的介紹一些關於寄存器的內容。
在上一次的代碼中,使用到了BIOS的0x10號中斷,andrew這裏和大家介紹一下BIOS中斷的使用。BIOS中斷爲操作系統的啓動提供了一些低級的服務,這個和編寫應用程序使用的庫函數有些像,在C語言中調用printf函數可以打印字符串,操作系統的代碼不能夠調用庫函數,但BIOS能夠給我們提供一些相關服務的功能。BIOS的參考資料andrew上傳在http://download.csdn.net/detail/andrew_yau/7429337
大家可以自由下載。andrew以上一次boot.s的代碼爲例,介紹下中斷調用的用法。
-
mov cx,#30
-
mov dx,#0x1004
-
mov bx,#0x000c
-
mov bp,#msg
-
mov ax,#0x1301
-
int 0x10
AH=13H
BH=頁碼
BL=屬性(若 AL=00H 或 01H)
CX=顯示字符串長度
(DH、DL)=座標(行、列)
ES:BP=顯示字符串的地址
AL=顯示輸出方式
0——字符串中只含顯示字符,其顯示屬性在 BL 中。顯示後,光標位置不變
1——字符串中只含顯示字符,其顯示屬性在 BL 中。顯示後,光標位置改變
2——字符串中含顯示字符和顯示屬性。顯示後,光標位置不變
3——字符串中含顯示字符和顯示屬性。顯示後,光標位置改變
出口參數:無
這是BIOS0x10號中斷的詳細解釋。CX寄存器存放要顯示寄存器的長度,在代碼中設置爲30個。DX中存放的是顯示座標,即在屏幕中顯示的位置。ES:BP是要顯示的字符串的地址,ES在之前已經設爲0x07c0,那麼BP即存放的是字符串大偏移地址。AH=0x13,即功能號,決定0x10號中斷執行是做什麼事情,一箇中斷號可以做很多事情,例如顯示字符串,顯示一個字符,配置顯示器等都有0x10號中斷完成,但具體完成什麼功能有AH中的功能號決定。AL中爲顯示的模式。其實BIOS的中斷調用使用起來還是很方便的。
跟着昨天的內容,昨天完成了focus的引導扇區代碼,這寫代碼只是顯示了兩行字符串,除此之外什麼都沒做。其實512字節的代碼確實能做的事情太有限了,那麼那麼大的操作系統程序,是怎麼運行呢?當然是靠引導扇區的程序了。引導扇區的代碼量少是因爲BIOS只能把一個扇區的內容拷貝到內存,這一部分作爲排頭兵,在內存中佔領了據點之後,再把操作系統剩下的代碼搬移到內存,這就是引導扇區代碼的主要內容。
搬移程序就要將程序從軟驅中讀取到內存,這就涉及到如何讀軟驅的問題了,剛剛講過的,用BIOS中斷哈,BIOS的0x13號中斷提供了對磁盤的服務。
AH=0x02;讀盤
AH=0x03;寫盤
AL=處理對象的扇區數;
CH=柱面號&0xff;
CL=(扇區號&0x3f)|((柱面號&0x300)>>2);
DH=磁頭號;
DL=驅動器號;
ES:BX=緩衝區地址
返回值:
CF=0;沒有錯誤
CF=1;有錯誤,錯誤碼在AH中
今天的代碼andrew先將引導扇區代碼加入讀盤的功能,讓其能夠加載後續的代碼。完整的代碼andrew將其放在博客中,因爲andrew考慮到,用手機來閱讀可能沒有電腦上那麼舒服,如果介紹的內容很多而且內容太專業,可能大家剛看一會就不會再看了,所以andrew決定以後微信上只介紹些概念性的,以及一些關鍵點的代碼。完整的代碼放在博客中,有興趣的朋友可以在電腦上進行學習。
謝謝。
————————————————————————
QQ:64879927
博客:http://blog.csdn.net/andrew_yau
請關注focus微信公共平臺:OS的探索之旅