今天閒來無事,把於淵的大作《一個操作系統的實現》的第一章又仔細看了一遍.
這裏把實驗過程記錄下來,供後來者參考.
主要參考了
https://www.cnblogs.com/lfri/p/11489223.html
和
https://www.jianshu.com/p/dca5270d7310
兩篇文章裏的步驟.這裏表示感謝.
一、安裝bochs
1、我的硬件環境爲dell筆記本insprion 5580
2、首先在dell上安裝ubutn16.04 lts.過程略
3、下載bochs源碼.地址爲
https://jaist.dl.sourceforge.net/project/bochs/bochs/2.6.11/bochs-2.6.11.tar.gz
4.進入到源碼所在目錄.執行
sudo tar zxvf bochs-2.6.11.tar.gz
cd bochs-2.6.11
5.執行
sudo ./configure --enable-debugger --enable-disasm
注意參數開頭是兩個減號,我第一次實驗的時候就少輸了一個,然後就得到一堆錯誤...
6.此時會自動生成一個Makefile文件
要修改它的內容,把第88行改爲
CXXFLAGS = -std=c++11 -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -pthread $(X_CFLAGS) $(MCH_CFLAGS) $(FLA_FLAGS) -DBX_SHARE_PATH='"$(sharedir)"'
即在右邊的開頭加入編譯選項 -std=c+11,
否則的話下一步的make會編譯不過!
7.執行
sudo make
8執行
sudo make install
9.執行bochs命令如果有輸出,就說明bochs安裝成功
二、寫一個最簡單的loader
1、把隨書源碼中的第一章的boot.asm複製到實驗目錄下,它的內容爲:
org 07c00h ; 告訴編譯器程序加載到7c00處
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 調用顯示字符串例程
jmp $ ; 無限循環
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串長度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 頁號爲0(BH = 0) 黑底紅字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 號中斷
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好爲512字節
dw 0xaa55 ; 結束標誌
2、執行
nasm -o boot.bin boot.asm
編譯成功後會得到一個boot.bin文件
3、執行
bximage
這個命令的功能是製作一個軟盤鏡像文件
選擇1製作軟盤,然後選擇fd,然後剩下的直接回車就好了。現在的工作文件夾下生成一個a.img文件,這就是我們的軟盤了。
如果想用命令行一次生成a.img,可以用下面的命令
bximage -q -mode=create -fd=1.44M a.img
4、執行
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
這是把剛纔寫好的二進制啓動代碼寫入軟盤的引導扇區
5、新建一個bochsrc文件,內容爲:
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=a.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
# log: bochsout.txt
# disable the mouse
mouse: enabled=1
# enable key mapping, using US layout as default.
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
這裏的關鍵點就是要正確設置romimage和vgaromimage的路徑.
6、執行
bochs -q -f bochsrc
如果不加-q參數,運行後可能無法結束虛擬機
7、
然後在終端窗口輸入c,表示真正執行這個虛擬機,就會看到helloword
8、在虛擬機窗口裏用鼠標點右上角的電源圖標,即可關閉虛擬機