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
回車,就可以了。
運行結果
配置完成