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

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. ROC和AUC的区别

    ROC是一个曲线,AUC是曲线下面的面积值.   ROC曲线是FPR和TPR的点连成的线. 可以从上面的图看到,横轴是FPR, 纵轴是TPR (TPR = TP / (TP + FN):FPR = F ...

  2. JQuery学习(4-2-phpserver端1)

    主要内容:介绍图片的上传过程,涉及PHP跟JQuery: 1. 读取配置文件,连接MySQL数据库. 配置文件主要实username和password. 3-5.php <?php /* * v ...

  3. C++windows内核编程笔记day09_day10,对话框和窗体基本控件等的使用

    //设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗体背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce. ...

  4. D01 Elon Mulsk The future we're building — and boring

    摘要:精选TED. 每个音频不超过2分钟,学英语和吸收伟大思想两不误 音频: https://n1audio.hjfile.cn/st/fb5ace6f-7b63-439d-954c-c4539c1f ...

  5. gunicorn geventworker 解析

    在前面的文章曾介绍过gunicorn的syncworker,本文介绍其中一种asyncworker:GeventWorker.类图如下:   可见GeventWorker重载了init_process ...

  6. Hadoop:Rack Awareness

    副本的放置对HDFS可靠性和性能至关重要. 优化副本放置HDFS有别于其他大多数分布式文件系统. 这是一个功能,需要大量的调优和经验. 基于机架感知(rack awareness)的副本放置策略的目的 ...

  7. 基于apache httpclient 调用Face++ API

    简要: 本文简要介绍使用Apache HttpClient工具调用旷世科技的Face API. 前期准备: 依赖包maven地址: <!-- https://mvnrepository.com/ ...

  8. IOS学习3——代理

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

  9. html查看器android

    1.android的API提供了访问网络的一个类HttpURLConnection 2.通过发送GET请求获取服务器返回的html代码 3.先看看布局文件,如下所示, <?xml version ...

  10. 浅谈对ST表的一些理解

    今天打了人生第一道ST表题(其实只是ST表跑得最快); ST表是一种用来解决RMQ问题的利器... 大体操作有两步: 第一部分nlogn预处理 第二部分O(1)询问 预处理就是运用倍增+区间动规 ST ...