makefile文件:
makefile 文件是make 工具程序的配置文件。make 程序是使用Makefile數據文件和代碼文件的最后修改時間(last-modification time)來肯定那些文件需要進行更新,對每個需要更新的文件它會根據Makefile 中的信息發出相應的命令。在Makefile 文件中,開頭為'#'的行是注釋行。文件開頭部份的'='賦值語句定義了1些參數或命令的縮寫。在援用定義的標識符時,需在前面加上$符號并用括號括住標識符。前1行最后的''符號表示下1行是續行。all 表示創建Makefile
所知的最頂層的目標。dep: 該目標或規則用于各文件之間的依賴關系。創建的這些依賴關系是為了給make 用來肯定是不是需要要 重建1個目標對象的。
簡單的makefile 文件含有1些規則,這些規則具有以下的情勢:
目標(target)... : 先決條件(prerequisites)...
命令(command)
...
...
其中'目標'對象通常是程序生成的1個文件的名稱;例如是1個可履行文件或目標文件。目標也能夠是所要采取活動的名字,比如'清除'('clean')。'先決條件'是1個或多個文件名,是用作產生目標的輸入條件。通常1個目標依賴幾個文件。而'命令'是make 需要履行的操作。1個規則可以有多個命令,每個命令自成1行。請注意,你需要在每一個命令行之前鍵入1個制表符。自動變量的值是基于目標對象及其先決條件而在命令履行前設置的。例如,’$^’的值表示規則的所有先決條件,包括它們所處目錄的名稱;’$<’的值表示規則中的第1個先決條件;’$@’表示目標對象
.c.s: # make 老式的隱式后綴規則。該行唆使make 利用下面的命令將所有的 .c 文件編譯生成.s 匯編程序。':'表示下面是該規則的命令。
$*.s(或$@)# 是自動目標變量,$<代表第1個先決條件,這里即是符合條件 *.c 的文件。
(cd kernel/math; make)計入子目錄履行make命令
內核的編譯進程:對boot/中的bootsect.s、setup.s 使用8086 匯編器進行編譯,分別生成各自的履行模塊。再對源代碼中的其它所有程序使用GNU 的編譯器gcc/gas 進行編譯,并連接成模塊system。再用build 工具將這3塊組合成1個內核映象文件image.
as86 和ld86 是由Bruce Evans 編寫的Intel 8086 匯編編譯程序和連接程序。它完全是1個8086的匯編編譯器,但卻可以為386 處理器編制32 位的代碼。Linux 使用它僅僅是為了創建16 位的啟動扇區(bootsector)代碼和setup 2進制履行代碼。該編譯器的語法與GNU 的匯編編譯器的語法是不兼容的,但近似于Intel 的匯編語言語法(如操作數的次序相反等)。
Linux 操作系統啟動部份的主要履行流程:
PC 的電源打開后,80x86 結構的CPU 將自動進入實模式,并從地址0xFFFF0 開始自動履行程序代碼,這個地址通常是ROM-BIOS 中的地址。PC 機的BIOS 將履行某些系統的檢測,并在物理地址0 處開始初始化中斷向量。爾后,它將可啟動裝備的第1個扇區(磁盤引導扇區,512 字節)讀入內存絕對地址0x7C00 處,并跳轉到這個地方。啟動裝備
通常是軟驅或是硬盤
Linux 的最最前臉部分是用8086 匯編語言編寫的(boot/bootsect.s),它將由BIOS 讀入到內存絕對地址0x7C00(31KB)處,當它被履行時就會把自己移到絕對地址90000(576KB)處,并把啟動裝備中后2kB 字節代碼(boot/setup.s)讀入到內存0x90200 處,而內核的其它部份(system 模塊)則被讀入到從地址0x10000 開始處,由于當時system 模塊的長度不會超過0x80000 字節大小(即512KB),所以它不會覆蓋在0x90000 處開始的bootsect
和setup 模塊。隨后將system 模塊移動到內存起始處,這樣system模塊中代碼的地址也即等于實際的物理地址。便于對內核代碼和數據的操作。然后將全部系統從地址0x10000 移至0x0000 處,進入保護模式并跳轉至系統的余下部份(在0x0000 處)。
此時所有32 位運行方式的設置啟動被完成: IDT、GDT 和LDT 被加載,處理器和協處理器也已確認,分頁工作也設置好了;終究調用init/main.c 中的main()程序。上述操作的源代碼是在boot/head.S 中的。
(42)