環境: WSL(window下linux子系統) Ubuntu18 使用Bochs來模擬系統
於淵老師的第一個程序差點就把我困住了 T_T
在這裏做筆記, 文中加了❓的地方表示還沒懂, 先不深究, "囫圇吞棗"一下, 看到後面再回來解決
代碼
show me the code!
先寫個彙編
; file_name: boot.asm
org 07c00h ; 告訴編譯器程序加載到7c00處, 規定程序的起始地址(偏移地址)在7c00,
mov ax, cs
mov ds, ax ;
mov es, ax ; 代碼段數據段附加段在同一個段 ?可以去掉嗎
call DispStr ; 調用顯示字符串
jmp $ ; 無限循環
; 以上就是主體部分了
DispStr:
mov ax, message
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
message: db "Hello, Js world!" ; 字符串+回車換行
times 510-($-$$) db 0 ; 填充剩下的空間,使得到這裏二進制代碼有510字節
dw 0xaa55 ; 結束標誌, 最後兩個字節是 aa55 纔是符合要求的引導程序, 代碼共計512字節
$
: 彙編後 當前行的地址$$
: 彙編後 一個節(section)開始處的地址$-$$
: 本行距離本節開始處的相對距離(這段代碼只有一節, 所以就是程序的開頭)
操作步驟
製作鏡像文件
- 準備好
boot.asm
後, 編譯成boot.bin
$ nasm boot.asm -o boot.bin
- 製作512字節的鏡像文件
boot.img
$ dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
寫Bochs的配置文件
使用自己的bochs配置文件, 不用默認的
# file_name: bochsrc
##############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin
# what disk images will be used
floppya: 1_44=boot.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
- 注意
romimage
vgaromimage
路徑要根據自身情況做修改, 否則可能會報錯couldn't open ROM image file
floppya
之後的文件名也要按自己的情況修改
啓動
- 在window中啓動 VcXsrv (XLanuch) 安裝看這裏 link
- 在命令行中運行
$ bochs -f bochsrc
- 順利的話可以看到
- 輸入 b 0x7c00 (在0x7c00處設置斷點)
- 輸入 c (讓代碼執行), 再輸入c
最後看到
成功了!
計算機做的事情
- 計算機檢查軟盤的0面0磁道1扇區, 如果發現它以0xaa55結束(一個特殊的標記), 則BIOS把它當成引導扇區
- 512字節的內容被轉載到內存 0000:7c00 處 ?爲什麼是7c00
- 跳轉到 0000:7c00 處, 將控制權交給這段引導代碼, CPU開始執行代碼邏輯
可能出現的錯誤情況
Message: dlopen failed for module ‘x’: file not found
沒有圖形界面的模塊, 看這裏 link
好命令和附錄
- 反彙編
$ ndisasm -o 0x7c00 boot.bin >> disboot.asm
- bochs 調試指令
reference
- https://blog.csdn.net/hdxxjhuahuo/article/details/78234996
- <<oranges: 一個操作系統的實現>>