平台:ubuntu10.10
这就是搭建bochs的环境,搭建bochs更操作系统关系不大,我认为重点是在bochs的配置上。配置bochs就需要对bochsrc.bxrc文档的编辑。
在安装bochs之前,需要做的是安装编译环境:
code:
sudo apt-get install build-essential
闲话少说,先从安装开始:
我是用ubuntu的软件包工具apt安装的bochs,当然了也可以直接编译bochs的源代码。源代码在www.sourceforge.net下载即可。在这里我就不介绍怎么编译源代码了。
code:
sudo apt-get install bochs vgabios bochs-x bochsbios bochs-doc
好了,bochs安装完成。
我在我的Debian Sid系统上对这个东东做了基本的测试,gcc 4.1是我系统的默认编译器。
任何一个比较新的Linux发型版,包括Fedora,Ubuntu等,应该都没有问题。如果你的系
统上安装的是其他版本的gcc,可以参考下面“使用其他gcc编译”小节。
如果你的Linux提供的默认编译器的仍然是gcc 3.x,或者你打算另外安装一个gcc 3.x
仅仅为了满足能编译源码的要求,你可能就用不到这个东东了。但是,除了内核源码之
外,我还提供了一整套linux-0.11的实验环境,用于在linux环境下学习并且实验linux
0.11的源代码。因为我认为要想真正的学习Linux内核的精髓,还是得老老实实在Linux环境
中进行学习。而且在Windows下面,几乎就不可能编译Linux内核的源码。
如果你真的很想在Windows平台学习Linux也没有关系。我还做了另外一个类似的东东可
以在Windows平台直接学习Linux 0.11的源码。只需要下载下面的链接并且解压到系统
的某个地方就可以用:
http://www.quinnli.com/upload/linux-0.11-lab_060616_004102.exe
无论是Linux用户也好,Windows用户也好,如果你也是新学Linux,不太清楚怎么样
修改并且编译内核源码,然后重启进入你修改后的内核这些基本操作,可以看看我
做的一个Flash教程:
http://www.quinnli.com/upload/linux-0.11.swf
假设你已经进入linux-0.11这个目录,首先运行:
cd source/linux
make clean
make
cd ../../
将在source/linux目录下生成新的内核文件Image。然后运行:
./mcopy_kernel source/linux/Image bootimage-new
可以将Image文件拷贝到一个装了grub的启动软盘上。这个命令将在磁盘的/boot
目录下建立bootimage-new这个文件,值得指出的是,如果用这个命令,所有的
都会被拷贝到软盘的/boot目录下。
然后你可以运行
./edit_menu.lst
来编辑grub的配置文件,这样启动是就可以在grub菜单中显示新内核的启动项。
配置文件语法很简单。
比如说你可以在menu.lst最后加上以下四行:
title Linux 0.11 compiled by gcc 4.1
root (fd0)
kernel /boot/bootimage-new
boot
最后可以运行:
./linux-0.11
来启动bochs虚拟机。如果没有别的问题,你应该可以看到grub启动菜单,
这时候选择你刚刚创建的菜单项就可以进入新的内核。
另外,如果你不想在自身的Linux环境下编译源码也可以,因为你可以在虚拟机中的
linux-0.11环境中编译linux-0.11的源码。如果你决定这样做,可以看我的作的flash教程:
http://www.quinnli.com/upload/linux-0.11.swf
目录结构
========
source/
linux/
这个目录下有我修改的源码
linux-0.11-040327-rh9.tar.gz
这个是www.oldlinux.org提供的在RH9下编译的原始代码
linux-0.11-040327-rh9.diff.gz
这是www.oldlinux.org提供的为了能在RH9下编译提供的差异文件
linux-0.11-060617-gcc4-diff.gz
这是我基于rh9版本作出的修改,基本上都是为了编译通过作出的
很简单的修改。但是有一处修改并不那么直观,可以参考我写的:
http://www.quinnli.com/blog/archives/50
conf/
这个目录下有配置文件
images/
这个目录下包含虚拟机需要的软盘和硬盘镜像文件。硬盘镜像文件是www.oldlinux.org提供的包含完整Linux开发环境的硬盘镜像。还有一张grub启动软盘,你可以将新的内核文件拷贝到这张软盘中。
bak/
每次运行 ./edit_menu.lst 和 ./mcopy_kernel 都会备份当前的grub启动盘到 bak
目录中。必要的时候可以从这个目录下恢复。
使用其他版本的gcc编译
=====================
使用其他版本的gcc来编译也是可以的,gcc-4.0应该可以编译。而且如果你
用的系统非常非常老,还在使用gcc-2.95,经过我的测试,也可以支持。
但如果你的默认版本的gcc是3.x,其实你不需要使用我修改的版本,使用最初
赵炯博士提供的rh9版本就可以。这个包里也包含了这个文件
如果你实在是想用gcc-3.3编译我的版本,也行,只不过需要首先将源码目录中的
`mm/Makefile'替换为`mm/Makefile-gcc3.x'。原始的`mm/Makefile'也有其备份
`mm/Makefile-gcc-4.1',必要时可以恢复。一定记得覆盖,不然在编译的时候
不会出现任何问题,但是编译出来的内核镜像将无法启动。
遇到的问题:
make出错
解决方法:
#if 1 #elif #endif
Now produces the following diagnostic:
error: #elif with no expression
To fix this, either use #else without an argument or provide a constant expression when using #elif.
======================================
1、sudo apt-get install build-essential
这里会把gcc , g++ cpp , gas , gld ,等程序都装好。装好之后as = gas , ld = gld
在ubuntu里面as == gas , ld == gld. 以后在用Makefile 的时候记得去改。
2、sudoapt-get install bin86
装上as86 , ld86 两个程序。
3、sudo apt-get install bochs vgabios bochs-x bochsbios bochs-doc
装上bochs
4、下载两个文件包:
http://www.oldlinux.org/oldlinux/attachment.php?aid=658
name :linux-0.11-081030.tar.gz: 如果下不下来,google之。
http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-060625.zip
name :linux-0.11-devel-060625.zip这个应该可以下下来。
5、修改Makefile。
GCC4.x 默认检查stack安全,会导致出现__stack_chk_fail错误。分别打开
source/linux/kernel/Makefile、
source/linux/kernel/chr_dev/Makefile、
source/linux/fs/Makefile
三个文件,在 CFLAGS参数中加入-fno-stack-protector
6、make
运行之后,如果无错,那么会得到Image.文件。
7、展开linux-0.11-devel-060625.zip, 拷出hdc-0.11-new.img 文件到linux-0.11中,
与Image在同一个文件夹中。
8、编写bxrc文件如下:
romimage: file=$BXSHARE/BIOS-bochs-latest
megs: 16
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44="Image", status=inserted #这个是启动盘。
ata0-master: type=disk, path="hdc-0.11-new.img", mode=flat, cylinders=410, heads=16, spt=38
#这个是文件系统,(这里与上面本来是一行的。)
boot: a
log: bochsout.txt
parport1: enable=0
vga_update_interval: 300000
keyboard_serial_delay: 200
keyboard_paste_delay: 100000
floppy_command_delay: 50000
ips: 4000000
mouse: enabled=0
private_colormap: enabled=0
fullscreen: enabled=0
screenmode: name="sample"
i440fxsupport: enabled=0
9、bochs -f filename.bxrc 运行之后就可以得到如下运行效果: