Nachos 3.4安装过程日志
OS: Ubuntu 10.04.2
Editor: gedit
Nachos 3.4
GCC(G++) 3.4.6
1 手动安装低版本的GCC(G++)
可能由于Nachos 3.4版本的代码太老的原因,编译Nachos需要GCC的版本要小于4.0。通过
$ gcc -v
指令查看Ubuntu自带的GCC版本,如果高于4.0则需要安装低版本的GCC。(Ubuntu 10.04.2中GCC的版本是4.4.3)
1.1 下载GCC(G++)3.4.6
Ubuntu的Software Center和 apt-get中都找不到低于4.0的GCC版本,因此需要手动下载安装,这里推荐使用北京交通大学的镜像下载,国外的镜像速度实在是太不给力了。
网址:http://mirror.bjtu.edu.cn/ubuntu/pool/main/g/gcc-3.4/
我选择的GCC版本是3.4.6,依次下载以下7个文件:
libg2c0-dev_3.4.6-1ubuntu2_i386.deb
cpp-3.4_3.4.6-1ubuntu2_i386.deb
g77-3.4_3.4.6-1ubuntu2_i386.deb
gcc-3.4-base_3.4.6-1ubuntu2_i386.deb
gcc-3.4_3.4.6-1ubuntu2_i386.deb
g++-3.4_3.4.6-1ubuntu2_i386.deb
libstdc++6-dbg_3.4.6-1ubuntu2_i386.deb
1.2 安装GCC(G++)
上述文件的安装是有顺序的,具体数序我也记不清楚。不过不用担心,双击运行gcc-3.4_3.4.6-1ubuntu2_i386.deb,Ubuntu会自动使用deb package installer安装,installer会检查包依赖,不出意外的话会出现依赖缺失的错误,看清楚缺失是哪个包实现安装就OK了(不会超出上面下载的7个文件)。
这里有个搞笑的问题,g++-3.4_3.4.6-1ubuntu2_i386.deb和libstdc++6-dbg_3.4.6-1ubuntu2_i386.deb是相互依赖的。囧。没关系,运行命令
$ sudo kpkg g++-3.4_3.4.6-1ubuntu2_i386.deb libstdc++6-dbg_3.4.6-1ubuntu2_i386.deb
就OK了。
1.3 检查GCC(G++)是否安装成功
运行命令
$ g++-3.4
$ gcc-3.4
如果提示no input files就说明安装成功了。可以进行下一步了。
2 安装make工具
如果系统中没有安装make工具,运行命令
$ sudo apt-get install make
稍等片刻就安装好了,由于Nachos中使用的命令是gmake,因此在make的时候会出现找不到gmake的错误提示,这里把二者link一下,运行指令
$ sudo ln /usr/bin/make /usr/bin/gmake
3 解压缩Nachos 3.4
把nachos 3.4 解压缩到/usr/local/lib/nachos-3.4中。大概会有三个目录c++example,code和doc,安装过程只需要关注code目录即可。
4 修改 Nachos 3.4准备安装
4.1 修改Makefile.dep文件,我的机器是i386平台,因此将HOST = -DHOST_MIPS这行代码注释掉。同时取消386平台后的两行代码的注释:
HOST = -DHOST_i386
CPP=/usr/bin/cpp
4.2 修改Makefile.common文件,修改默认使用的编译器为GCC(G++)3.4。找到并修改下述代码
CC = g++-3.4
LD = g++-3.4
4.3 修改code/threads/utility.h文件,注释掉代码#include <bool.h>,同时添加两条预编译代码:
#define TRUE true
#define FALSE false
否则会出现找不到bool.h的错误,这是由于Nachos自己定义来bool变量却又不给我们头文件,!囧,我们完全可以使用标准的bool变量代替。
4.4 修改threads/utility.cc文件,注释掉以下代码
//#ifdef HOST_SNAKE
//#include <stdarg.h>
//#else
//#ifdef HOST_SPARC
//#include <stdarg.h>
//#else
//#include "/usr/include/stdarg.h"
//#endif
//#endif
同时添加一行包含头文件的代码,#include <stdarg.h>否则会出现找不到stdarg.h的错误,通过上面的预编译代码可以看出问题所在。
4.5 修改threads/switch.s文件,这个文件中有四个预定义的块。以
#ifdef XXXX开始,#endif结束,注释掉除HOST_i386之外的三个块。修改HOST_i386块,修改 .globl _ThreadRoot 为.globl ThreadRoot,SWITCH,相对应的也要把下面的两个procesure名字前的_删掉。
4.6 修改machine/sysdep.cc文件,这个文件需要修改的地方非常多,有些地方可能会忘记记录在这里或者有不同的错误发生,只要根据错误提示找到对应的代码进行修改即可。大部分的错误是函数定义出突和强制类型转化的问题。这里记录一部分。
增加两行头文件包含代码
#include <unistd.h>
#include <errno.h>
注释掉以下的所有的函数,,这些函数与unistd.h中的函数定义冲突:
int creat()
int open()
void signal()
int unlock()
int read()
int write()
int write()
int lseek()
int unlink()
extern int recvfrom()
extern int sendto()
void exit()
void exit(exitCode)
int mprotect()
int bind()
int revcfrom()
int sendto()
强制类型转换:
ReadFromSocket函数中
retVal = recvfrom(sockID, buffer, packetSize, 0, (struct sockaddr *) &uName, (socklen_t *)&size);
SendToSocket函数中
retVal = sendto(sockID, buffer, packetSize, 0, (const sockaddr* ) &uName, sizeof(uName));
5 make Nachos 3.4
cd到code目录,执行命令:
$ sudo make
如果没有错误提示的话,Nachos 3.4 就编译成功了。编译成功后会在vm目录内生成一个nachos可执行文件,运行之可以看到很多Backtrace和Memory map的信息。
6 交叉编译(待续)
http://hi.baidu.com/ruxbin/blog/item/fc923982d6454396f603a6b5.html
http://forum.ubuntu.org.cn/viewtopic.php?f=70&t=117289
http://blog.csdn.net/yang_0723sf/archive/2005/08/25/464754.aspx