1. ubuntu下bochs源码编译安装
用apt-get install 安装的bochs是不带调试功能的,所以需要源码重新编译安装bochs
1.1 源码编译
1.2 配置bochsrc文件
注意: 上面硬盘的路径固定放在/work/os/code/disk.img下
1.3 配置脚本运行bochs
注意: 上面bochs的启动脚本也是固定路径,所以这些东东配置完成后就不能够再改路径了
2. 测试
2.1 测试程序
2.2 Makefile
2.3 编译及烧写
2.4 运行
此时bochs的gui界面卡住了。
注: 如果mbr.S中没有写对,例如把0xaa55写成了0x55aa,make flash之后会出现: No bootable device.
2.5 代码下载
1mbr.rar(下载后改名为1mbr.tar.gz)
bochsrc.rar (
下载后改名为bochsrc.tar.gz
)
3. 加几个字符
3.1 打印几个字符
3.2 配置好后,编译及运行就相当简单了
附录:
1. 每次运行bochs时都会在当前目录下生成bochsout.txt
改 bochsrc的L761: 将bochsout.txt --> log: /tmp/bochsout.txt
这样每次运行bochs时会bochsout.txt就放在了/tmp目录下
用apt-get install 安装的bochs是不带调试功能的,所以需要源码重新编译安装bochs
1.1 源码编译
- cong@msi:/work/os/bochs-2.6.8$ mkdir install -->将install后的bochs放在这个目录下
- cong@msi:/work/os/bochs-2.6.8$ ./configure --prefix=`pwd`/install --enable-debugger --enable-disasm -->配置成可调试
- cong@msi:/work/os/bochs-2.6.8$ make -j16 && make install
- cong@msi:/work/os/bochs-2.6.8$ ls install
- bin share
-
- cong@msi:/work/os/bochs-2.6.8$ cd install/bin/
- cong@msi:/work/os/bochs-2.6.8/install/bin$ ls -->编译安装完成后会在install目录下生成bochs及bximage这两个文件
- bochs bximage
- cong@msi:/work/os/bochs-2.6.8/install/bin$ cp -arf ../share/doc/bochs/bochsrc-sample.txt .
- cong@msi:/work/os/bochs-2.6.8/install/bin$ diff ./bochsrc bochsrc-sample.txt
- 186,187c186
- < #cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
- < cpu: model=pentium, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
- ---
- > cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
- 715,716c714
- < #ata0-master: type=disk, mode=flat, path="30M.sample"
- < ata0-master: type=disk, mode=flat, path="/work/os/code/disk.img"
- ---
- > ata0-master: type=disk, mode=flat, path="30M.sample"
- 909c907
- < #sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
- ---
- > sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
- 920c918
- < #speaker: enabled=1, mode=sound
- ---
- > speaker: enabled=1, mode=sound
1.3 配置脚本运行bochs
- cong@msi:/work/os/bochs-2.6.8/install/bin$ cd /usr/local/bin/
- cong@msi:/usr/local/bin$
- cong@msi:/usr/local/bin$ cat bochs
- #!/bin/sh
- /work/os/bochs-2.6.8/install/bin/bochs -f /work/os/bochs-2.6.8/install/bin/bochsrc
2. 测试
2.1 测试程序
- cong@msi:/work/os/code/1mbr$ cat mbr.S --> 只有4行
- org 0x7C00
- jmp $
- times 510-($-$$) db 0
- dw 0xaa55
- ; dw 0x55aa
- cong@msi:/work/os/code/1mbr$ cat Makefile
- mbr:
- nasm mbr.S -o mbr.bin
- flash:
- -rm ../disk.img -->前面加-的作用是如果disk.img不存在,rm执行出错也不会影响下面的操作
- dd if=/dev/zero of=../disk.img bs=1M count=30
- dd if=./mbr.bin of=../disk.img bs=512 count=1 conv=notrunc
- cong@msi:/work/os/code/1mbr$ make
- nasm mbr.S -o mbr.bin
- cong@msi:/work/os/code/1mbr$ file ./mbr.bin
- ./mbr.bin: x86 boot sector -->file能正确的识别出这是一个boot sector就说明成功了
-
- cong@msi:/work/os/code/1mbr$ make flash
- rm ../disk.img
- rm: cannot remove ‘../disk.img’: No such file or directory -->这个rm删除错误不影响下面的指令
- make: [flash] Error 1 (ignored)
- dd if=/dev/zero of=../disk.img bs=1M count=30
- 30+0 records in
- 30+0 records out
- 31457280 bytes (31 MB) copied, 0.0154234 s, 2.0 GB/s
- dd if=./mbr.bin of=../disk.img bs=512 count=1 conv=notrunc
- 1+0 records in
- 1+0 records out
- 512 bytes (512 B) copied, 7.6391e-05 s, 6.7 MB/s
- cong@msi:/work/os/code/1mbr$ bochs
- ========================================================================
- Bochs x86 Emulator 2.6.8 -->注意apt-get install 安装的是2.4.*,源码安装的是2.6.8
- Built from SVN snapshot on May 3, 2015
- Compiled on Aug 15 2016 at 15:49:17
- ========================================================================
- 00000000000i[ ] BXSHARE not set. using compile time default '/work/os/bochs-2.6.8/install/share/bochs'
- 00000000000i[ ] reading configuration from /work/os/bochs-2.6.8/install/bin/bochsrc -->这个是配置的bochsrc路径
- 00000000000e[ ] /work/os/bochs-2.6.8/install/bin/bochsrc:716: ataX-master/slave CHS set to 0/0/0 - autodetection enabled
- ------------------------------
- Bochs Configuration: Main Menu
- ------------------------------
-
- This is the Bochs Configuration Interface, where you can describe the
- machine that you want to simulate. Bochs has already searched for a
- configuration file (typically called bochsrc.txt) and loaded it if it
- could be found. When you are satisfied with the configuration, go
- ahead and start the simulation.
-
- You can also start bochs with the -q option to skip these menus.
-
- 1. Restore factory default configuration
- 2. Read options from...
- 3. Edit options
- 4. Save options to...
- 5. Restore the Bochs state from...
- 6. Begin simulation
- 7. Quit now
-
- Please choose one: [6]
- 00000000000i[ ] installing x module as the Bochs GUI
- 00000000000i[ ] using log file bochsout.txt
- Next at t=0
- (0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0
- <bochs:1> b 0x7C00 -->在0x7C00处设断点
- <bochs:2> c
- (0) Breakpoint 1, 0x00007c00 in ?? ()
- Next at t=156815929
- (0) [0x000000007c00] 0000:7c00 (unk. ctxt): jmp .-2 (0x00007c00) ; ebfe
- <bochs:3>

注: 如果mbr.S中没有写对,例如把0xaa55写成了0x55aa,make flash之后会出现: No bootable device.
2.5 代码下载


3. 加几个字符
3.1 打印几个字符
- cong@msi:/work/os/code/1mbr$ cat mbr.S
- org 0x7C00
- mov ax, cs
- mov ds, ax
- mov es, ax
- mov ss, ax
- mov ax, 0xb800
- mov gs, ax
-
-
- mov byte [gs:0x00], '1'
- mov byte [gs:0x01], 0xA4
-
- mov byte [gs:0x02], ' '
- mov byte [gs:0x03], 0xA4
-
- mov byte [gs:0x04], 'M'
- mov byte [gs:0x05], 0xA4
-
- mov byte [gs:0x06], 'B'
- mov byte [gs:0x07], 0xA4
-
- mov byte [gs:0x08], 'R'
- mov byte [gs:0x09], 0xA4
-
- jmp $
- times 510-($-$$) db 0
- dw 0xaa55
- cong@msi:/work/os/code/1mbr$ make -->编译
- nasm mbr.S -o mbr.bin
- cong@msi:/work/os/code/1mbr$ make flash -->刷到disk.img中
- rm ../disk.img
- dd if=/dev/zero of=../disk.img bs=1M count=30
- 30+0 records in
- 30+0 records out
- 31457280 bytes (31 MB) copied, 0.0179666 s, 1.8 GB/s
- dd if=./mbr.bin of=../disk.img bs=512 count=1 conv=notrunc
- 1+0 records in
- 1+0 records out
- 512 bytes (512 B) copied, 8.0688e-05 s, 6.3 MB/s
- cong@msi:/work/os/code/1mbr$ bochs -->这儿运行的是从源码编出来的bochs
附录:
1. 每次运行bochs时都会在当前目录下生成bochsout.txt
改 bochsrc的L761: 将bochsout.txt --> log: /tmp/bochsout.txt
这样每次运行bochs时会bochsout.txt就放在了/tmp目录下