清华操作系统实验课程实验一:系统软件启动过程
ucore_lab1_練習一
(本示例中,如果輸入行前面出現美元符號($),表示這是命令行提示符。緊接其后的是命令行,可以通過控制臺輸入命令)
理解通過make生成執行文件的過程
通過靜態分析代碼來了解:
注:前面為一些基礎知識,看題目答案可直接到:二、make生成過程分析 中的 第2點 和 第3點
一、預備知識
關于編譯和鏈接:程序編譯的過程
對于在沒有匯編知識的時候有些不理解,所以寫一下
類似于C、C++,有一個源文件,在Windows下也就是 .asm 文件。
編譯過程首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o文件,即 Object File,這個動作叫做編譯(compile)。然后再把大量的Object File合成執行文件,這個動作叫作鏈接(link),也就是把==.obj== 文件進行鏈接。
關于gcc:
GCC 編譯器是 Linux 下默認的 C/C++ 編譯器,大部分 Linux 發行版中都是默認安裝的。GCC 編譯器通常以 Linux 命令的形式在終端(Shell)中使用,它有很多選項。
GCC 僅僅是一個編譯器,沒有界面,必須在命令行模式下使用。通過gcc命令就可以將源文件編譯成可執行文件。
GCC 既可以一次性完成C語言源文件的編譯,也可以分步驟完成。
(這里給出一些這次實驗用到的gcc命令,更詳細gcc教程參考:)
1. 在類 Unix 操作系統(Unix、Linux、Mac OS 等)中檢測是否已經安裝GCC編譯器
$ gcc --version
如圖“cc”也可以
2. gcc 命令
-c選項表示編譯、匯編指定的源文件(也就是編譯源文件),但是不進行鏈接。使用-c選項可以將每一個源文件編譯成對應的目標文件。
目標文件是一種中間文件或者臨時文件,如果不設置該選項,gcc 一般不會保留目標文件,可執行文件生成完成后就自動刪除了。
例如:
$ gcc -c bootmain.c
編譯bootmain.c源文件
它的用法為:
$ [infile] -o [outfile]
[infile] 表示輸入文件(也即要處理的文件),它可以是源文件,也可以是匯編文件或者是目標文件;[outfile] 表示輸出文件(也即處理的結果),它可以是預處理文件、目標文件、可執行文件等。
關于gdb
UNIX及UNIX-like下的調試工具。具有修復網絡斷點以及恢復鏈接等功能,比BCB的圖形化調試器有更強大的功能。
GDB主要幫助你完成下面四個方面的功能:
1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、你可以改變你的程序,將一個BUG產生的影響修正從而測試其他BUG。
關于Makefile
所要完成的Makefile 文件描述了整個工程的編譯、連接等規則。其中包括:工程中的哪些源文件需要編譯以及如何編譯、需要創建哪些庫文件以及如何創建這些庫文件、如何最后產生我們想要的可執行文件。
makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。
二、make生成過程分析
1、執行Makefile文件的方法
進入 Makefile 文件所在位置執行 make 命令
$ cd [文件位置]
1是文件位置,用清華的系統應該都是這個位置,
進入文件后用命令
$ ls
看到有Makefile文件,執行make命令
$ make
如果已經執行過make文件則會顯示nothing to be啥啥啥,用以下命令清除之前make的執行結果:
$ make clean
然后看到 + cc 我覺得就是在調用gcc 編譯器編譯 .c 文件,然后執行結果生成一個名為 obj 的文件夾
然后執行命令:
$ man make
可以看到應該是關于make命令的使用手冊
2、Makefile文件干了什么,如何一步一步生成本次實驗問的鏡像文件ucore.img
1、用make V=命令查看make命令的詳細執行過程
$ make V=
然后顯示makefile文件詳細執行過程
其中:
1、
+cc kern/init/init.c
表示編譯了 kern/init 文件中的 init.c 文件
-ggdb : 生成可供gdb使用的調試信息
-m32 :生成適用于32位環境的代碼
-gstabs :生成stabs格式的調試信息
-nostdinc :不在標準系統文件夾尋找頭文件,只在-I等參數指定的文件夾中搜索頭文件
-fno-stack-protector :不生成用于檢測緩沖區溢出的代碼
-Os 為減小代碼大小而進行優化
標黑的一段表示將 init.c 文件編譯為輸出文件 init.o 并放入 obj 文件夾中
之后的類似的+cc開頭的代碼均執行了這樣一個過程
2、
這里的 .S 文件是經過預編譯的匯編語言源代碼文件
3、
ld 命令目標文件轉化成可執行程序,這里轉化成 bootblock.out,可以理解成一個Bootloader的執行程序
4、
dd 命令把Bootloader放到一個虛擬的硬盤里去,這里生成一個虛擬硬盤叫 uCore.img ,這個虛擬硬盤就會基于里面的數據來執行相應的代碼
5、
這里生成兩個軟件,第一個是Bootloader,第二個是kernel,kernel是uCore的組成部分
3、被系統認為是符合規范的硬盤主引導扇區的特征
這里需要看一下一個文件:
在tools文件夾中的sign.c文件,這個文件中完成了特征的標記
查看sign.c文件內容:
按照這個文件的描述,需要檢查以下幾點:
輸入的主引導扇區的記錄必須是510字節以內(446+64)
輸出的主引導扇區的最后兩個字節是55AA
bootblock就是需要用到的主引導扇區
總結
以上是生活随笔為你收集整理的清华操作系统实验课程实验一:系统软件启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python为什么流行头上长草_为什么“
- 下一篇: java信息管理系统总结_java实现科