1. 構造除錯環境
由於bochs內建除錯功能, 且支援gdb, 用它除錯核心會很方便.
(文章中大部分命令的執行需要root許可權,以sudo方式執行)
1.1 構建磁碟映象
shell**
dd if=/dev/zero of=hd0.img count=$((63*16*100))
用這個命令可以構建乙個50mb左右的磁碟映象, 輸出結果如下:
100800+0 records in
100800+0 records out
51609600 bytes (52 mb) copied, 0.734578 s, 70.3 mb/s
注意count必須為63*16的倍數, 否則bochs識別硬碟會有問題.
1.2 掛載磁碟映象
shell**
losetup /dev/loop0 hd0.img
這個命令可以將檔案繫結到乙個loop裝置. 如果/dev/loop0不存在, 可以嘗試 modprobe loop.
然後進行裝置初始化:
shell**
cfdisk -s63 -h16/dev/loop0
只建立乙個主分割槽就可以. 寫入後, 用命令fdisk檢查結果:
shell**
fdisk -lu /dev/loop0
disk /dev/loop0: 51 mb, 51609600 bytes
16 heads, 63 sectors/track, 100 cylinders, total 100800 sectors
units = sectors of 1 * 512 = 512 bytes
disk identifier: 0x00000000
device boot start end blocks id system
/dev/loop0p1 63 100799 50368+ 83 linux
將分割槽1掛載到/dev/loop1.
shell**
losetup /dev/loop1 hd0.img -o $((63*512))
格式化/dev/loop1為ext3格式.
shell**
mkfs.ext3 /dev/loop1
在mnt下建立img目錄, 做以後維護用.
shell**
mkdir -p /mnt/img
將loop1掛載到/mnt/img
shell**
mount /dev/loop1 /mnt/img/
安裝引導程式. 因為我狂熱傾向於模組化架構, 所以選擇grub2.
本文以grub-1.97~beta3為示例, 讀者可自行安裝其他的引導系統如lilo.
shell**
mkdir /mnt/img/boot
cp -r /usr/lib/grub/i386-pc/ /mnt/img/boot/grub
生成乙個core.img, biosdisk負責讀取磁碟, part_msdos負責處理mbr, ext2負責讀取ext3分割槽.
shell**
cd /mnt/img/boot/grub/
grub-mkimage -o i386-pc -o core.img biosdisk part_msdos ext2
shell**
ls -lh core.img
-rw-r--r--1 root root 25k sep2114:28 core.img
只有區區的25k.. 裡面甚至還包含乙個小的應急shell, 不過作用不大.
安裝grub2到(hd0), 根目錄在(hd0,1)
shell**
echo"(hd0) /dev/loop0" > ./device.map
grub-setup -m ./device.map -d /mnt/img/boot/grub/ -r '(hd0,1)' '(hd0)'
檢查一下安裝成果:
shell**
hexdump -c /dev/loop0 | less
如果你能看到:
shell**
00000180 7d e8 2e00 cd18 eb fe4752554220004765|}.......grub .ge|
00000190 6f 6d004861726420446973 6b00526561|om.hard disk.rea|
就說明安裝成功.
清理一下.
shell**
cdumount /mnt/img
losetup -d /dev/loop1
losetup -d /dev/loop0
1.3 啟動測試.
給上面的hd0.img配乙個bochsrc檔案, 可以拿bochs示例dlxlinux的配置檔案來改, 只需將硬碟換為:
shell**
ata0-master: type=disk, path="hd0.img", cylinders=100, heads=16, spt=63
然後啟動bochs, 順利的話, 你能看到傳說中的grub2 shell.
2. 從啟動到保護模式.
為我們的bochs虛擬機器編譯乙個核心. 不必太複雜, 目前我們只關心啟動部分.
2.1 安裝核心
退出bochs, 掛載hd0.img:
shell**
mount hd0.img /mnt/img/ -o loop,offset=$((63*512))
拷貝bzimage.
shell**
cp /usr/src/linux/arch/i386/boot/bzimage /mnt/img/boot/vmlinuz-3.0.00
這兩個步驟可以放到核心的makefile中, 以後每次編譯完成後, 自動更新到hd0.img裡.
然後將下列配置寫到/mnt/img/boot/grub/grub.cfg
shell**
# timeout for menu
set timeout=10
# set default boot entry as entry0
set default=0
# entry0- load linux kernel
menuentry"linux-3.0.00"
解除安裝/mnt/img, 啟動測試一下, 順利的話, 你能看到乙個panic.
bochs除錯linux 0 11核心
學習作業系統,最難的就是保護模式的各種硬體機制了 如分段分頁定址,特權級,門機制 單純的8086實模下的彙編模擬器是無法模擬,除錯這些機制的。只能用個功能更強大的80 86模擬器了。由於模擬器挺多的,如vmware,virtual box等等,但是好像更方便除錯的,我們選擇bochs吧。趙炯博士已經...
Bochs 除錯技術
bochs 除錯技術 freos hobby os frank wang 中國核芯網 對於任何想嘗試寫自己的作業系統的朋友來說,我都要向你推薦bochs。這個模擬器最大的好處就是可以單步除錯。在沒了解它之間,我在寫freos幾乎是瞎子,進展十分緩慢,特別是在你沒有完成顯示器驅動之前,你可以想象,看不...
bochs除錯技術
bochs除錯技術 除錯模式將出現下列命令列 bochs 1 下面初步說明一下每條指令的用法 執行控制命令 c 繼續執行,遇到斷點將停止 stepi count 執行count條指令,預設為1條 si count stepi的縮寫 step count 執行count條指令,預設為1條 s coun...