虚拟机平台我选择的是VMWare
优点:功能较全(可以复制粘贴,拖拽文件等等)
缺点:相比于VirtualBox,确实臃肿了一点,大家自己权衡
OS的话我选择的是CentOS7(x86_64)的iso
CentOS用的是yum,Ubuntu用的是apt-get
//用 ubuntu则把yum 换成apt-get
sudo yum -y install gcc
sudo yum -y install gtk2 gtk2-devel
sudo yum -y install libXt libXt-devel
sudo yum -y install libXpm libXpm-devel
sudo yum -y install SDL SDL-devel
sudo yum -y install libXrandr-devel.x86_64
sudo yum -y install xorg-x11-server-devel
(这里-y的意思是默认选择yes,不然你安装时要手动输入y)
你也可以试着下下来后自己make,看报错,缺什么补什么,当然想科比也彳亍
比如在下的安装包: bochs-2.6.10.tar.gz
tar zxvf bochs-2.6.10.tar.gz
然后cd进入解压出来的bochs-2.6.10
cd bochs-2.6.10
在命令行窗口输入如下指令,#代表注释可以不写,
每行意思看《真象还原》(代码也是里面扣出来的)
# \符号表示换行接着写,不然就连着一行写也行
./configure \
# 这里把bochs放在目录"$HOME/BOCHS/bochs"下,如果不想折磨自己,建议完全跟我的路径
# 也可以自定义路径,按着下面的套路套过去就行
--prefix=$HOME/BOCHS/bochs \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11
1.上面的是在终端输入的!!!每行输入上面所对应的一行
2.#是注释,就不要输入了
3.每一行和 \ 之间有空格,同时 \ 也需要输入!因为在linux系统中,最后加入\,就表示可以换行输入命令,不然你输入一行直接按回车的话就会直接完成命令的输入,下面的就无法一起输入了!
4.第二行,即prefix那一行,表示你想把安装后的bochs放在哪里,我这里放在家目录下Downloads里面,即和bochs2.7安装包放在一起。
5.最后那一行就不需要加 空格\ 了
在上面安装的时候可能有如下问题:
fatal error: X11/Xlib.h: No such file or directory
Ubuntu 编译提示 configure: error: no acceptable C compiler found in $PATH
按照上面的步骤安装即可
成功结果大致如下(就是没有报错就是成功),中间可能各种bug,无法预测,缺什么查什么。
之后接着当前命令窗输入make
make
这个过程会有点慢
完成之后,看是否有错误 ,出现一堆warning:不用管
//因为我是用户账号来输入的,没有切换到root账号,所以需要sudo来以管理员
//的权限运行,以后所有语句没有权限时 都加上sudo 就好
sudo make install
退出到最外层目录,然后进入刚刚创建的BOCHS/bochs/bin目录
输入如下命令
//没有权限就加上sudo
./bochs
此时我们的思路:bochs装好了,
1.先创建配置文件.disk,
2.然后创建.img硬盘
3.创建.asm(或者.S)的bios代码
4.把bios代码加载进.img硬盘
5.运行测试完成
当前我们在bin目录,并且我们之后所有新建文件都放在这个bin里面
//.disk的文件名自定义,叫什么无所谓
//gedit是ubuntu的类似vim的文本编辑器
sudo gedit bochsrc.disk
在文本编辑器输入如下内容,并保存
如下路径可以根据你自己的需要修改,里面的每行的意思还是去看《真象还原》,下面代码从那里扣下来并把过时的报错内容改了之后得到
# 设置bochs在运行中能够使用的内存,我这里设置32MB
megs:32
# 设置真实机器所对应的BIOS和VGA BIOS
# 这里的路径是按照我上面讲的那两个重要文件的路径来的
# 如果你和我路径不一样,不要直接抄我的!
romimage:file=/home/你的名字/BOCHS/bochs/share/bochs/BIOS-bochs-latest
vgaromimage:file=/home/你的名字/BOCHS/bochs/share/bochs/VGABIOS-lgpl-latest
# 选择启动磁盘,我这里是选择以硬盘启动
# 如果你想按照软盘启动的话则boot: floppy
boot:disk
# 设置日志文件输出路径
log:bochs.out
# 关闭鼠标
mouse:enabled=0
# 键盘映射配置
keyboard:keymap=/home/你的名字/BOCHS/bochs/share/bochs/keymaps/x11-pc-us.map
# 磁盘设置
ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
# 启动盘信息hd60M.img,下面的hd60M.img为我们启动硬盘
# 我们之后创建的启动硬盘必须放在该路径下且必须同名
# 下面的path也可以写成path="hd60M.img",不过要求你的hd60M.img在bin文件夹下
ata0-master:type=disk,path="hd60M.img",mode=flat,cylinders=121,heads=16,spt=63
然后我们在bin目录下输入./bochs ,
./bochs
再输入6开始模拟
看到如下界面,再输入c
输入c后出现如下错误提示就是正确的
因为还没创建.img硬盘模拟文件,接下来开始创建
//在bin目录下输入
./bximage -hd -mode="flat" -size=60 -q hd60M.img
出现如下问题就果断选方式二:
Unknown option: -hd
在bin目录下输入./bximage,然后按提示操作
./bximage
得出如下结果就是成功:请直接抄,免得折磨自己
输入ls结果如下
.asm和.S区别不大,都是汇编后缀,用.S和.asm后缀都可以,下面用.asm后缀为例,用.S结果一样,操作步骤一样,没有区别。
5.1输入如下创建.asm文件(.S后缀效果一样,如果用.S之后文件后缀保持一致都是.S就行)
//文件名可以自定义 无所谓,只有你记得之后一直用这个名字就行
sudo gedit mbr.asm
在.asm文件中输入如下
第一种代码是《真象还原》的原版代码,第二种是如果第一种不行的替代代码,两者的效果一样。建议先试第一种书里面的代码。不行再换
1.第一种代码由书里扣出来,如下: 可以按规律修改或补充打印字符"1 MBR"
;主引导程序
;
;LOADER_BASE_ADDR equ 0xA000
;LOADER_START_SECTOR equ 0x2
;------------------------------------------------------------
SECTION MBR vstart=0x7c00
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00
mov ax,0xb800
mov gs,ax
; 清屏
;利用0x06号功能,上卷全部行,则可清屏。
; -----------------------------------------------------------
;INT 0x10 功能号:0x06 功能描述:上卷窗口
;------------------------------------------------------
;输入:
;AH 功能号= 0x06
;AL = 上卷的行数(如果为0,表示全部)
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的(X,Y)位置
;(DL,DH) = 窗口右下角的(X,Y)位置
;无返回值:
mov ax, 0600h
mov bx, 0700h
mov cx, 0 ; 左上角: (0, 0)
mov dx, 184fh ; 右下角: (80,25),
; 因为VGA文本模式中,一行只能容纳80个字符,共25行。
; 下标从0开始,所以0x18=24,0x4f=79
int 10h ; int 10h
; 输出背景色绿色,前景色红色,并且跳动的字符串"loader-zengxianghao"
mov byte [gs:0x00],'1'
mov byte [gs:0x01],0xA4 ; A表示绿色背景闪烁,4表示前景色为红色
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
db 0x55,0xaa
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 = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "mbr-xxxxx"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
保存上述.asm文件后进行如下编译成字节文件
编译成.bin文件才能写入.img硬盘跑起来
//如果用mbr.S 下面写法nasm mbr.S -o mbr.bin
nasm mbr.asm -o mbr.bin
sudo dd if=mbr.bin of=/home/你的名字/BOCHS/bochs/bin/hd60M.img bs=512 count=1 conv=notrunc
在bin目录下输入
//disk写你的文件名
./bochs -f brochs.disk
成功读入结果如下,有bug就主要检查路径有没有错,一般挺多bug,自求多福
输入6开始模拟
此时你可能会遇到如下bug,建议检查路径,如果不行就重新建一次.img,我建了很多次,你也不会少
下面是两种不同mbr.asm代码的正确结果
1.如果用第二种代码出现如下结果成功:红色字为你在.asm文件中用第二种代码写的的hellow ,OS world
2.如果用第一种《真象还原》的代码结果如下:
对了,每次测试完都会有一个.img.lock文件,记得删掉不然会锁住打不开.img报错,就在bin目录下,记得删,记得删,记得删
bug补充不完的