實驗材料準備 1,下載實驗材料hit-oslab-linux-20110823.tar.gz(包含linux-0.11源碼,bochs模擬器等) 網址:http://www.ritchiehuang.cn/ 2,下載安裝gcc-3.4(編譯linux-0.11需要用到低版本gcc) 網址:old-r ...
實驗材料準備
1,下載實驗材料hit-oslab-linux-20110823.tar.gz(包含linux-0.11源碼,bochs模擬器等)
網址:http://www.ritchiehuang.cn/
2,下載安裝gcc-3.4(編譯linux-0.11需要用到低版本gcc)
網址:old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/
下載內容:(統一下載存放在新建的gcc-3.4文件夾下,由於我的ubuntu是64位所以下載amd64)
1 cpp-3.4_3.4.6-6ubuntu3_amd64.deb 2 g++-3.4_3.4.6-6ubuntu3_amd64.deb 3 gcc-3.4_3.4.6-6ubuntu3_amd64.deb 4 gcc-3.4-base_3.4.6-6ubuntu3_amd64.deb 5 libstdc++6-dev_3.4.6-6ubuntu3_amd64.deb
實驗相關簡述
1,x86模擬器器Bochs
Bochs是一個免費且開放源代碼的IA-32(x86)架構PC機模擬器。在它模擬出的環境中可以運行Linux、DOS和各種版本的Windows等多種操作系統。而Bochs本身具有很高的移植性,可以運行在多種軟硬體平臺之上。如果您想擁抱自由的Linux,那麼Bochs幾乎是您的不二選擇。如果您想繼續把自己綁定在Windows平臺上,那麼除了Bochs,您還可以選用VMware或者Microsoft Virtual PC。它們是最著名虛擬機軟體,而且都可以免費使用。因為Bochs的是模擬器,其原理決定了它的運行效率會低於虛擬機。但是,Bochs有虛擬機無可比擬的調試操作系統的能力.
2,實驗環境的工作模式
hit-oslab實驗環境簡稱oslab,是一個壓縮文件(hit-oslab-linux-20110823.tar.gz),可以將這個文件拷貝到自己的實驗工作目錄下,用tar zxvf hit-oslab-linux-20110823.tar.gz命令解壓展開即可工作。oslab工作在一個宿主操作系統之上,我們使用的Linux,在宿主操作系統之上完成對Linux 0.11的開發、修改和編譯之後,在linux-0.11目錄下會生產一個名為Image的文件,它就是編譯之後的目標文件。該文件內已經包含引導和所有內核的二進位代碼。如果拿來一張軟盤,從它的0扇區開始,逐位元組寫入Image文件的內容,就可以用這張軟盤啟動一臺真正的電腦,併進入Linux 0.11內核。oslab採用bochs模擬器載入這個Image文件,模擬執行Linux 0.11,這樣省卻了重新啟動電腦的麻煩。
bochs目錄下是與bochs相關的執行文件、數據文件和配置文件。run是運行bochs的腳本命令。運行後bochs會自動在它的虛擬軟碟機A和虛擬硬碟上各掛載一個鏡像文件,軟碟機上掛載是linux-0.11/Image,硬碟上掛載的是hdc-0.11.img。因為bochs配置文件中的設置是從軟碟機A啟動,所以Linux 0.11會被自動載入。而Linux 0.11會驅動硬碟,並mount硬碟上的文件系統,也就是將hdc-0.11.img內鏡像的文件系統掛載到0.11系統內的根目錄——“/”。在0.11下訪問文件系統,訪問的就是hdc-0.11.img文件內虛擬的文件系統。
hdc-0.11.img文件的格式是Minix文件系統的鏡像。Linux所有版本都支持這種格式的文件系統,所以可以直接在宿主Linux上通過mount命令訪問此文件內的文件,達到宿主系統和bochs內運行的Linux 0.11之間交換文件的效果。Windows下目前沒有(或者是還沒發現)直接訪問Minix文件系統的辦法,所以要藉助於fdb.img,這是一個1.44M軟盤的鏡像文件,內部是FAT12文件系統。將它掛載到bochs的軟碟機B,就可以在0.11中訪問它。而通過filedisk或者WinImage,可以在Windows下訪問它內部的文件。
hdc-0.11.img內包含有:
- Bash shell
- 一些基本的Linux命令、工具,比如cp、rm、mv、tar。
- vi編輯器
- gcc 1.4編譯器,可用來編譯標準C程式
- as86和ld86
- Linux 0.11的源代碼,可在0.11下編譯,然後覆蓋現有的二進位內核
實驗環境搭建(ubuntu-14.04.1-desktop-amd64)
1,在~(用戶Home文件夾)下創建oslab文件夾,將hit-oslab-linux-20110823.tar.gz解壓到oslab下
mkdir oslab cd oslab tar -zxvf hit-oslab-linux-20110823.tar.gz
2,gcc-3.4安裝
cd gcc-3.4 sudo apt-get --purge remove gcc
sudo chmod 777 * sudo dpkg -i *.deb
3,as86,ld86安裝(用於編譯和鏈接linux/boot下的bootsect.s和setup.s,它們採用as86彙編語法;而linux-0.11下的其他彙編語言文件採用gas的語法AT&T)
搜索包含as86,ld86的包:
apt-cache search as86 ld86
執行結果如下:
bin86 - 16-bit x86 assembler and loader
安裝bin86:
sudo apt-get install bin86
4,一般環境設置
64位系統需要安裝32位相容庫
sudo apt-get install libc6-dev-i386
C語言編譯環境
sudo apt-get install build-essential
安裝IDE
sudo apt-get install vim cscope exuberant-ctags
編譯內核
cd ~/oslab/oslab/linux-0.11 make
編譯中斷,輸出錯誤信息:
In file included from /usr/include/linux/fs.h:10, from tools/build.c:28: /usr/include/linux/ioctl.h:4:23: asm/ioctl.h: No such file or directory In file included from /usr/include/linux/fs.h:11, from tools/build.c:28: /usr/include/linux/types.h:4:23: asm/types.h: No such file or directory In file included from /usr/include/linux/types.h:8, from /usr/include/linux/fs.h:11, from tools/build.c:28: /usr/include/linux/posix_types.h:35:29: asm/posix_types.h: No such file or directory In file included from /usr/include/linux/fs.h:11, from tools/build.c:28: /usr/include/linux/types.h:27: error: syntax error before "__le16" /usr/include/linux/types.h:28: error: syntax error before "__be16" /usr/include/linux/types.h:29: error: syntax error before "__le32" /usr/include/linux/types.h:30: error: syntax error before "__be32" /usr/include/linux/types.h:31: error: syntax error before "__le64" /usr/include/linux/types.h:32: error: syntax error before "__be64" /usr/include/linux/types.h:34: error: syntax error before "__sum16" /usr/include/linux/types.h:35: error: syntax error before "__wsum" In file included from tools/build.c:28: /usr/include/linux/fs.h:43: error: syntax error before "__u64" /usr/include/linux/fs.h:45: error: syntax error before "minlen" make: *** [tools/build] Error 1
google搜索得知是因為64位linux的asm目錄為:
/usr/include/x86_64-linux-gnu/asm
make找不到文件從而導致編譯中斷
解決方法(建立鏈接):
sudo ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/asm
運行
運行編譯好的內核,在oslab目錄下:
./run
出現錯誤:
./bochs/bochs-gdb: error while loading shared libraries: libXpm.so.4: cannot open shared object file: No such file or directory
列印動態鏈接配置:
ldconfig -p | grep libXpm.so.4
libXpm.so.4的鏈接信息:
libXpm.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libXpm.so.4
我們需要的是32位庫.搜索庫對應的包名稱:
apt-file search libXpm.so.4
列印結果:
libxpm4: /usr/lib/x86_64-linux-gnu/libXpm.so.4 libxpm4: /usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0
得到其對應的包名為libxpm4,安裝對應的32位庫:
sudo apt-get install libxpm4:i386
基本操作及註意事項
彙編級調試在oslab目錄下執行命令
./dpg-asm
C語言級調試在oslab目錄下,打開第一個終端視窗執行命令
./dbg-c
打開第二個終端視窗執行命令
./rungdb
Ubuntu和Linux0.11之間的文件交換
oslab下的hdc-0.11-new.img是0.11內核啟動後的根文件系統鏡像文件,相當於在bochs虛擬機里裝載的硬碟。在Ubuntu上訪問其內容的方法是
sudo ./mount-hdc
之後,hdc目錄下就是和0.11內核一模一樣的文件系統了,可以讀寫任何文件(可能有些文件要用sudo才能訪問)。讀寫完畢,不要忘了卸載這個文件系統:
sudo umount hdc
經過sudo ./mount-hdc這樣處理以後,我們可以在Ubuntu的hdc目錄下創建一個xxx.c文件,然後利用Ubuntu上的編輯工具(如gedit等)實現對xxx.c文件的編輯工作,在編輯保存以後。執行sudo umount hdc後,再進入Linux 0.11(即run啟動bochs以後)就會看到這個xxx.c,這樣就避免了在Linux 0.11上進行編輯xxx.c的麻煩,因為Linux 0.11作為一個很小的操作系統,其上的編輯工具只有vi,使用起來非常不便。
另外在Linux 0.11上產生的文件,可以按這種方式”拿到“Ubuntu下用python程式進行處理,當然這個python程式在Linux 0.11上顯然是不好使的,因為Linux 0.11上搭建不了python解釋環境。
註意1:不要在0.11內核運行的時候mount鏡像文件,否則可能會損壞文件系統。同理,也不要在已經mount的時候運行0.11內核。
註意2:在關閉Bochs之前,需要先在0.11的命令行運行“sync”,確保所有緩存數據都存檔後,再關閉Bochs。