内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

linux上配置bochs搭建基于X86架构操作系统的开发环境

2018-01-12 16:57 出处:清屏网 人气: 评论(0

学习操作系统最好的方法就是自己编写新的操作系统,或者修改已有的操作系统。但是如果在真机上完成这个过程,调试会成为一个很大的问题。利用虚拟机来完成,可以使调试过程变得简单,而且能节约很多开关机的时间。

Bochs是一个仿真X86机器的软件,它仿真了所有的机器指令,因此在上面跑的程序跟跑在真机上的效果完全一样,很适合拿来搭建开发环境。

下面就来聊一聊怎么搭这个开发环境。

我使用的主机操作系统为ubuntu16.04。

第一步:下载并安装仿真软件bochs

  1. http://bochs.sourceforge.net/ 下载并安装bochs。找到文件下载的路径后执行

    tar vxzf bochs-2.6.9.tar.gz

  2. 进入文件目录,并执行配置文件,使能调试功能

    cd ./bochs-2.6.9
    /configure --enable-debugger --enable-disasm .

  3. 编译文件

    make

    若出现 gui.libgui.a(x,o):undefined reference to symbol 的错误,执行

    sudo apt-get install xorg-dev

  4. 编译通过后,执行

    sudo make install
    将文件安装到系统默认的目录下。

至此bochs已经安装完成。

第二步:根据要仿真的机器的硬件配置,修改bochs的配置文件。

/usr/local/share/doc/bochs 下存在一个模版文件bochsrc-sample.txt。我们可以根据这个模版自行编写一个bochsrc配置文件。

配置文件用来设置虚拟机的CPU型号,内存容量,主引导设备,ATA设备,ROM程序等,通过这个配置文件就可以抽象出一台计算机。

自行编写的文件中未指定的参数,bochs会采用默认参数。以下为我的bochsrc文件。

新建一个名为bochsrc(不能为其他名字)的文件,编辑如下

########################################################
#Bochs Configure File
########################################################

#=======================================================
#The amount of physical memory
#=======================================================
megs: 16

#=======================================================
#The log file for debug
#=======================================================
log: bochsout.txt

#=======================================================
#The way to boot
#=======================================================
boot: floppy

#=======================================================
#ATA controller for hard disks and cdroms
#=======================================================
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9

#=======================================================
#The master and slave devices of ATA[0:3]
#=======================================================
#ata0-master: type=disk, mode=flat, path="30M.sample"
#=======================================================

#The pathname of a bootable floppy
#======================================================= 
floppya: 1_44=bootimage.img, status=inserted

#=======================================================
#The program in BIOS ROM.
#=======================================================
romimage: file=$BXSHARE/BIOS-bochs-latest, options=fastboot

该文件配置了16M的内存,从第一个软盘启动系统,引导程序映像为bootimage.img。

第三步:利用bochs自带的软盘/硬盘映像制作软件,制作floppy或者hard disk 映像。

在当前目录下执行 bximage , 可以按照步骤制作出虚拟的软盘或者硬盘映像。

注意:该映像名称应该与bochsrc中的设置一致,否则虚拟机找不到引导程序。 在这里命名为bootimage.img。

第四步:编写一个程序,并写入到bootimage.img的引导分区。

  1. 安装汇编编译软件 as86和ld86

    sudo apt-get install bin86

  2. 新建boot.s文件,并编辑如下

    1 entry start
    2 start:
    3 mov ax,#0xb800
    4 mov ds,ax
    5 mov byte[0],#0x41
    6 mov byte[1],#0x1f
    7 hlt

    该程序会在屏幕左上角显示一个蓝底白色的A。

  3. 用下面两个命令生成可执行文件boot。

    as86 -o boot.o boot.s

    ld86 -o boot boot.o

    刚开始,我到这里就把boot写入到bootimage.img里面去了,然后执行 bochs , 屏幕并没有显示A,反而提示不能识别的引导程序。

    原因是写入到bootimage.img的512字节文件的最后两个字节没有赋为0x55AA, 所以硬件不能将其识别为引导程序。

    由于我目前对汇编还不是很熟悉,不知道如何控制代码的长度,使得boot文件的第511和512字节为55和AA,所以采用了间接的办法,用c程序完成以上任务。步骤如下

  4. 建立bootsect.c 文件,写入如下代码

    #include <fcntl.h>
    #include <stdio.h>
    int main(int argc,char*argv[]){
    int file_desc;
    unsigned char buffer[512];
    file_desc=open("./boot",O_RDONLY);
    if(file_desc==-1){
    perror("failed to open file");
    return -1;
    }
     read(file_desc,buffer,510);
     close(file_desc);
     buffer[510] =0x55;
     buffer[511] =0xaa;
     file_desc = open("./boot",O_RDWR);
     if(file_desc ==-1){
     perror("failed to open file");
     return -1;
     }
     write(file_desc,buffer,512);
     close(file_desc);
     puts("successful.");
     return 0;}

    这段程序其实就是把boot的内容读到512大的数组里,然后把数组后两个字节赋值0x55AA, 然后写回boot。

  5. 用gcc编译.c文件并执行,若没有gcc,请安装

    gcc -o bootsect bootsect.c
    ./bootsect
    若成功,shell会出现successful。

最后一步:将boot文件写入到软盘映像bootimage.img,并启动bochs

  1. 利用dd命令将boot文件复制到bootimage.img的开始的512字节处。

    dd if=boot of=bootimage.img bs=512 count=1 conv=notrun

  2. 启动bochs。

    bochs

    然后输入6, enter , 虚拟机就启动了。在shell里输入c, enter ,。

    如果在虚拟机的最左上角里看到一个蓝底白色的字符A,就说明你大功告成啦!!!

其实,如果把boot文件烧写到U盘里,并把一台真机设为U盘优先启动,在该真机上插上U盘,上电后在屏幕左上角同样会看到一个蓝底白色的字符A,想想是不是很激动!自己真正控制了计算机的启动!虽然一启动就死在那里了(╥╯^╰╥)

分享给小伙伴们:
本文标签: bochslinux

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号