自制操做系統:引導扇區的實現

本書依靠的教材是於淵的《Orange'S:一個操做系統的實現》linux

實驗環境及工具windows

  • ArchLinux(windows也能夠)
  • 代碼編輯器Emacs(你盡情使用本身喜歡的編輯器)
  • nasm (一個開源的彙編器,能夠從sourceforge下載,也能夠從Linux發行版的軟件倉庫安裝)

思路:session

  • 寫一段彙編代碼,輸出 Hello, World
  • 將該段代碼寫入軟盤鏡像的第一個扇區
  • 安裝virtualbox建立一個操做系統,從軟盤鏡像引導,查看結果

引導區代碼

;; BIOS會把512字節的引導扇區加載到 0000:7c00 處,
    ;; 而後跳轉到0000:7c00處,將控制權交給引導代碼。
    org 07c00h                  ;這一行告訴編譯器,咱們的代碼將被加載到7c00處。
    mov ax, cs                  ;將代碼段寄存器的值送入AX
    mov ds, ax                  ;將數據段的地址置爲代碼段的地址?
    mov es, ax                  ;將附加段的地址置爲代碼段的地址?
    call  DispStr               ;調用顯示字符串例程
    jmp $                       ;無限循環, $表示當前行編譯後的地址
    ;; 以上就是整個程序的執行過程了
    ;; 下面是DispStr子程序
DispStr:
    mov ax, BootMessage         ;將字符串首地址傳給寄存器ax
    mov bp, ax                  ;CPU將用ES:BP來尋址字符串
    mov cx, 16                  ;經過CX,CPU知道字符串的長度
    mov ax, 01301h              ;AH=13表示13號中斷, AL=01H,表示目標字符串僅僅包含字符,屬性在BL中包含,移動光標
    mov bx, 000ch               ;黑底紅字, BL=0CH,高亮
    mov dl, 0                   ;dh表示在第幾行顯示,dl表示第幾列顯示
    int 10h                     ;BIOS的10H中斷的13號中斷用於顯示字符串
    ret
BootMessage:    db "Hello, OS world!" ;對NASM來說,標號和變量的做用同樣, db表示define byte
    ;; $當前行被彙編後的地址,$$表示一個section開始處的地址,本程序只有一個section,因此指0x7c00
    times 510-($-$$) db 0           ;填充剩下空間,使生成的二進制剛好爲512字節
    dw 0xaa55                       ;結束標誌,若是發現扇區以0xAA55結束,則BIOS認爲它是一個引導扇區,dw表示define word

關於中斷顯示字符串的細節,可參見使用BIOS中斷顯示字符串筆記(int 10h 13號中斷)編輯器

編譯生成二進制

須要nasm。若是你使用Linux,能夠直接從軟件倉庫安裝。
nasm便可以從彙編代碼生成目標代碼,也帶了一個反彙編工具ndisasm, 能夠從目標代碼生成彙編代碼。工具

編譯咱們的扇區代碼生成二進制:spa

nasm boot.asm -o boot.bin

寫入軟盤的第一個扇區

咱們用軟盤鏡像來模擬軟盤。操作系統

dd if=/dev/zero of=emptydisk.img bs=512 count=2880 #生成空白軟盤鏡像文件
dd if=boot.bin of=boot.img bs=512 count=1 #用 bin file 生成對應的鏡像文件
dd if=emptydisk.img of=boot.img skip=1 seek=1 bs=512 count=2879 #在 bin 生成的鏡像文件後補上空白,成爲合適大小的軟盤鏡像

這樣,咱們引導系統用的虛擬軟盤就準備好了。.net

安裝virtualbox,創建系統

能夠直接從Linux軟件倉庫安裝virtualbox。code

把當前用戶加入vboxusers組:gpasswd -a <username> vboxusersblog

啓動virtualbox,可能提示vboxdrv未能成功加載。若是發生這種狀況,須要從新編譯vboxdrv模塊。安裝linux-headersdkms,而後sudo dkms autoinstall就會編譯生成vboxdrv模塊。

手動執行sudo modprobe vboxdrv加載vboxdrv模塊,啓動virtualbox應該不會有問題了。

創建一個虛擬機,有沒有硬盤均可以,增長一個軟驅,把咱們的boot.img加載到軟驅中,啓動虛擬機,成功的話,能夠看到:

扇區引導的效果

virtualbox可能出現的問題:

  1. Failed to open a session for the virtual machine a. Failed to load VMMR0.r0 (VERR_SUPLIB_OWNER_NOT_ROOT). Unknown error creating VM (VERR_SUPLIB_OWNER_NOT_ROOT). 解決方法:sudo chown -R root:root /usr/lib/virtualbox

  2. Effective UID is not root. 解決方法: sudo chmod 4711 /usr/lib/virtualbox/VirtualBox

參見: https://www.virtualbox.org/ticket/7889

參考文章:

Hacking 《本身動手寫操做系統》Chapter 1&2

相關文章
相關標籤/搜索