一步步编写操作系统 24 编写内核加载器
這一節的內容并不長,因為在進入保護模式之前,我們能做的不多,loader是要經過實模式到保護模式的過渡,并最終在保護模式下加載內核。本節只實現一個簡單的loader,本loader只在實模式下工作,等學習了保護模式后,我們再來個真格的。
由于本節較容易,沒有新知識,直接上菜啦,見代碼
1 %include "boot.inc"2 section loader vstart=LOADER_BASE_ADDR34 ; 輸出背景色綠色,前景色紅色,并且跳動的字符串"1 MBR"5 mov byte [gs:0x00],'2'6 mov byte [gs:0x01],0xA4 ; A表示綠色背景閃爍,4表示前景色為紅色78 mov byte [gs:0x02],' '9 mov byte [gs:0x03],0xA41011 mov byte [gs:0x04],'L'12 mov byte [gs:0x05],0xA41314 mov byte [gs:0x06],'O'15 mov byte [gs:0x07],0xA41617 mov byte [gs:0x08],'A'18 mov byte [gs:0x09],0xA41920 mov byte [gs:0x0a],'D'21 mov byte [gs:0x0b],0xA42223 mov byte [gs:0x0c],'E'24 mov byte [gs:0x0d],0xA42526 mov byte [gs:0x0e],'R'27 mov byte [gs:0x0f],0xA42829 jmp $ ; 通過死循環使程序懸停在此對這個loader中的代碼,大家是否覺得好親切、毫無壓力呢。這和咱們最初的那個MBR好接近,不同的是,在這個loader中,打印的字符串是“2 loader”。
本loader程序第2行代碼用到了LOADER_BASE_ADDR,所以在第1行中把boot.inc包含進來了,其值是0x900。其它代碼就不用講啦。
編譯nasm -I include/ -o loader.bin loader.S回車
將生成的loader.bin寫入硬盤第2個扇區。第0個扇區是MBR,第1個扇區是空的未使用,原因如前所述,純粹個人喜好。
dd if=./loader.bin of=/此處替換成你的安裝目錄/bochs/hd60M.img bs=512 count=1 seek=2 conv=notrunc回車,下面是dd命令的三行輸出。
記錄了0+1 的讀入
記錄了0+1 的寫出
98字節(98 B)已復制,8.9113e-05 秒,1.1 MB/秒
可見,我們的loader.bin只有98字節,遠遠小于64k。
小激動的時刻到了,我們該運行bochs來驗證了。如果程序正確的話,MBR會跳轉到loader.bin去運行,屏幕上會顯示“2 loader”。
啟動虛擬機,執行。效果如圖
?
這次我只抓了一張圖,但我人格保證這是跳動的字符,大家在自己的虛擬機上體驗體驗吧。
Loader剛剛開了個頭,馬上就要和大家暫別了。因為這個loader目前還沒有實際意義,目前只是來驗證MBR和loader的接力是否成功,它最終的任務是要加載內核。可是內核是運行在32位保護模式環境下,我們當前還在實模式下呢。首先咱們得知道什么是保護模式,其次還得想辦法進入到保護模式,前面的路還很遠。
好啦,本章到此告一段落,等我們學習保護模式后,我們還會回來繼續改進loader。
【再續】
本內容摘自《操作系統真象還原》,請大伙兒支持正版,多謝多謝。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 24 编写内核加载器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡逾期了没钱还款怎么办
- 下一篇: Struts1工作原理