前言
这一篇文章中,我们尝试使用编写引导代码,然后配置bochs让其可以运行这份代码,过程中遇到的问题,为什么这么做,我会尽可能详细的描述给大家,当然自己可能存在错误,请见谅!!
安装 nasm 编译器
下载地址: https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/

编写启动引导代码
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db "Hello, OS"
times 510 - ($-$$) db 0
dw 0xaa55
使用nasm将汇编代码编译成bin(二进制)文件
nasm boot.asm -o boot.bin
使用IDA逆向工具来分析这个boot.bin文件

如上是汇编代码与使用IDA反汇编的对比图,注意在启动IDA时会出现一个界面,其存在16位32位两种模式,我们要选择"否",使用16模式来反汇编,才能得到正确的反汇编代码。从反汇编代码角度看,其都是相对地址,没有什么需要分析的。

-------------------------------------
备注:这里其实不需要用IDA来分析,也没啥分析的,但是之后我们都会尝试使用二进制分析工具来分析某些文件,来看看里面到底写了什么。
---------------------------------------
用bximage生成一个软盘映象
下面我们来使用bochs提供的bximage工具来生成一个"软盘映像",当bochs编译成功,其会生成 .\bochs\obj-debug 目录,里面存放着编译后的文件,在该目录下存在一个 bximage.exe工具。

之后,为了搞清这个生成的软盘映像(a.img)中有什么,我们使用010editor打开这个磁盘,发现其就是创建了一个1.44M大小的文件,里面使用0填充什么也没写!!

当然,其项目如下,感兴趣可以看这个源码,当然因为这里直接全填充0,也没什么好看的(至少现在是这样,未来可能回头来看这份代码,谁知道呢。)

使用 dd.exe 将 启动代码(boot.bin)写入软件映像(a.bin)中
在Windows下没有dd指令,该指令在Linux下可以将一个文件写入另一个文件中。看其他博客大多数使用cgywin工具(相当于Windows平台下小型linux工具集)中的dd.exe,这个下载有点麻烦,我们选择使用 "dd for windows"这个工具,直接百度或Google下载即可。
使用 dd for windows,命令如下,将 boot.in 写入到 a.img 文件下.
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

写入完成之后使用IDA打开,看着确实已经写入进去了。

编写bochs的配置文件,让其启动软盘(a.img)
编写配置文件可能是新手最痛苦的一个步骤,本来就不太会用还需要设置各种花里胡哨的参数,而且bochs网上的配置文件一般都是2.6.8版本,有些许改动,新手面对这个可能束手无策,照着网上的一顿copy可能会出错,这里我先给出2.6.11版本的正确配置文件,你需要正确配置你的机器上的绝对路径,所有注意事项已经在配置文件的开头标记出!!!
###############################################################
# bochs-2.6.11 版本的配置文件
# 注意:
# 1.在 romimage vgaromimage keyboard 中使用绝对路径,
# 如果使用默认的$BXSHARE可能会出现问题(我的就出现了问题,路径不对),
# 如果出现问题,使用绝对路径,其要使用的三个路径如下:
# romimage --> bochs\bios\BIOS-bochs-latest
# vgaromimage --> bochs\bios\VGABIOS-lgpl-latest
# keyboard --> bochs\gui\keymaps\x11-pc-us.map
#
# 2. bochs识别的路径分隔符是使用 '/' (Linux版本),而Windows版本的是 '\',
# 如果Windows环境下直接复制粘贴路径,则默认是'\',bochs识别错误,
# 不修改的话会引起路径错误。
# 所以,一定要修改 '\' 为 '/'!!!!
#
###############################################################
# This option sets the 'guest' and 'host' memory parameters to the same value.
megs: 32
# The ROM BIOS,负责BIOS启动的,我们这里直接使用系统自带的,后期或许可以自己编写BIOS来启动。
romimage: file= D:/code/bochs-project/bochs-src/bios/BIOS-bochs-latest
# A VGA BIOS, 应该是显示接口,使用系统自带的。
vgaromimage: file= D:/code/bochs-project/bochs-src/bios/VGABIOS-lgpl-latest
# what disk images will be used
# 填写我们之前编写的软盘路径。
floppya: 1_44=D:/code/bochs-project/code/2-boot_code/a.img, status=inserted
# choose the boot disk.
# 这里设置软盘启动,与上面对应。
boot: floppy
# where do we send log messages?
# 这个暂时不需要启动日志输出,记得这个输出文件相当大。
# log: bochsout.txt
# disable the mouse, since Finix is text only
# 不需要键盘,我们现在只是文本启动。
mouse: enabled=0
# enable key mapping, using US layout as default.
# 使用系统自带的键盘设置。
keyboard: keymap=D:/code/bochs-project/bochs-src/gui/keymaps/x11-pc-us.map
当你按照上面所讲正确配置好自己的"绝对路径"之后,按下面这个操作,bochs成功运行我们所编译的文件。

但是,如果上面配置文件不正确,别慌,耐心看bochs所显示的内容,如下图是我在配置过程中出现的错误,然后 bochs关于配置的官方文档 在这里耐心查看自己的错误(我的设置很简洁了,没有太复杂的额外设置,应该不会出错)。

687




被折叠的 条评论
为什么被折叠?



