Linux0.01內核根目錄Makefile注釋
[導讀]#
#?Makefile?for?linux.
#?If?you?don't?have?'-mstring-insns'?in?your?gcc?(and?nobody?but?me?has?:-)
# #?Makefile?for?linux. #?If?you?don't?have?'-mstring-insns'?in?your?gcc?(and?nobody?but?me?has?:-) #?remove?them?from?the?CFLAGS?defines. # # #8086匯編編譯器和連接器.?-0生成8086目標程序;-a生成與gas和gld部分兼容的代碼 # AS86?=as?-0?-a? CC86?=cc?-0 LD86?=ld?-0 # #GNU匯編編譯器和連接器 # AS?=gas LD?=gld # #GNU連接器gld運行時用到的選項 #-s?輸出文件中省略所有的符號信息 #-x?刪除所有的局部符號 #-M?在標準輸出設備(顯示器)上打印連接映象(link?map). #連接映象:由連接程序產(chǎn)生的一種內存地址映象,其中列出了程序裝入到內存中的位置信息,具體有如下信息: #目標文件及符號信息映射到內存中的位置 #公共符號如何放置 #連接中包含的所有文件成員及其引用的符號 # LDFLAGS?=-s?-x?-M # #gcc是GNU?C程序編譯器,對于UNIX類的腳本程序而言, #在引用定義的標識符時,需在前面加上$符號并用括號括住標識符 # CC?=gcc # #GCC的選項. #-Wall?打印所有的警告信息 #-O?對代碼進行優(yōu)化 #-fstrength-reduce?優(yōu)化循環(huán)語句 # CFLAGS?=-Wall?-O?-fstrength-reduce?-fomit-frame-pointer?-fcombine-regs # #CPP是gcc的預處理程序 #-nostdinc?-Iinclude?不要搜索標準的頭文件目錄中的文件, #而是使用-I選項指定的目錄或者是在當前的目錄里搜索頭文件 # CPP?=gcc?-E?-nostdinc?-Iinclude #? #?kernel目錄,mm目錄,fs目錄所產(chǎn)生的目標代碼文件。 #?為了方便引用,在這里將它們用ARCHIVES(歸檔文件)標識符表示 # ARCHIVES=kernel/kernel.o?mm/mm.o?fs/fs.o # #?由lib/目錄中生成的通用庫文件 # LIBS?=lib/lib.a # #?make隱式后綴規(guī)則 #?指示make利用下面的命令將所有的.c文件編譯生成.s匯編程序 #?':'表示下面是該規(guī)則的命令 #?規(guī)則:指使gcc采用前面CFLAGS所指定的選項以及僅使用include/目錄中的頭文件, #?在適當?shù)木幾g后不進行匯編就停止(-S),從而產(chǎn)生與輸入的各個C文件對應的匯編語言形式的代碼文件。 #?默認情況下所產(chǎn)生的匯編程序文件是原C文件名去掉.c而加上.s后綴。 #?-o表示其后是輸出文件的形式。 #?其中$*.s(或$@)是自動目標變量,$<代表第一個先決條件,這里即是符合條件*.c的文件。 # .c.s: $(CC)?$(CFLAGS)? -nostdinc?-Iinclude?-S?-o?$*.s?$< # #?將所有.s匯編程序文件編譯成.o目標文件。下一條是實現(xiàn)該操作的具體命令 #?使用gas編譯器將匯編程序編譯成.o目標文件。-c表示只編譯或匯編,但不進行連接操作 # .s.o: $(AS)?-c?-o?$*.o?$< # #?使用gcc將c語言編譯成目標文件但不連接 # .c.o: $(CC)?$(CFLAGS)? -nostdinc?-Iinclude?-c?-o?$*.o?$< # #?all表示創(chuàng)建Makefile所知的最頂層目標。這里即是image文件 # all:?Image # #?第一行說明:目標文件(Image文件)是由分號后面的3個元素產(chǎn)生 #?下面兩行是執(zhí)行的命令 #?第一行表示使用tools目錄下的build工具程序將boot,system文件組裝成內核映象文件Image #?第二行的sysn同步命令是迫使緩沖塊數(shù)據(jù)立即寫盤并更新超級塊 # Image:?boot/boot?tools/system?tools/build tools/build?boot/boot?tools/system?>?Image sync #chmem?--?修改系統(tǒng)內存數(shù)據(jù) tools/build:?tools/build.c $(CC)?$(CFLAGS)? -o?tools/build?tools/build.c chmem?+65000?tools/build # #?利用上面的.s.o規(guī)則生成head.o文件 # boot/head.o:?boot/head.s # #?最后的>System.map表示gld需要將連接映象重定向存放在System.map文件中 # tools/system:?boot/head.o?init/main.o? $(ARCHIVES)?$(LIBS) $(LD)?$(LDFLAGS)?boot/head.o?init/main.o? $(ARCHIVES)? $(LIBS)? -o?tools/system?>?System.map # #?內核目標模塊kernel.o # kernel/kernel.o: (cd?kernel;?make) # #?內核管理模塊mm.o # mm/mm.o: (cd?mm;?make) # #?文件系統(tǒng)目標模塊fs.o # fs/fs.o: (cd?fs;?make) # #?庫函數(shù)lib.a # lib/lib.a: (cd?lib;?make) # #?在boot.s程序開口添加一行有關system文件長度信息 #?首先生成含有?"SYSSIZE?=?文件實際長度"一行信息的tmp.s文件,然后將boot.s文件添加在其后。 #?取得system長度的方法是: #?利用ls命令對system文件進行長列表顯示 #?用grep命令取得列表上文件字節(jié)數(shù)字段信息,并定向保存在tmp.s臨時文件中 #?cut命令用于剪切字符串 #?tr用于去除行尾的回車符 #?(實際長度?+?15)/16用于獲得'節(jié)'表示的長度信息,1節(jié)=16字節(jié) #?用8086匯編和連接器對setup.s文件進行編譯生成setup文件 #?-s表示要取出目標文件中的符號信息 # boot/boot:?boot/boot.s?tools/system (echo?-n?"SYSSIZE?=?(";ls?-l?tools/system?|?grep?system? |?cut?-c25-31?|?tr?'