一:以硬盘方式启动bochs
1.准备工作:安装计算机硬件模拟器:
1.1 安装bochs编译环境(即bochs运行所需要的环境):
安装C/C++的编译环境【gcc以及g++】,
sudo apt-get install build-essential
安装图形化的bochs【模拟显卡等硬件】
sudo apt-get install xorg-dev
安装依赖库
sudo apt-get install libgtk2.0-dev
1.2安装bochs和bochs-x软件
apt install bochs
sudo apt-get install bochs-x
sudo apt-get install bochs-sdl
终端输入bochs,弹出bochs的启动配置文件。按6便可直接启动bochs,启动成功会弹出bochs x86-64 emulator 的窗口
bochs的官网:http://bochs.sourceforge.net/
1.3 创建映像文件:
(我是在根目录home/lmj下创建的映像文件dimos.img)
dd if=你的镜像路径(即编译得到的boot.bin的路径) of=dimos.img
1.4编写系统启动的驱动程序(一般都是用汇编语言来写的,这里也不例外)
找个目录新建: touch boot.asm 编辑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 = 13h, 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 ;结束标志
代码解释:
这是一个简单的引导扇区程序。
可能有些同学会有疑问——为什么第一句要用org指令将我们的代码定位到7C00H处。这是因为,当计算机电源被打开时,它会先进行加电自检(POST),然后寻找启动盘,如果是选择从软盘启动(我们的设置就是从软盘启动),计算机就会检查软盘的0面0磁道1扇区,如果它以0xAA55结束(正是我们上面代码的结束标志),则BIOS认为它是一个引导扇区。一旦BIOS发现了引导扇区,就会将这512字节的内容装载到内存地址0000:7C00处,然后跳转到0000:7C00处将控制权彻底交给这段引导代码(这就是原因)。到此,计算机不再由BIOS中固有的程序来控制,而变成有操作系统的一部分来控制。
---------------------
作者:尚书左仆射
来源:CSDN
原文:https://blog.csdn.net/wzxq123/article/details/53009730
版权声明:本文为博主原创文章,转载请附上博文链接!
这是汇编语言:需要编译成机器语言(即可执行程序),这里我们使用nasm编译工具
我们把这段代码用NASM编译一下:
1 |
|
如果没有安装NASM,可以用如下命令进行安装:
1 |
|
编译完成后,会在当前目录生成一个512字节的boot.bin文件。
1.5将驱动程序放入刚才创建的硬盘里:
使用dd命令将它写进刚刚创建的软盘映像a.img的第一个扇区:
1 |
|
启动:
将boot.bin ,dimos.img移动到bochs的安装目录:
bochs -f /usr/share/bochs/bochsrc.bxrc
其中bochsrc.bxrc的配置文件如下:
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# 对应真实机器的BIOS和VGA BIOS
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
# 设置bochs使用的磁盘,软盘使用关键字floppya,硬盘使用disk
# 若有多个软盘,可写floppya,floppyb
#floppya: 1_44=a.img, status=inserted
# choose the boot disk.
# 默认是软盘,注释掉,改为disk
#boot: floppy
boot: disk
# where do we send log messages?
log: /tmp/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
keyboard:keymap=/usr/share/bochs/keymaps/sdl-pc-us.map
#keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/sdl-pc-us.map
display_library: sdl
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#这一句是根据bximage生成的,后面会解释。
ata0-master: type=disk, path=/usr/share/bochs/dimos.img, mode=flat, cylinders=121, heads=16, spt=63
#ata0-master: type=disk, path="/usr/share/bochs/dimos.img", mode=flat, cylinders=121, heads=16, spt=63
下面谈谈以上过程中遇到的问题:
1.Message: ata0-0: specified geometry doesn't fit on disk image
2.00000000000e[ ] /usr/share/bochs/bochsrc.bxrc:29: 'keyboard_mapping' will be replaced by new 'keyboard' option.
解决:
请参考文章:=================如何配置并启动bochs
https://blog.csdn.net/ByChen623/article/details/53619084
bochs启动原理:(如何突破512字节):
https://blog.csdn.net/cielozhang/article/details/6171783
备注:如果硬盘方式启动失败,可尝试第二节的软盘方式启动。
二:以软盘方式启动bochs:
2.1 在bochs的安装目录下:创建 a.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 = 13h, 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.2 编译成二进制文件: sudo nasm a.asm -o a.bin
2.3 创建操作系统的软盘:bximage (将hd改为fd,软盘名称设为a.img,其他的默认即可)
2.4 创建bochs的启动配置文件:
vi .bochsrc 文件内容如下:
megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
#floppya: 1_44=a.img, status=inserted 1_44 image="/home/lmj/文档/dimos/a.img"
floppya: 1_44="a.img", status=inserted
boot: floppy
log: bochsout.txt
mouse: enabled=0
keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map
2.5 将驱动程序写入软盘中:sudo dd if=a.bin of=a.img
2.6.下面是我的完整运行过程图:
备注:输入完 bochs -f .bochsrc 后并不会马上弹出hello world,因为我们是用调试模式打开的,所以需要接着输入c,让程序继续往下运行
三:常见错误及解决方案:
3.1 参考这篇博文:总结的很全面。
https://blog.csdn.net/zhaodedong/article/details/51082128
3.2 我出现的问题是:启动后出现无启动设备的错误。
Boot failed: not a bootable device.
FATAL:No bootable device.
我把编译文件a.asm的代码删除之后,在网上又找了一份bochs启动的代码。复制编译,重新dd进软盘就ok了
3.3最后再说一下:bochs的配置文件.bochsrc要注意的问题
megs: 32 #虚拟一个32的计算机
romimage: file=$BXSHARE/BIOS-bochs-latest #要加上file= (该文件在bochs的安装目录下,这里是文件的相对路径,$BXSHARE他会自动找到你的安装目录,不需要你去配置)
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest #同上
#floppya: 1_44=a.img, status=inserted 1_44 image="/home/lmj/文档/dimos/a.img"
floppya: 1_44="a.img", status=inserted #这是配置软盘的映像文件的位置,这是相对路径,a.img的位置相对与.bochsrc文件而言,因为我的a.img与.bochsrc位于统一目录,所以这里配成a.img,我的bochs版本是2.6,所以要用1_44="a.img",不能用image=“”
boot: floppy #操作系统的启动方式:这里是软盘驱动的方式启动
log: bochsout.txt
mouse: enabled=0
keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map #固定配置,不用改,跟我的配置相同就可以了
今天就写到这里。