linux上配置bochs,搭建基于X86架构操作系统的开发环境
学习操作系统最好的方法就是自己编写新的操作系统,或者修改已有的操作系统。但是如果在真机上完成这个过程,调试会成为一个很大的问题。利用虚拟机来完成,可以使调试过程变得简单,而且能节约很多开关机的时间。
Bochs是一个仿真X86机器的软件,它仿真了所有的机器指令,因此在上面跑的程序跟跑在真机上的效果完全一样,很适合拿来搭建开发环境。
下面就来聊一聊怎么搭这个开发环境。
我使用的主机操作系统为ubuntu16.04。
第一步:下载并安装仿真软件bochs
从http://bochs.sourceforge.net/下载并安装bochs。找到文件下载的路径后执行
tar vxzf bochs-2.6.9.tar.gz进入文件目录,并执行配置文件,使能调试功能
cd ./bochs-2.6.9
/configure --enable-debugger --enable-disasm.编译文件
make若出现 gui.libgui.a(x,o):undefined reference to symbol的错误,执行
sudo apt-get install xorg-dev编译通过后,执行
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的引导分区。
安装汇编编译软件 as86和ld86
sudo apt-get install bin86新建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。
用下面两个命令生成可执行文件boot。
as86 -o boot.o boot.sld86 -o boot boot.o刚开始,我到这里就把boot写入到bootimage.img里面去了,然后执行
bochs, 屏幕并没有显示A,反而提示不能识别的引导程序。
原因是写入到bootimage.img的512字节文件的最后两个字节没有赋为0x55AA, 所以硬件不能将其识别为引导程序。由于我目前对汇编还不是很熟悉,不知道如何控制代码的长度,使得boot文件的第511和512字节为55和AA,所以采用了间接的办法,用c程序完成以上任务。步骤如下
建立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。
用gcc编译.c文件并执行,若没有gcc,请安装
gcc -o bootsect bootsect.c
./bootsect
若成功,shell会出现successful。
最后一步:将boot文件写入到软盘映像bootimage.img,并启动bochs
利用dd命令将boot文件复制到bootimage.img的开始的512字节处。
dd if=boot of=bootimage.img bs=512 count=1 conv=notrun启动bochs。
bochs
然后输入6,enter, 虚拟机就启动了。在shell里输入c,enter,。
如果在虚拟机的最左上角里看到一个蓝底白色的字符A,就说明你大功告成啦!!!
***其实,如果把boot文件烧写到U盘里,并把一台真机设为U盘优先启动,在该真机上插上U盘,上电后在屏幕左上角同样会看到一个蓝底白色的字符A,想想是不是很激动!自己真正控制了计算机的启动!虽然一启动就死在那里了(╥╯^╰╥) ***
linux上配置bochs,搭建基于X86架构操作系统的开发环境的更多相关文章
- 搭建基于MyEclipse的Hadoop开发环境
不多说,直接上干货! 前面我们已经搭建了一个伪分布模式的Hadoop运行环境.请移步, hadoop-2.2.0.tar.gz的伪分布集群环境搭建(单节点) 我们绝大多数都习惯在Eclipse或MyE ...
- Linux内核配置解析 - 概述(基于ARM64架构)
1. 前言 对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?. 话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手:从源代码的目录结构入手:从k ...
- [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
首先这篇文章比较长,若想了解Xcode7的免开发者帐号真机调试运行IOS程序的话,直接转到第五部分. 转载请注明原文地址:http://www.cnblogs.com/litou/p/4843772. ...
- 在 Mac/Windows 系统中使用 Laradock 搭建基于 Docker 的 Laravel 开发环境 (改)
开篇 Use Docker First And Learn About It Later 简介 Laradock 是为 Docker 提供的完整 PHP 本地开发环境,和 Homestead 一样提供 ...
- Mac下搭建基于PlatformIO的嵌入式开发环境(STM32开发)
PlatformIO简介 PlatformIO是开源的物联网开发生态系统.提供跨平台的代码构建器.集成开发环境(IDE),兼容 Arduino,ESP8266和mbed等 支持在Windows.Lin ...
- 如何在Windows上配置EBS R12.1.3的OAF开发环境
1.找到想要开发的EBS OAF扩展对应的PATCH,可以参照下面的Note,因为我要做的是R12.1.3的开发,所以要下载p9879989_R12_GENERIC OA Framework - Ho ...
- React-Native学习手册----搭建基于ios平台的开发环境
首先推荐几个链接: React-Native 官网地址:https://facebook.github.io/react-native/docs/getting-started React-Nativ ...
- win10搭建基于docker的odoo开发环境
- 基于IDEA的JavaWeb开发环境搭建
基于IDEA的JavaWeb开发环境搭建 基于IDEA的JavaWeb开发环境搭建 jdk下载安装配置环境变量 下载 安装 配置环境变量 下载安装激活使用IntelliJ IDEA 下载 安装 激活 ...
随机推荐
- java的热部署和热加载
ps:热部署和热加载其实是两个类似但不同的概念,之前理解不深,so,这篇文章重构了下. 一.热部署与热加载 在应用运行的时升级软件,无需重新启动的方式有两种,热部署和热加载. 对于Java应用程序来说 ...
- CAN通讯的总结
1.CAN通讯有套国际标准,套协议版本号,种故障状态,种数据帧类型,种总线错误类型. 2.CAN的国际标准有两种ISO11898和ISO11519. 3.CAN2.0协议分为A版和B版两种,A版协议仅 ...
- 二叉排序树(BST)构造与应用
二叉排序树(BST)构造与应用 本文取自<数据结构与算法>(C语言版)(第三版).出版社是清华大学出版社. 本博文作为学习资料整理. 源码是VC+ ...
- 工厂方法模式的一些思考(java语法表示)
同为创造型设计模式的简单工厂模式可以理解为对new关键字的代替. 本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它.那我们为什么要用简单工厂模式代替new呢?就 ...
- 【java提高】Serializable(一)--初步理解
Serializable(一)--初步理解 一 序列化是干什么的? 我们知道,在jvm中引用数据类型存在于栈中,而new创建出的对象存在于堆中.如果电脑断电那么存在于内存中的对象就会丢失.那么有没有方 ...
- Centos7安装配置Xhgui
XhProf是Facebook出品的一个PHP性能监控工具,只包含基本的界面和图形来分析数据.后来Paul Reinheimer在此基础上开发了Xhgui,提供了更好的界面和功能,其主页在https: ...
- mac与centos下redis的安装与配置
前言 最近在用redis,下面简单写一下mac和centos下redis的安装与配置方法. 安装 mac下面 安装命令:brew intall redis 运行命令:brew services sta ...
- list对象数组,xpath复杂定位校验,POST入参为number数组,POST入参为JSON对象数组
list对象数组: POST入参为number数组: { "typeIds":[1,2,3]} POST入参为JSON对象数组,举例: [{ "itemId& ...
- 453. Minimum Moves to Equal Array Elements
Given anon-emptyinteger array of sizen, find the minimum number of moves required to make all array ...
- 在html中使用js
1.使用defer属性可以让脚本在文档完全呈现出来之后在执行,延迟脚本总是按照制定他们的顺序进行. 2.使用async属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现,不能保证异步顺序按照它们 ...