本書依靠的教材是於淵的《Orange'S:一個操做系統的實現》linux
實驗環境及工具windows
思路:session
Hello, World
;; 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
能夠直接從Linux軟件倉庫安裝virtualbox。code
把當前用戶加入vboxusers
組:gpasswd -a <username> vboxusers
。blog
啓動virtualbox,可能提示vboxdrv未能成功加載。若是發生這種狀況,須要從新編譯vboxdrv模塊。安裝linux-headers
和dkms
,而後sudo dkms autoinstall
就會編譯生成vboxdrv模塊。
手動執行sudo modprobe vboxdrv
加載vboxdrv模塊,啓動virtualbox應該不會有問題了。
創建一個虛擬機,有沒有硬盤均可以,增長一個軟驅,把咱們的boot.img
加載到軟驅中,啓動虛擬機,成功的話,能夠看到:
virtualbox可能出現的問題:
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
Effective UID is not root
. 解決方法: sudo chmod 4711 /usr/lib/virtualbox/VirtualBox
。
參見: https://www.virtualbox.org/ticket/7889