30天自制操作系统读书笔记(三)
來吧。第三天。
制作真正的IPL:
????????
?
作者又是那樣,一上來就甩一堆代碼,用他的話猜測,下面這段代碼應該是用來裝載下一個512字節的內容的。
MOV AX,0x0820MOV ES,AXMOV CH,0 ; 柱面0MOV DH,0 ; 磁頭0MOV CL,2 ; 扇區2MOV AH,0x02 ; AH=0x02 : 讀盤MOV AL,1 ; 1個扇區MOV BX,0MOV DL,0x00 ; A驅動器INT 0x13 ; 調用磁盤biosJC error?
好吧,作者在代碼后面稍微解釋了一下:
?
調用了13號中斷,mov入ch,dh等寄存器的數據原來就是這個個斷函數需要傳遞進入的參數。
?
那么什么是扇區,什么是柱頭呢? 看圖吧!
?
含有IPL的啟動區,位于C0-H0-S1(柱面0,磁頭0,扇區1),下一個扇區是C0-H0-S2
所以上面那段程序就是裝載這個扇區。
?
既然讀取了數據,那就要放到內存里啊,否則讀取出來有什么用?但是我們怎么指定放入哪里呢?其實這個地址已經指明了。? ES:BX 就是要載入的地址。也就是0x8200-0x83ff
但是為什么不放入0x8000呢,作者說是留給啟動區的(啟動區不是7c00-7dff嗎?什么鬼!)
?
?
作者又添加了循環寫入的代碼。
利用bios程序錯誤時在flags里返回的數據。
?
看注釋吧。。
??
MOV AX,0x0820MOV ES,AXMOV CH,0 ; 柱面0MOV DH,0 ; 磁頭0MOV CL,2 ; 扇區2readloop:MOV SI,0 ;用來記錄失敗次數的寄存器retry: MOV AH,0x02 ; AH=0x02 : 讀盤MOV AL,1 ; 1個扇區MOV BX,0MOV DL,0x00 ; A驅動器INT 0x13 ; 調用磁盤biosJNC fin ;如果沒有出錯就跳轉到nextADD SI,1 ;錯誤次數加一CMP SI,5 ;和5對比JAE error ;大于等于5就跳轉MOV AH,0x00 ;這一句不懂MOV DL,0X00INT 0X13JMP retry?
? ? ?
?
?
?
Omg,這一章難道全是匯編代碼了嗎?
作者一鼓作氣讀了10個柱頭。
?
?
總于開始著手操作系統的開發了嗎?
?
Fin:
???????? HTL
???????? JMP fin
?
什么,,難道這只是一個只會待機的操作系統???
但是怎么運行他呢?
讓我們來看看makefile里面的修改吧:
?
haribote.img : ipl.bin haribote.sys Makefile
???????? $(EDIMG)?? imgin:../z_tools/fdimg0at.tek \
?????????????????? wbinimg src:ipl.bin len:512 from:0 to:0 \
?????????????????? copy from:haribote.sys to:@: \
?????????????????? imgout:haribote.img
?
其中haribote.sys就是 haribote.nas經過nask編譯后的文件。
雖然不是很懂makefile里面的這些代碼,但應該就是將系統保存到了我們的img磁盤映像里了。
?
或許這樣太抽象那就理解為這樣好了:
???????? 我將磁盤映像寫入到了硬盤了。然后將haribote.sys復制到硬盤里了,然后我又把硬盤做成了硬盤鏡像。
?
?
作者說 0x002600保存的是文件名
???????? ?? 0x002400保存的是文件內容。那就相信他吧。
那么啟動這個操作系統就簡單了。
?
我們根據計算,磁盤上的內容加載到0x8000那么磁盤0x4200處就對應著內存里的0xc200.
但是我又不懂了。
不是只需要在IPL里jmp一下就好了嗎?
為什么又來個ORG 0xc200??
好吧,博主表示搞不懂這里。
?
?
索性不管它了。
?
作者自稱現在程序的前半部分是用匯編寫的,后半部分是C語言寫的。
所以啊,又來了一次大跳躍,扔給我們一個 asmhead.nas
這到底是什么鬼。
?
不管了,先來看看C語言這個部分吧。
那么C語言怎么變成機器語言呢?
好麻煩。。。。。還好他把一系列過程寫到了makefile里面。
?
?
?
體系結構好像有點復雜啊。博主盜了一張圖:
?
?
?
?
好像放著naskfunc不講,有點過不去啊,其實就是有些東西C語言實現不了,使用匯編寫,然后編譯的時候,把naskfunc鏈接到一起。
?
;naskfunc
;TAB=4
?
[FORMAT "WCOFF"] ;制作目標文件的模式
[BITS 32]?????????? ;制作32位模式用的機械語言
?
;制作目標文件的信息
[FILE "naskfunc.nas"] ;源文件名信息
???????? GLOBAL _io_hlt;程序中包含的函數名?? 想在C語言中使用必須用global聲明
?
;以下是實際的函數
[SECTION .text]???? ;目標文件中寫了這些之后再寫程序
?
_io_hlt:??? ;void io_hlt(void);? 要用_開頭
???????? HLT
???????? RET
轉載于:https://www.cnblogs.com/You0/p/4432252.html
總結
以上是生活随笔為你收集整理的30天自制操作系统读书笔记(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在阿里云平台注册一个域名
- 下一篇: 表格控件Aspose.Cells for