1.配置环境
实验环境:Ubuntu 18.04
需要的文件:GeekOS[http://geekos.sourceforge.net/]、nasm-2.00(低版本的,高版本的会报错)[https://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D]
2.编译
安装编译环境
通过sudo apt-get install
来分别安装build-essential
、bochs
、bochs-x
安装低版本的gcc
通过gcc -v
可以查看当前的gcc
版本。需要编译的geekos-0.3
版本非常古老,直接编译会出现一堆错误,所以使用同样比较古老的gcc-4.8
来进行编译。通过以下命令配置gcc
#安装低版本的gcc
$sudo apt-get install gcc-4.8
#查看已安装的版本
$ls /usr/bin/gcc* -l
#分别为新旧版本设置优先级
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
选择不同的gcc版本:
$ sudo update-alternatives --config gcc
选择gcc版本
修改后的gcc版本
安装nasm
下载nasm-2.00.tar.gz
压缩包并解压之后,在nasm-2.00
目录中打开终端,输入以下指令安装:
$ ./configure
$ make
$ sudo make install
正式编译
进入geekos-0.3.0/src/project0/build/
目录,直接开始编译:
$ make depend
$ make
但是当然不会这么顺利,除了上面提到的gcc版本问题,还有一堆可能碰到的问题,顺便附上我的解决方法。每次尝试解决问题之后,可能需要make clean之后再次重新编译。
可能遇到的问题:
warnings being treated as errors
这是因为Makefile
中默认的编译选项过于严格,把警告都当成错误来看待,我们可以修改一下Makefile
将这个过于严格的编译选项去掉(该文件位于build
目录下):
在Makefile
的第149行删除-Werror
:
配置Makefile
// 修改前 149行:
CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror
// 修改后:
CC_GENERAL_OPTS := $(GENERAL_OPTS)
或者,打开src/project0/include/geekos/segment.h
,在第43行加上:8
:
//修改前 48行:
uchar_t baseHigh PACKED ;
// 修改后:
uchar_t baseHigh : 8 PACKED ;
X86-64与i386输出不兼容
# Target C compiler. gcc 2.95.2 or later should work. 100行
TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
# Host C compiler. This is used to compile programs to execute on
# the host platform, not the target (x86) platform. On x86/ELF
# systems, such as Linux and FreeBSD, it can generally be the same
# as the target C compiler. 106行
HOST_CC := gcc -m32
# Target linker. GNU ld is probably to only one that will work.109行
TARGET_LD := $(TARGET_CC_PREFIX)ld -m elf_i386
bits目录下缺失文件
这是gcc环境没有安装完善导致的,安装命令:
$ sudo apt-get install gcc-multilib
__stack_chk_fail未定义
这是因为gcc在编译时开启了栈保护,打开Makefile
,在第148行关闭栈保护:
# Flags used for all C source files
// 修改前:148行
GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS)
// 修改后:
GENERAL_OPTS := -O -Wall -fno-stack-protector $(EXTRA_C_OPTS)
最终编译成功之后,会在build
目录下生成一个镜像文件fd.img
和bochs模拟器的配置文件.bochsrc
:
3.运行
通过bochs
命令运行:
bochs第一次启动会出现>>PANIC<< .bochsrc:4: vgaromimage directive malformed.
错误,打开.bochsrc
:
修改
#第4行注释
# vgaromimage: /export/home/daveho/linux/bochs-2.0.2/share/bochs/VGABIOS-lgpl-latest
#第5、6行修改
// 修改前:
romimage: file=/export/home/daveho/linux/bochs-2.0.2/share/bochs/BIOS-bochs-latest, address=0xf0000
// 修改后:
romimage: file=$BXSHARE/BIOS-bochs-latest
#第16、18、22行注释
# floppy_command_delay: 500
# ips: 1000000
# newharddrivesupport: enabled=1
如果新弹出的bochs窗口黑屏,可能是进入了调试模式,在终端中输入c
回车,就可以了。
运行结果
配置完成