【操做系統學習】1、熟悉實驗環境實驗報告

本門課的基本流程

實驗的基本流程是根據實驗要求編寫應用程序、修改Linux 0.11的源代碼,用gcc編譯後,在Bochs的虛擬環境中運行、調試目標代碼。python

實驗的基本工具及介紹(部分谷歌)

X86模擬器Bochs:

Bochs是一個免費且開放源代碼的IA-32(x86)架構PC機模擬器,注意是PC機模擬器,故他能夠模擬硬件配置,同時能夠模擬整個pc的I/O設備、內存和BIOS。不光能夠運行linux,還能夠模擬運行DOS和各類版本的Windows等多種操做系統。linux

特色
*很高的可移植性:因此本門課選用它
*運行效率低於虛擬機:由其原理決定,但在本實驗不會太明顯。
*相比於虛擬機:有着強大的沒法比擬的調試操做系統的能力shell

【注】本實驗的hit-oslab已經內置了bochs編程

GCC編譯器

編譯器:緩存

是一種計算機程序,它會將用某種編程語言寫成的源代碼(原始語言),轉換成另外一種編程語言(目標語言) 一個現代編譯器的主要工做流程以下: 源代碼(source code)→ 預處理器(preprocessor)→ 編譯器(compiler)→ 彙編程序(assembler)→ 目標代碼(object code)→ 連接器(Linker)→ 可執行文件(executables), 最後打包好的文件就能夠給電腦去判讀運行了。架構

本門課程採用的GCC編譯器,GCC是和Linux一塊兒成長起來的編譯器。Linux最初的版本就是由GCC編譯的。如今GCC也是在自由軟件領域應用最普遍的編譯器。因此,咱們也選擇GCC作爲本書實驗的指定編譯器。編程語言

DB調試器

調試器的基本功能
一、控制軟件運行
調試器的最基本功能就是將一個飛速運行的程序中斷下來,而且使其按照用戶的意願執行。調試器是靠迫使目標程序觸發一個精心構造的異常來完成這些工做的。
二、查看軟件運行中信息
查看軟件的當前信息,這些信息包含但不限於當前線程的寄存器信息,堆棧信息、內存信息、當前EIP附近的反彙編信息等。
三、修改軟件執行流程
修改內存信息、反彙編信息、堆棧信息、寄存器信息等等。編輯器

GDB調試器是GCC編譯器的兄弟。作爲自由軟件領域幾乎是惟一的調試器,它秉承了*nix類操做系統的一向風格,採用純命令行操做,有點兒相似dos下的debug。關於它的使用方法請看GDB使用手冊。工具

Ubuntu (GNU/Linux)

Ubuntu(友幫拓、優般圖、烏班圖)是一個以桌面應用爲主的開源GNU/Linux操做系統,Ubuntu 是基於Debian GNU/Linux,支持x8六、amd64(即x64)和ppc架構,由全球化的專業開發團隊(Canonical Ltd)打造的spa

主要特色是易用,很是的易用。

實驗室的工做模式

hit-oslab實驗環境簡稱oslab,是一個壓縮文件(hit-oslab-linux-20110823.tar.gz)。

首先找到壓縮文件 並在終端轉換至該文件夾 用tar zxvf hit-oslab-linux-20110823.tar.gz
命令解壓便可工做

解壓的目錄如圖:

clipboard.png

oslab的工做原理

oslab工做在一個宿主操做系統之上,在這個宿主系統之上完成對Linux的開發、編譯、修改以後,會在linux-0.11文件夾下生成一個名爲Image的文件。(參照上圖理解)這個就是編譯後的目標文件。

這個文件包含引導和全部內核的二進制代碼。若是拿來一張軟盤,從他的0磁道0扇區開始,逐字節寫入Image的文件,它就能夠用這張軟盤啓動一臺真正的計算機!

oslab採用的是bochs模擬器來加載這個Image文件,模擬執行Linux 0.11,這樣就省卻了從新啓動計算機的麻煩!

解壓文件後咱們看到bochs目錄,此目錄就是與bochs相關的執行文件、數據文件和配置文件。使用run命令運行bochs後,會建立兩個,一個是虛擬硬盤,一個是虛擬軟驅A,在軟驅軟驅關在的是剛纔說的Image文件,而在硬盤上掛載的是hdc-0.11.img。由於是從軟驅A啓動,因此Linux0.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下編譯,而後覆蓋現有的二進制內核

使用方法

準備活動

  • cd ~/oslab

把當前目錄切換到oslab下,用pwd命令確認,用「ls -l」列目錄內容。本實驗的全部內容都在本目錄或其下級目錄內完成。

  • 編譯內核

「編譯內核」比「編寫內核」要簡單得多。首先要進入linux-0.11目錄,而後執行:

$ make all

由於「all」是最經常使用的參數,因此能夠省略,只用「make」,效果同樣。

在多處理器的系統上,能夠用-j參數進行並行編譯,加快速度。例如雙CPU的系統能夠:

$ make -j 2

make命令會顯示不少不少不少的信息,你能夠儘可能去看懂,也能夠裝做沒看見。只要最後幾行中沒有「error」就說明編譯成功。最後生成的目標文件是一個軟盤鏡像文件——linux-0.11/Image。若是將此鏡像文件寫到一張1.44MB的軟盤上,就能夠啓動一臺真正的計算機。

linux-0.11目錄下是所有的源代碼,不少實驗內容都是要靠修改這些代碼來完成。修改後須要從新編譯內核,仍是執行命令:

$ make all

make命令會自動跳過未被修改的文件,連接時直接使用上次編譯生成的目標文件,從而節約編譯時間。但若是從新編譯後,你的修改貌似沒有生效,能夠試試先「make clean」,再「make all」「make clean」是刪除上一次編譯生成的全部中間文件和目標文件,確保是在全新的狀態下編譯整個工程。

  • 運行和調試

在Bochs中運行最新編譯好的內核很簡單,在oslab目錄下執行:

$ ./run

若是出現Bochs的窗口,裏面顯示linux的引導過程,最後中止在「[/usr/root/]#」,表示運行成功。

  • 內核調試分爲兩種模式:彙編級調試和C語言級調試。

彙編級調試須要執行命令:

$ ./dbg-asm

能夠用命令help來查看調試系統用的基本命令。更詳細的信息請查閱Bochs使用手冊。

C語言級調試稍微複雜一些。首先執行以下命令:

$ ./dbg-c

而後再打開一個終端窗口,進入oslab目錄後,執行:

$ ./rungdb

新終端窗口中運行的是GDB調試器。關於gdb調試器請查閱GDB使用手冊。

Ubuntu和Linux 0.11之間的文件交換
oslab下的hdc-0.11-new.img是0.11內核啓動後的根文件系統鏡像文件,至關於在bochs虛擬機裏裝載的硬盤。在Ubuntu上訪問其內容的方法是(你們使用sudo時,password是shiyanlou):

1.使用$ sudo ./mount-hdc,將linux 0.11文件系統掛載到hdc目錄下
2.hdc目錄就是和linux 0.11內核如出一轍的文件
3.而後就能夠直接在hdc目錄下操做了, 好比能夠在hdc目錄下新建一個hello.c
$ 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上產生的文件,如後面實驗中產生的process.log文件,能夠按這種方式」拿到「Ubuntu下用python程序進行處理,固然這個python程序在Linux 0.11上顯然是很差使的,由於Linux 0.11上搭建不了python解釋環境。

【注】:不要在0.11內核運行的時候mount鏡像文件,不然可能會損壞文件系統。同理,也不要在已經mount的時候運行0.11內核。

【注】:在關閉Bochs以前,須要先在0.11的命令行運行「sync」,確保全部緩存數據都存盤後,再關閉Bochs。

相關文章
相關標籤/搜索