1. 程式人生 > 實用技巧 >作業系統GeekOS安裝、編譯、執行

作業系統GeekOS安裝、編譯、執行

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-essentialbochsbochs-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回車,就可以了。

執行結果

配置完成