JAVA程式設計師需要知道的計算機底層基礎10-作業系統載入程式的簡單製作

darkness0604發表於2020-10-25

彙編實現載入程式

編寫彙編碼

; 檔名 boot.asm
 
org 7c00h              ; BIOS讀入MBR(Master Boot Record主開機記錄)後,從0x7c00h處開始執行,所以這裡把程式扔到記憶體的0x7c00h中去
 
; 下面部分和10h有關中斷,10h中斷用來顯示字元
mov ax, cs
mov es, ax
mov ax, msg
mov bp, ax                    ; ES:BP表示顯示字串的地址
mov cx, msgLen                ; CX存字元長度
mov ax, 1301h                 ; AH=13h表示向TTY顯示字元,AL=01h表示顯示方式(字串是否包含顯示屬性,01h表示不包含)
mov bx, 000fh                 ; BH=00h表示頁號,BL=0fh表示顏色
mov dl, 0                     ;int 10h                       ;10h代表顯示器硬體對應的中斷訊號
  
msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg           ; 字串長度
times 510 - ($ - $$) db 0     ; 因為整個程式不足512位元組,需要填充剩餘部分
dw 0aa55h                     ; 魔數,必須有這兩個位元組BIOS才確認是MBR

程式實現的就是一個系統載入程式,在螢幕中輸入一段文字。
可以發現這就是一個硬中斷的簡單實踐,實際上和軟中斷的呼叫過程類似,也是給出引數到對應的暫存器,然後進行中斷操作,由核心做出對應的操作。

編譯

nasm boot.asm -o boot.bin

製作啟動軟盤

1、 生成空白軟盤映象(軟盤大小必須為1.44M,因此bs=1474560 )

dd if=/dev/zero of=floppy.img bs=1474560 count=1

2、製作包含主開機記錄boot.bin的啟動映象檔案(載入程式佔512byte)

dd if=boot.bin of=myos.img bs=512 count=1

3、將第2步生成的bin引導映象檔案複製到空白軟盤中,並在引導映象內容後面的軟盤內容補上空白,成為合適大小的軟盤映象,一共2880個扇區,略過第一個

dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879 

用軟盤啟動系統

1、將myos.img下載到windows
2、VMWare建立空的虛擬機器

  • a、檔案 - 建立新的虛擬機器 - 典型

  • b、稍後安裝作業系統

  • c、其他

  • d、一路next 完成

  • e、虛擬機器設定,去掉CD/DVD選項中“啟動時連線”

  • f、網路,選擇“僅主機模式”,勾選“啟動時連線”(好像無所謂)

  • g、新增軟盤驅動器 使用軟盤映像 找到myos.img

3、啟動虛擬機器

記憶體時模式

記憶體時模式指的是計算器啟動後,記憶體裡存放的內容結構。
在這裡插入圖片描述

從這裡可以發現,作業系統的載入程式確實是在記憶體地址中的07C00H位置上。在這個載入程式之前的記憶體還存放了一些其他的東西,是關於一些例如BIOS自身的資料(例如我怎麼輸入了一串英文,但實質這對計算機來說就是一段01的數,如何讓顯示器可以把這段翻譯成英文顯示? 我猜測BIOS Data Area中就是裝了這個對映的東西。

記憶體從載入程式再向上面看,發現還有一些固定的硬體之類的了。

為什麼載入程式一定在07C00H?

簡單來說,IBM最初約定的是在07C00H,但後續為了相容性,就都統一都放在這個地方了。

參考:https://www.glamenv-septzen.net/en/view/6

相關文章