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

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。

  1. 用下面两个命令生成可执行文件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程序完成以上任务。步骤如下

  2. 建立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。

  1. 用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,想想是不是很激动!自己真正控制了计算机的启动!虽然一启动就死在那里了(╥╯^╰╥) ***

linux上配置bochs,搭建基于X86架构操作系统的开发环境的更多相关文章

  1. 搭建基于MyEclipse的Hadoop开发环境

    不多说,直接上干货! 前面我们已经搭建了一个伪分布模式的Hadoop运行环境.请移步, hadoop-2.2.0.tar.gz的伪分布集群环境搭建(单节点) 我们绝大多数都习惯在Eclipse或MyE ...

  2. Linux内核配置解析 - 概述(基于ARM64架构)

    1. 前言 对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?. 话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手:从源代码的目录结构入手:从k ...

  3. [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld

    首先这篇文章比较长,若想了解Xcode7的免开发者帐号真机调试运行IOS程序的话,直接转到第五部分. 转载请注明原文地址:http://www.cnblogs.com/litou/p/4843772. ...

  4. 在 Mac/Windows 系统中使用 Laradock 搭建基于 Docker 的 Laravel 开发环境 (改)

    开篇 Use Docker First And Learn About It Later 简介 Laradock 是为 Docker 提供的完整 PHP 本地开发环境,和 Homestead 一样提供 ...

  5. Mac下搭建基于PlatformIO的嵌入式开发环境(STM32开发)

    PlatformIO简介 PlatformIO是开源的物联网开发生态系统.提供跨平台的代码构建器.集成开发环境(IDE),兼容 Arduino,ESP8266和mbed等 支持在Windows.Lin ...

  6. 如何在Windows上配置EBS R12.1.3的OAF开发环境

    1.找到想要开发的EBS OAF扩展对应的PATCH,可以参照下面的Note,因为我要做的是R12.1.3的开发,所以要下载p9879989_R12_GENERIC OA Framework - Ho ...

  7. React-Native学习手册----搭建基于ios平台的开发环境

    首先推荐几个链接: React-Native 官网地址:https://facebook.github.io/react-native/docs/getting-started React-Nativ ...

  8. win10搭建基于docker的odoo开发环境

  9. 基于IDEA的JavaWeb开发环境搭建

    基于IDEA的JavaWeb开发环境搭建 基于IDEA的JavaWeb开发环境搭建 jdk下载安装配置环境变量 下载 安装 配置环境变量 下载安装激活使用IntelliJ IDEA 下载 安装 激活 ...

随机推荐

  1. iOS_应用程序的生命周期

    每个iPhone程序都包括唯一一个UIApplication对象,它管理整个程序的生命周期,从载入第一个显示界面開始,而且监听系统事件.程序事件调度整个程序的运行. int main(int argc ...

  2. Jenkins+tomcat+jdk setup

    Jenkins download: http://jenkins-ci.org/ jdk version:jdk-7u45-linux-x64.tar.gz tomcat version:apache ...

  3. Shell编程之文本处理

    cut 截取自定列 可以按照某个字符进行分割,然后取出其中的指定列: [root@iz8vbbqbnh4ug2q9so5jflz logs]# --.txt /Dec/::: +] - /Dec/:: ...

  4. 迭代var()内置函数的时候出现RuntimeError: dictionary changed size during iteration的解决办法

    下午看了Mr Seven的教学视频,其中有一段讲全局变量的视频,迭代输出全局变量的时候报错了. 视频中的做法: for k,v in vars().items(): print(k) 打印结果 for ...

  5. org.elasticsearch.transport.ReceiveTimeoutTransportException[cluster:monitor/nodes/liveness] request_id [31] timed out after [5000ms]

    ES连接超时,异常信息 2017-09-07 10:42:45.042 [elasticsearch[Bantam][transport_client_worker][T#17]{New I/O wo ...

  6. 50、html补充

    今天补充几个html标签 <body>内常用标签 1.<div>和<span> <div></div> : <div>只是一个块 ...

  7. for循环语句以及输出语句

    action() { int  i;  //定义变量    lr_start_transaction("submit_answer");  //开始事物    for(i=0; i ...

  8. iOS masonry九宫格 单行 多行布局

    Masonry是个好东西,在当前尺寸各异的iOS开发适配中发挥着至关重要的作用,由于项目中Masonry布局用的比较多,对于UI布局也有了一些自己的理解,经常会有人问道Masonry布局九宫格要怎么布 ...

  9. ES6之Class

    ES6中的Class和JS的比起来无疑是让对象原型的写法更加清晰,更像面向对象编程的语法而已,注意一个问题ES6里面的Class的内部定义的所有方法都是不可枚举的,而且在ES6中Class不存在变量提 ...

  10. Jrebel简单的热部署一个web工程

    前言:博主最近在做Hybris开发,漫长的启动时间大大的拖累了项目的进度,而Jrebel的出现就是为了减少项目重启的时间或者说修改了代码后直接不用重启就可以看到修改的结果,但是Hybris的部署一直没 ...