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

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. Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面

    1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...

  2. iOS_4_表情排列

    终于效果图: BeyondViewController.h // // BeyondViewController.h // 04_表情排列 // // Created by beyond on 14- ...

  3. Eclipse的Servers视图中无法加入Tomcat6/Tomcat7

    引言: 在基于Eclipse的开发过程中,出现了无法在Eclipse中加入Tomcat的问题,经过从网上搜索之后.找到了答案. 问题的提出: 无法从下面方式,加入Tomcatserver.  当中Se ...

  4. TortoiseSVN的安装和使用

    TortoiseSVN是windows平台下Subversion的免费开源client. 一般我们都是先讲讲server的配置.然后再讲client的使用,可是在TortoiseSVN上.却能够反过来 ...

  5. jQuery->JavaScript一览表

    比较jQuery与JavaScript的不同功能实现 CSS选择器 元素选择 // jQuery $("li").css("color", "red& ...

  6. Memcached的安装与简单使用

    Memcached下载 如果是Win10系统,还需要单独安装telnet服务,因为Win10把它给阉掉了.(默认下一步下一步安装) 一.安装Memcached 将Memcached解压到目录,以管理员 ...

  7. this的理解

    this的理解 看了阮一峰的this讲解,下面是我的理解: 总结来说 this指向 调用this所在方法 的对象: 普通函数 例子1 function test(){ this.x = 1; cons ...

  8. dubbo服务治理中间件,zookeeper注册中心

    对传统项目架构进行拆分: 集群概念: 面向服务分布式架构: 服务层提供被注册的对象需要实现序列化接口Serializable: 配置表现层和服务层: 依赖包: 服务层: <!-- 定义dubbo ...

  9. Android活动生命周期

    任务(Task) Android 是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack).在默认情况下,每当我们启动了一个新的活动,它 ...

  10. BZOJ 4816 数字表格

    首先是惯例的吐槽.SDOI题目名称是一个循环,题目内容也是一个循环,基本上过几年就把之前的题目换成另一个名字出出来,喜大普奔亦可赛艇.学长说考SDOI可以考出联赛分数,%%%. 下面放解题报告.并不喜 ...