久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Knivo - ChinaUnix博客 - IT人與你分享快樂生活

 jijo 2011-03-07

內(nèi)核Makefile的框架



      
<linux2.6.xx>
       ---------------------->
       |
       |- Makefile
       |
       |- .config
       |
       |- arch
       |      |- $(ARCH)
       |               |- Makefile
       |
       |- scripts
       |      |- Makefile.*
       |
       |- <almost each directory>
       |      |- kbuild Makefile

      
#
頂層Makefile   

          
根據(jù)內(nèi)核配置文件,,通過向下訪問makefile的方式,制作內(nèi)核文件vmlinux與模塊文件,。

      
# .config

          
有內(nèi)核配置程序所生成,。

      
# arch/$(ARCH)/Makefile

          
向頂層Makefile提供硬件架構(gòu)的特別信息,,與對(duì)象機(jī)器硬件架構(gòu)對(duì)應(yīng)的Makefile會(huì)被頂

           層Makefile所包含。

      
#  scripts/Makefile.*

           
包含用于編譯內(nèi)核的kbuild Makefile規(guī)則,。

      
#  kbuild Makefile

           
執(zhí)行上層Makefile傳遞下來(lái)的命令,,從.config中提取信息,生成Kbuild,,完成內(nèi)核編

           譯所需的文件列表,。

 

----------------------------------------------------------------------------------

.config

      .config文件可以被理解為一個(gè)Makefile的變量表,該文件記錄了內(nèi)核Makefile中與特定文件

      編譯是否被編譯相關(guān)變量的值,。內(nèi)核配置程序根據(jù)每個(gè)目錄下的KCONFIG文件生成內(nèi)核配置程序

      選項(xiàng)界面,,用戶通過該界面設(shè)定了需要編譯的功能,內(nèi)核配置程序再根據(jù)KCONFIG中的內(nèi)容生成

      了不同的變量,,并把該變量導(dǎo)入到.config,,供內(nèi)核編譯時(shí)參照調(diào)用。

      

---------------------------------------------------------------------------------

架構(gòu)Makfile

 

        頂層Makefile為各子目錄下Makefile包含的公共部分,而頂層Makefile又首先包含了arch/

        $(ARCH)/Makefile,。該架構(gòu)Makefile包含了針對(duì)特定架構(gòu)的配置信息,,相關(guān)變量及目標(biāo)等。

        一具體架構(gòu)Makefile的具體目的就是,,將生成并壓縮 vmlinux 文件,,寫入啟動(dòng)代碼,并將其拷

        貝到正確的位置,。這就包含了多種不同的安裝命令,。該具體目的也無(wú)法在各個(gè)平臺(tái)間進(jìn)行標(biāo)

        準(zhǔn)化。一般,,附加的處理命令入在arch/$(ARCH)/下的boot目錄,。

 

 

----------------------------------------------------------------------------------

Kbuild文件

 

       內(nèi)核使用Kbuild組織Kbuild Makefile。如果同一目錄中同時(shí)出現(xiàn)MakefileKbuild,,

       Kbuild將會(huì)被使用,。

       編譯內(nèi)核文件的主要目標(biāo)有兩個(gè):分別是obj-yobj-m

       Kbuild Makefile規(guī)定所有編譯進(jìn)內(nèi)核的目標(biāo)文件存在$(obj-y)列表中,,編譯成模塊的

       目標(biāo)文件存在$(obj-m)列表中,。而這些列表依賴內(nèi)核的配置文件。

       修改目標(biāo)內(nèi)容采用以下方式:

              obj-$(CONFIG_<obj_dir_name>) = filename.o

       此語(yǔ)句告訴內(nèi)核,,當(dāng)前目錄下有一名為filename.o的目標(biāo),。此目標(biāo)將由filename.c

       filename.s文件編譯得到。

       CONFIG_<obj_dir_name>          

       Makefile只對(duì)當(dāng)前目錄對(duì)象負(fù)責(zé),,Kbuild通過辨別Kconfig中CONFIG_<obj_dir_name>

      的值來(lái)判斷是否應(yīng)該遞歸操作,但是它指代的值只能夠是y(編譯進(jìn)內(nèi)核)m(編譯成模塊),,其

       余值一律不會(huì)被編譯鏈接, 如:

             #fs/Makefile

             obj-$(CONFIG_EXT2_FS) = ext2/

       如果,CONFIG_EXT2_FS的值有效,Kbuild就會(huì)遞歸訪問ext2目錄,,遞歸的原因是ext2/是一個(gè)目錄,,

       再調(diào)用該目錄下的Makefile進(jìn)行編譯操作。

 

----------------------------------------------------------------------------------

 Kbuild執(zhí)行的步驟

 

             1) 根據(jù)內(nèi)核配置生成文件 .config

             2) 將內(nèi)核的版本號(hào)存儲(chǔ)在 include/linux/version.h

             3) 生成指向 include/asm-$(ARCH) 的符號(hào)鏈接

             4) 更新所有編譯所需的文件:

                 -附加的文件由 arch/$(ARCH)/Makefile 指定,。

             5) 遞歸向下訪問所有在下列變量中列出的目錄:

                  init-* core* drivers-* net-* libs-*

                并編譯生成目標(biāo)文件,。

                  -這些變量的值可以在 arch/$(ARCH)/Makefile 中擴(kuò)充。

             6) 鏈接所有的目標(biāo)文件,,在源代碼樹頂層目錄中生成 vmlinux,。

                 最先聯(lián)接是在 head-y中列出的文件,該變量由

                   arch/$(ARCH)/Makefile 賦值,。

             7) 最后完成具體架構(gòu)的特殊要求,,并生成最終的啟動(dòng)鏡像。

                  -包含生成啟動(dòng)指令

                  -準(zhǔn)備 initrd 鏡像或類似文件

 

----------------------------------------------------------------------------------

目標(biāo) obj-y

              1). Kbuild編譯所有的$(obj-y)文件,,然后,,然后將它們鏈接為build-in.o文件,,最后

                  鏈接到vmlinux中。

              2). 相同的目標(biāo)可以在obj-y列表中重復(fù)出現(xiàn),,已成功鏈接到built-in.o的目標(biāo)會(huì)被忽略,。

              3). 目標(biāo)鏈接時(shí)是按順序的。如果鏈接順序出錯(cuò),,有可能造成硬盤數(shù)據(jù)出錯(cuò),。

 

----------------------------------------------------------------------------------

目標(biāo) obj-m

              1). 一個(gè)文件編譯一個(gè)模塊

                  obj-$(CONFIG_<obj_dir_name>) = <module_name>.o

              2). 多個(gè)文件編譯一個(gè)模塊

                  obj-$(CONFIG_<obj_dir_name>) = <module_name>.o
                  <module_name>-objs := obj_file_1.o ... obj_file_n.o

                  Kbuild能夠識(shí)別目標(biāo)文件的后綴為-objs-ykbuild通過CONFIG_符號(hào)來(lái)判斷對(duì)象是

                  否用于組合,。

 

----------------------------------------------------------------------------------

編輯標(biāo)志

       下面標(biāo)志僅在它們所被指定的Kbuild makefile有效。

       ccflags-y 

         用于編譯C源代碼的編譯選項(xiàng),。源代碼樹擁有,。

       asflags-y  

          用于編譯匯編源代碼的編譯選項(xiàng)。當(dāng)前目錄擁有,。

       ldflags-y 

          用于鏈接目標(biāo)文件的選項(xiàng),。當(dāng)前目錄擁有。

       CFLAGS_$(filename), AFLAGS_$(filenam)

          編譯源代碼選項(xiàng),,單個(gè)文件擁有的,。

----------------------------------------------------------------------------------

依賴跟蹤

       改變下面任意項(xiàng)內(nèi)容,所有受影響文件將會(huì)重新被編譯,。

       1). 所有參與編譯的文件(*.o*.h)

       2). 所有參與使用的CONFIG_項(xiàng)

       3). 用于編譯的命令行 

 

----------------------------------------------------------------------------------

                                   相關(guān)變量列表

----------------------------------------------------------------------------------

KERNELRELEASE


                $(KERNELRELEASE) 是一個(gè)字符串,,類似"2.4.0-pre4",用于安裝目錄的命名或顯示當(dāng)前的版本號(hào),。

       一部分架構(gòu)Makefile使用該變量,。內(nèi)容通過cat include/config/kernel.release所得。

 

ARCH


       該變量定義了目標(biāo)架構(gòu),,比如"i386","arm" "sparc",。有些Kbuild Makefile

       根據(jù) $(ARCH) 決定編譯哪些文件。


       默認(rèn)情況下,,頂層Makefile將其設(shè)置為本機(jī)架構(gòu),。如果是跨平臺(tái)編譯,用戶可以

       用下面的命令覆蓋該值:


                make ARCH=m68k ...

 

INSTALL_PATH


      該變量為架構(gòu)Makefile定義了安裝內(nèi)核鏡像與 System.map 文件的目錄,。

      主要用來(lái)指明架構(gòu)特殊的安裝路徑,。


 

INSTALL_MOD_PATH,MODLIB


              $(INSTALL_MOD_PATH) 為了安裝模塊,給 $(MODLIB) 聲明了前綴,。該變量不能

      在Makefile中定義,,但可以由用戶傳給Makefile


              $(MODLIB) 具體的模塊安裝的路徑,。頂層Makefile$(MODLIB)定義為

              $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE),。用戶可以通過命令行

      參數(shù)的形式將其覆蓋,。


INSTALL_MOD_STRIP

 

      如果該變量有定義,模塊在安裝之前,,會(huì)被剝出符號(hào)表,。如果

              INSTALL_MOD_STRIP "1",就使用默認(rèn)選項(xiàng) --strip-debug,。否則,,

              INSTALL_MOD_STRIP 將作為命令 strip 的選項(xiàng)使用。

 

---------------------------------------------------------------------------------------------

與設(shè)備驅(qū)動(dòng)相關(guān)的瑣碎

 

     . 編譯額外模塊

        make M=dir modules       頂層Makefile會(huì)調(diào)用dir目錄下的Makefile去構(gòu)造額外模塊


 


 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多