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

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. Android最佳性能实践(四)——布局优化技巧

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43376527 在前面几篇文章其中.我们学习了怎样通过合理管理内存,以及高性能编码技 ...

  2. Eclipse背景颜色改动

     Eclipse背景颜色改动:  操作界面默认颜色为白色. 对于我们长期使用电脑编程的人来说.白色非常刺激我们的眼睛,所以我常常会改变workspace的背景色.使眼睛舒服一些.设置方法例如以下: ...

  3. Python笔记·第二章—— Python的编码问题(一)

    一.什么是编码 可以说,计算机是一个即聪明又笨蛋的家伙.说它聪明,是因为他可以做很多事情,它的强大无需多说,大家应该都有所了解以及感受.但是为什么说它又是个笨蛋呢,因为我们在电脑上写出的每一个字,保存 ...

  4. 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 ...

  5. free查看内存和swap使用情况,增加、删除、自动挂载swap分区

    free [root@localhost ~]# free total used free shared buff/cache available Mem: 999936 142760 566536 ...

  6. Function:html结构转字符串形式显示

    //Html结构转字符串形式显示 支持<br>换行 function ToHtmlString(htmlStr) { return toTXT(htmlStr).replace(/\&am ...

  7. IOS学习3——代理

    本文转载自:你真的了解iOS代理设计模式吗? 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存 ...

  8. 【USACO】玉米实验(单调队列)

    Description 约翰决定培育新的玉米品种以提高奶牛的产奶效率.约翰所有的土地被分成 N ×N 块,其中第 r行第 c 列的玉米质量为 Ar,c.他打算找一块质量比较均匀的土地开始自己的实验.经 ...

  9. 使用Python Shapefile Library创建和编辑Shapefile文件

    介绍 shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Classes),主要包括点(point).线(polyline)和多边形(polygon).P ...

  10. Add to List 349. Intersection of Two Arrays

    Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...