




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌入式Linux內(nèi)核體系(tx)架構(gòu)李超lichao九十七頁嵌入式Linux內(nèi)核(ni h)總論PART ONE共九十七頁 更新(gngxn)目標(biāo)板上的系統(tǒng)嵌入式LinuxRedhatLinuxzImage2410.cramfs借助開發(fā)板上的Bootloader共九十七頁嵌入式Linux啟動(qdng)vivi(啟動(qdng)區(qū))zImage(內(nèi)核區(qū))根文件系統(tǒng)區(qū)其它文件系統(tǒng)區(qū)共九十七頁知識(zh shi)回顧Linux系統(tǒng)由內(nèi)核和文件系統(tǒng)兩大部分構(gòu)成內(nèi)核各個(gg)模塊之間相互聯(lián)系,密不可分內(nèi)核文件系統(tǒng)文件文件文件文件文件文件進程管理內(nèi)存管理文件系統(tǒng)網(wǎng)絡(luò)協(xié)議棧設(shè)備
2、驅(qū)動管理底層硬件共九十七頁典型Linux系統(tǒng)(xtng)構(gòu)成圖由CPU、內(nèi)存(ni cn)、I/O、硬盤等底層硬件設(shè)備構(gòu)成與計算機硬件進行交互,實現(xiàn)對硬件部件的編程控制和接口操作,調(diào)度對硬件資源的訪問,并為計算機上的用戶程序提供一個高級的執(zhí)行環(huán)境和對硬件的虛擬接口。指那些向用戶提供的服務(wù)被看作是操作系統(tǒng)部分功能的程序是指那些字處理程序、Internet 瀏覽器程序或用戶自行編制的各種應(yīng)用程序共九十七頁1.Linux內(nèi)核(ni h)模式操作系統(tǒng)內(nèi)核的結(jié)構(gòu)模式主要可分為整體式的單內(nèi)核模式和層次式的微內(nèi)核模式在單內(nèi)核模式的系統(tǒng)中,操作系統(tǒng)所提供服務(wù)的流程為:應(yīng)用主程序使用指定的參數(shù)值執(zhí)行系統(tǒng)調(diào)用指令
3、(int x80),使CPU 從用戶態(tài)(User Mode)切換到核心態(tài)(Kernel Model),然后操作系統(tǒng)根據(jù)具體的參數(shù)值調(diào)用特定的系統(tǒng)調(diào)用服務(wù)程序,而這些服務(wù)程序則根據(jù)需要再底層的一些(yxi)支持函數(shù)以完成特定的功能。在完成了應(yīng)用程序所要求的服務(wù)后,操作系統(tǒng)又從核心態(tài)切換回用戶態(tài),返回到應(yīng)用程序中繼續(xù)執(zhí)行后面的指令共九十七頁2.Linux 內(nèi)核系統(tǒng)(xtng)模塊體系結(jié)構(gòu)進程(jnchng)調(diào)度模塊內(nèi)存管理模塊文件系統(tǒng)模塊進程間通信模塊網(wǎng)絡(luò)接口模塊負責(zé)控制進程對CPU 資源的使用。所采取的調(diào)度策略是各進程能夠公平合理地訪問CPU,同時保證內(nèi)核能及時地執(zhí)行硬件操作用于確保所有進程能夠
4、安全地共享機器主內(nèi)存區(qū),同時,內(nèi)存管理模塊還支持虛擬內(nèi)存管理方式,使得Linux 支持進程使用比實際內(nèi)存空間更多的內(nèi)存容量。用于支持對外部設(shè)備的驅(qū)動和存儲。虛擬文件系統(tǒng)模塊通過向所有的外部存儲設(shè)備提供一個通用的文件接口,隱藏了各種硬件設(shè)備的不同細節(jié)。從而提供并支持與其它操作系統(tǒng)兼容文件系統(tǒng)格式提供對多種網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的訪問并支持許多網(wǎng)絡(luò)硬件用于支持多種進程間的信息交換方式共九十七頁共九十七頁嵌入式內(nèi)核知識點講解(jingji)大綱內(nèi)存管理進程中斷、異常和系統(tǒng)調(diào)用文件系統(tǒng)進程間通信設(shè)備驅(qū)動(q dn)信號共九十七頁PART TWO ARM-Linux下配置(pizh)系統(tǒng)分析共九十七頁前言(qin
5、 yn)眾所周知,Linux內(nèi)核中集結(jié)了很多Linux愛好者的智慧,它的每一部分代碼都可能出自(ch z)不同編程者之手。但是很奇怪的是Linux內(nèi)核并沒有因此成為一個繁雜、冗余的結(jié)構(gòu),相反它的結(jié)構(gòu)非常簡潔,擴展性能非常好,所有這些得益于Linux具有非常優(yōu)秀的配置系統(tǒng)。下面就來深入分析Linux的配置系統(tǒng) 共九十七頁可執(zhí)行文件的實質(zhì)(shzh)/hello1.c#include void printhello1()printf(“hello-1 world”);/hello2.c#include void printhello2()printf(“hello-2 world”);/main.
6、cvoid main()printhello1();printhello2();編譯(biny)源文件:#arm-linux-gcc -o hello1.o -c hello1.c#arm-linux-gcc -o hello2.o -c hello2.c#arm-linux-gcc -o main.o -c main.c將得到hello1.o、hello2.o和main.o三個目標(biāo)文件 共九十七頁可執(zhí)行文件的實質(zhì)(shzh)(CONT.)rootlocalhost exa3-1# arm-linux-objdump -d hello1.ohello1.o: file format elf32
7、-littlearmDisassembly of section .text:00000000 : 0: e1a0c00d mov ip, sp 4: e92dd800 stmdb sp!, fp, ip, lr, pc 8: e24cb004 sub fp, ip, #4 ; 0 x4 c: e59f0004 ldr r0, pc, #4;18 10: ebfffffe bl 0 14: ea000005 b 1c 18: 00000000 andeq r0, r0, r0 1c: e91ba800 ldmdb fp, fp, sp, pc共九十七頁可執(zhí)行文件的實質(zhì)(shzh)(CONT.)
8、rootlocalhost exa3-1# arm-linux-objdump -d hello2.ohello2.o: file format elf32-littlearmDisassembly of section .text:00000000 : 0: e1a0c00d mov ip, sp 4: e92dd800 stmdb sp!, fp, ip, lr, pc 8: e24cb004 sub fp, ip, #4 ; 0 x4 c: e59f0004 ldr r0, pc, #4; 18 10: ebfffffe bl 0 14: ea000005 b 1c 18: 000000
9、00 andeq r0, r0, r0 1c: e91ba800 ldmdb fp, fp, sp, pc 共九十七頁可執(zhí)行文件的實質(zhì)(shzh)(CONT.)rootlocalhost exa3-1# arm-linux-objdump -d main.omain.o: file format elf32-littlearmDisassembly of section .text:00000000 : 0: e1a0c00d mov ip, sp 4: e92dd800 stmdb sp!, fp, ip, lr, pc 8: e24cb004 sub fp, ip, #4 ; 0 x4 c
10、: ebfffffe bl 0 10: ebfffffe bl 0 14: e91ba800 ldmdb fp, fp, sp, pc共九十七頁可執(zhí)行文件的實質(zhì)(shzh)(CONT.)rootlocalhost exa3-1# arm-linux-gcc -o hello main.o hello1.o hello2.orootlocalhost exa3-1# arm-linux-objdump -d hellohello: file format elf32-littlearm 000083a0 : 83a0: e1a0c00d mov ip, sp 83a4: e92dd800 stm
11、db sp!, fp, ip, lr, pc 83a8: e24cb004 sub fp, ip, #4 ; 0 x4 83ac: eb000001 bl 83b8 83b0: eb000008 bl 83d8 83b4: e91ba800 ldmdb fp, fp, sp, pc000083b8 : 83b8: e1a0c00d mov ip, sp 83bc: e92dd800 stmdb sp!, fp, ip, lr, pc 83c0: e24cb004 sub fp, ip, #4 ; 0 x4 83c4: e59f0004 ldr r0, pc, #4 ; 83d0 83c8: e
12、bffffb5 bl 82a4 83cc: ea000000 b 83d4 83d0: 00008458 andeq r8, r0, r8, asr r4 83d4: e91ba800 ldmdb fp, fp, sp, pc000083d8 : 83d8: e1a0c00d mov ip, sp 83dc: e92dd800 stmdb sp!, fp, ip, lr, pc 83e0: e24cb004 sub fp, ip, #4 ; 0 x4 83e4: e59f0004 ldr r0, pc, #4 ; 83f0 83e8: ebffffad bl 82a4 83ec: ea0000
13、00 b 83f4 83f0: 00008468 andeq r8, r0, r8, ror #8 83f4: e91ba800 ldmdb fp, fp, sp, pc總結(jié)性說明:最終的可執(zhí)行程序hello文件中包含的主體就是main()函數(shù)(hnsh)、printhello1()函數(shù)和printhello2()函數(shù)的可執(zhí)行二進制碼文件。(當(dāng)然還會包含其它段的描述 )共九十七頁內(nèi)核(ni h)文件的實質(zhì)ARM-Linux系統(tǒng)非常龐大,可能涉及到幾千個文件(.C源文件和.S匯編文件),這些文件最終根據(jù)配置系統(tǒng)的結(jié)果進行編譯、連接,形成一個zImage的文件,此文件就是ARM-Linux系統(tǒng)的內(nèi)
14、核壓縮包,其實這個內(nèi)核壓縮包實質(zhì)上仍然(rngrn)是眾多函數(shù)的二進制代碼的集合體。共九十七頁ARM-Linux系統(tǒng)是用戶可裁減的系統(tǒng),那么如何裁減系統(tǒng),又如何將需要的源碼文件和匯編文件編譯、連接成一個可執(zhí)行的zImage文件呢?其實(qsh)這些都是ARM-Linux配置系統(tǒng)的功勞。共九十七頁ARM-Linux配置系統(tǒng)的三駕(sn ji)馬車 配置(pizh)工具配置文件Makefile 共九十七頁arch/arm/config.infs/Config.innet/Config.in配置工具.config配置文件MakefilezImagemake zImage共九十七頁3.1 配置文件在A
15、RM-Linux系統(tǒng)中,配置文件存放在各個子目錄下,它們的名字通常被稱為config.in或Config.in文件,這些文件大概有幾十個,其中存放在arch/arm目錄下的config.in文件為總綱領(lǐng)式配置文件,其它config.in文件都是直接或間接被該文件調(diào)用。這些配置文件按照一定的格式編寫,用戶通過特定的工具可以(ky)讀這些配置文件來進行ARM-Linux系統(tǒng)的配置,最終配置的選項結(jié)果存放在內(nèi)核根目錄.config文件中。 共九十七頁3.2 配置(pizh)工具包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)和配置用戶界面(提供基于字符界面、基于 Ncurses 圖形界面以及
16、基于 Xwindows 圖形界面的用戶配置界面,各自對應(yīng)于 Make config、Make menuconfig 和 make xconfig)。 這些配置工具都是使用腳本語言,如 Tcl/TK、Perl 編寫的(也包含一些用 C 編寫的代碼)。本文并不是對配置系統(tǒng)本身進行分析,而是介紹如何(rh)使用配置系統(tǒng)。所以,除非是配置系統(tǒng)的維護者,一般的內(nèi)核開發(fā)者無須了解它們的原理,只需要知道如何(rh)編寫 Makefile 和配置文件就可以。所以,在本文中,我們只對 Makefile 和配置文件進行討論。另外,凡是涉及到與具體 CPU 體系結(jié)構(gòu)相關(guān)的內(nèi)容,我們都以 ARM 為例,這樣不僅可以將
17、討論的問題明確化,而且對內(nèi)容本身不產(chǎn)生影響。 共九十七頁3.3 MakefileMakefile也是Linux系統(tǒng)中非常重要的一個組成部分,在幾乎每一個子目錄下都會有Makefile文件。其中位于根目錄下的Makefile文件是總綱式Makefile文件,其它任何Makefile文件都是直接或間接被它調(diào)用。Makefile文件定義了各個目錄下文件如何被編譯,并最終形成zImage文件。當(dāng)然zImage文件的產(chǎn)生還要借助(jizh).config文件,它會告訴Makefile文件哪些文件被編譯進內(nèi)核,哪些源文件沒有被用戶選中,并不需要被編譯進內(nèi)核文件中 共九十七頁4. ARM-Linux系統(tǒng)(x
18、tng)配置文件 4.1ARM-Llinux系統(tǒng)裁減(cijin)實質(zhì) /config.h#define CONFIG_HELLO1 y/#define CONFIG_HELLO2 y /main.c#include #include config.h#if defined(CONFIG_HELLO1)void printhello1() printf(hello1n);#endif#if defined(CONFIG_HELLO2)void printhello2() printf(hello2n);#endifvoid main() #if defined(CONFIG_HELLO1) p
19、rinthello1(); #endif #if defined(CONFIG_HELLO2) printhello2(); #endif# arm-linux-gcc -o main.o main.c -c共九十七頁rootlocalhost exa3-2# arm-linux-objdump -d main.omain.o: file format elf32-littlearmDisassembly of section .text:00000000 : 0: e1a0c00d mov ip, sp 4: e92dd800 stmdb sp!, fp, ip, lr, pc 8: e24
20、cb004 sub fp, ip, #4 ; 0 x4 c: e59f0004 ldr r0, pc, #4 10: ebfffffe bl 0 14: ea000005 b 1c 18: 00000000 andeq r0, r0, r0 1c: e91ba800 ldmdb fp, fp, sp, pc00000020 : 20: e1a0c00d mov ip, sp 24: e92dd800 stmdb sp!, fp, ip, lr, pc 28: e24cb004 sub fp, ip, #4 ; 0 x4 2c: ebfffffe bl 0 30: e91ba800 ldmdb
21、fp, fp, sp, pc修改config.h文件中宏的定義(dngy),就可以控制最后生成的可執(zhí)行文件包不包含printhello1()或printhello2()函數(shù),這樣就能夠裁減最后可執(zhí)行文件main的大小 共九十七頁4.2 ARM-Linux配置文件編寫(binxi)語言 Linux 內(nèi)核(ni h)配置命令 配置命令解釋腳本Make config, make oldconfigscripts/ConfigureMake menuconfigscripts/MenuconfigMake xconfigscripts/tkparse共九十七頁以圖形配置界面(make menuconf
22、ig)為例,頂層 Makefile 調(diào)用 scripts/Menuconfig, 讀取配置腳本文件arch/arm/config.in解釋(jish)執(zhí)行,產(chǎn)生圖形界面,用戶可以圖形配置界面對ARM-Linux內(nèi)核進行解讀,并將最終結(jié)果保存在文件.conifg中。下一次再做 make menuconfig時 將產(chǎn)生新的 .config 文件,原 .config 被改名為 .config.old文件。經(jīng)過前面的分析可以看出,config.in文件非常重要,只有編寫正確的config.in文件,腳本解釋器才能夠幫助用戶裁減Linux系統(tǒng)。其實每一個config.in文件都是用配置語言編寫的配置腳本
23、 共九十七頁頂層菜單(ci dn)定義語句 頂層菜單就是定義(dngy)最頂層位置菜單的內(nèi)容,它通常顯示在配置對話框的最左上角位置。頂層菜單的語法格式:mainmenu_name /prompt/ 其中/prompt/ 是用或“包圍的字符串,與”的區(qū)別是中可使用$引用變量的值。mainmenu_name 設(shè)置最高層菜單的名字,它只在 make xconfig 時才會顯示 共九十七頁共九十七頁共九十七頁菜單塊(menu block)定義(dngy)語句 菜單塊定義語句(yj)定義顯示菜單的內(nèi)容,其語法格式如下:mainmenu_option next_commentcomment endmenu
24、共九十七頁共九十七頁共九十七頁詢問(xnwn)語句 詢問語句主要用來定義一個宏,其語法格式(g shi)如下: bool /prompt/ /symbol/ hex /prompt/ /symbol/ /word/ int /prompt/ /symbol/ /word/ string /prompt/ /symbol/ /word/ tristate /prompt/ /symbol/詢問語句首先顯示一串提示符 /prompt/,等待用戶輸入,并把輸入的結(jié)果賦給 /symbol/ 所代表的配置變量。不同的詢問語句的區(qū)別在于它們接受的輸入數(shù)據(jù)類型不同,比如 bool 接受布爾類型( y 或 n
25、 ),hex 接受 16 進制數(shù)據(jù)。有些詢問語句還有第三個參數(shù) /word/,用來給出缺省值。共九十七頁如果我們想選中某項,按Y鍵(或M鍵),則該選項所關(guān)聯(lián)的宏會分別被定義為Y(或M),結(jié)果會反映在.config文件(wnjin)中。打開.config文件,找到CONFIG_EXPERIMENTAL和CONFIG_OBSOLETE兩個宏共九十七頁共九十七頁定義(dngy)語句 定義語句(yj)和詢問語句(yj)既有相同點又有不同點。兩者都是為某一個宏進行定義并賦值,這是它們的相同點,但是也有不同點,詢問語句(yj)是通過用戶輸入來決定某個宏是否被定義和賦值,而定義語句(yj)則是顯式地來給某個
26、宏進行定義并賦值。 define_bool /symbol/ /word/ define_hex /symbol/ /word/ define_int /symbol/ /word/ define_string /symbol/ /word/ define_tristate /symbol/ /word/ 共九十七頁在arch/arm/config.in文件(wnjin)中, 可以看到如下定義:define_bool CONFIG_ARM ydefine_bool CONFIG_EISA ndefine_bool CONFIG_SBUS n共九十七頁依賴(yli)語句 與詢問語句類似,依賴語句
27、也是定義新的配置變量。其語法格式如下: dep_bool /prompt/ /symbol/ /dep/ . dep_mbool /prompt/ /symbol/ /dep/ . dep_hex /prompt/ /symbol/ /word/ /dep/ . dep_int /prompt/ /symbol/ /word/ /dep/ . dep_string /prompt/symbol/ /word/ /dep/ . dep_tristate /prompt/ /symbol/ /dep/ .配置變量/symbol/的取值范圍將依賴于配置變量列表/dep/ 。也就是說被定義的配置變量所
28、對應(yīng)功能的取舍(qsh)取決于依賴列表所對應(yīng)功能的選擇。以dep_bool為例,如果/dep/ 列表的所有配置變量都取值y,則顯示/prompt/,用戶可輸入任意的值給配置變量/symbol/,但是只要有一個配置變量的取值為n,則/symbol/被強制成n。共九十七頁如果CONFIG_MODULES被定義(dngy)成Y,則將會顯示“Set version information on all module symbols”和“Set version information on all module symbols”兩個選項,用戶可以通過輸入來定義CONFIG_MODVERSIONS宏和CO
29、NFIG_KMOD宏的值。但是如果CONFIG_MODULES沒有被定義,則用戶將會看不到“Set version information on all module symbols”和“Set version information on all module symbols”兩個選項,而CONFIG_MODVERSIONS宏和CONFIG_KMOD宏則會強制不定義。共九十七頁選擇(xunz)語句 選擇語句就是給出一串選擇列表,用戶可以通過菜單選項選擇其中的一種,其語法(yf)格式定義如下:choice /prompt/ /word/ /word/Choice 首先顯示 /prompt/,然
30、后將 /word/ 分解成前后兩個部分,前部分為對應(yīng)選擇的提示符,后部分是對應(yīng)選擇的配置變量。用戶選擇的配置變量為 y,其余的都為 n。 共九十七頁由于ARM-Linux可以支持很多種CPU,所以通常情況下會讓用戶選擇適合其開發(fā)板的一種CPU,這時就可以通過使用choice語句達到目的。在arch/arm/config.in文件中有如下(rxi)定義:共九十七頁共九十七頁if語句(yj) if 語句對配置變量(或配置變量的組合(zh))進行判斷,并作出不同的處理。判斷條件 /expr/ 可以是單個配置變量或字符串,也可以是帶操作符的表達式。操作符有:=,!=,-o,-a 等。if語句語法格式如
31、下: if /expr/ ; then /statement/ . fi if /expr/ ; then /statement/ . else /statement/ . fi共九十七頁Souce語句(yj) 在ARM-Linux系統(tǒng)下有幾十個config.in文件,它們分布在不同的目錄下,其中arch/arm/config.in文件是總綱式配置文件。那么其它config.in文件是如何被調(diào)用的呢?其實就是通過source語句來調(diào)用其它的config.in文件。Source語句語法(yf)格式: sourc /word/ 其中/word/ 是要調(diào)入的文件名。例:source drivers/
32、pci/Config.in讀取drivers/pci/Config.in文件,并解釋執(zhí)行該文件。 共九十七頁注釋(zhsh)語句 注釋語句的作用就是對其它語句的作用進行(jnxng)解釋,其語法格式為:#注釋語句例:# this is a example 共九十七頁4.3解讀(ji d).config文件 .config文件是ARM-Linux系統(tǒng)中非常重要的一個文件,它存放的是用戶裁減內(nèi)核的結(jié)果。我們(w men)可以直接修改這個文件,從而更直接來控制哪些文件被編譯連接到zImage內(nèi)核文件中。共九十七頁共九十七頁4.4 ARM-Linux系統(tǒng)(xtng)Makefile文件 Linux 內(nèi)
33、核中的 Makefile 以及與 Makefile 直接相關(guān)的文件有:n Makefile:頂層 Makefile,是整個內(nèi)核配置、編譯的總體控制文件。 n .config:內(nèi)核配置文件,包含由用戶選擇的配置選項,用來(yn li)存放內(nèi)核配置后的結(jié)果。 narch/*/Makefile:位于各種 CPU 體系目錄下的 Makefile,如 arch/arm/Makefile,是針對特定平臺的 Makefile。 n各個子目錄下的 Makefile:比如 drivers/Makefile,負責(zé)所在子目錄下源代碼的管理。 nRules.make:規(guī)則文件,被所有的 Makefile 使用。 共九
34、十七頁4.4.1頂層(dn cn)Makefile解析 Makefile文件中包含(bohn)兩部分的內(nèi)容: 變量和規(guī)則 頂層Makefile也不例外。共九十七頁變量(binling)定義 頂層(dn cn) Makefile 定義并向環(huán)境中輸出了許多變量,為各個子目錄下的 Makefile 傳遞一些信息。有些變量,比如 SUBDIRS,不僅在頂層 Makefile 中定義并且賦初值,而且在 arch/*/Makefile 還作了擴充。 共九十七頁版本信息變量(binling) 頂層Makefile中一開始就是定義版本信息的變量,如下內(nèi)容。VERSION = 2PATCHLEVEL = 4SU
35、BLEVEL = 18EXTRAVERSION = -rmk7-pxa1KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)從KERNELRELEASE變量的賦值,可以看出該內(nèi)核版本信息為2.4.18-rmk7-pxa1,其中2.4.18是Linux內(nèi)核版本號,rmk7是針對2.4.18所打的補丁(b ding)版本號,pxa1表明在rmk7補丁的基礎(chǔ)之上,進一步打的補丁。共九十七頁CPU體系(tx)架構(gòu)變量 在頂層 Makefile 的開頭,用 ARCH 定義目標(biāo) CPU 的體系結(jié)構(gòu),比如(br) ARCH:=ar
36、m 等。許多子目錄的 Makefile 中,要根據(jù) ARCH 的定義選擇編譯源文件的列表。 共九十七頁路徑信息(xnx)變量 KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e s/-/g)CONFIG_SHELL := $(shell if -x $BASH ; then echo $BASH; else if -x /bin/bash ; then echo /bin/bash; else echo sh; fi ; fi)TOPDIR:= $(shell /bin/pwd)HPATH = $(TOPDIR)/includeFI
37、NDHPATH= $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/netSUBDIRS=kernel drivers mm fs net ipc lib共九十七頁TOPDIR 定義了 Linux 內(nèi)核源代碼所在的根目錄。例如,各個子目錄下的 Makefile 通過 $(TOPDIR)/Rules.make 就可以找到 Rules.make 的位置。 SUBDIRS 定義了一個目錄列表,在編譯內(nèi)核或模塊時,頂層 Makefile 就是根據(jù) SUBDIRS 來決定進入哪些(nxi)子目錄。SUBDIRS 的值取決于內(nèi)核的配置,在頂層 Makef
38、ile 中 SUBDIRS 賦值為 kernel drivers mm fs net ipc lib;根據(jù)內(nèi)核的配置情況,在 arch/*/Makefile 中擴充了 SUBDIRS 的值共九十七頁編譯器、連接器等變量(binling) CROSS_COMPILE = arm-linux-AS= $(CROSS_COMPILE)asLD= $(CROSS_COMPILE)ldCC= $(CROSS_COMPILE)gccCPP= $(CC) -EAR= $(CROSS_COMPILE)arNM= $(CROSS_COMPILE)nmSTRIP= $(CROSS_COMPILE)stripOBJ
39、COPY= $(CROSS_COMPILE)objcopyOBJDUMP= $(CROSS_COMPILE)objdumpMAKEFILES= $(TOPDIR)/.configGENKSYMS= /sbin/genksymsDEPMOD= /sbin/depmodMODFLAGS= -DMODULECFLAGS_KERNEL=PERL= perlTMPDIR= /dev/shm共九十七頁編譯器、連接器等變量(binling) CPPFLAGS := -D_KERNEL_ -I$(HPATH)CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wn
40、o-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-commonAFLAGS := -D_ASSEMBLY_ $(CPPFLAGS)CROSS_COMPILE 定義了交叉編譯器前綴 arm-linux-,表明所有的交叉編譯工具都是以 arm-linux- 開頭的,所以在各個交叉編譯器工具之前,都加入了 $(CROSS_COMPILE),以組成一個完整的交叉編譯工具文件名,比如(br) arm-linux-gcc。CFLAGS 定義了傳遞給 C 編譯器的參數(shù)。 并且在Makefile 中還用到LINKFLAGS,這個變量是
41、鏈接生成 vmlinux 時,由鏈接器使用的參數(shù)。LINKFLAGS 在 arm/*/Makefile 中定義,比如: # arch/arm/MakefileLINKFLAGS :=-p -X -T arch/arm/vmlinux.lds 共九十七頁內(nèi)核組成(z chn)相關(guān)變量 ARM-Linux內(nèi)核文件vmlinux由下列規(guī)則構(gòu)成(guchng):vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs$(LD) $(LINKFLAGS) $(HEAD) init/m
42、ain.o init/version.o -start-group $(CORE_FILES) $(DRIVERS) $(NETWORKS) $(LIBS) -end-group -o vmlinux$(NM) vmlinux | grep -v 從這個規(guī)則可以看出,ARM-Linux內(nèi)核構(gòu)成的目標(biāo)文件分別為$(HEAD)、init/main.o、 init/version.o、$(CORE_FILES)、$(DRIVERS)、$(NETWORKS)和$(LIBS)組成,這些目標(biāo)文件由連接器$(LD)(即為arm-linux-ld)連接成內(nèi)核文件vmlinux。 共九十七頁HEAD變量定義(d
43、ngy)位置位于arch/arm/Makefile目錄下。定義如下:HEAD:= arch/arm/kernel/head-$(PROCESSOR).o arch/arm/kernel/init_task.o而PROCESSOR變量定義為:PROCESSOR = armv所以$(HEAD)所代表的目標(biāo)文件為arch/arm/kernel/head-armv.o和arch/arm/kernel/init_task.o兩個文件。由于arm-linux-ld連接器是第一個把$(HEAD)文件連接進vmlinux內(nèi)核文件,因此arch/arm/kernel/head-armv.o目標(biāo)文件存放在vmli
44、nux內(nèi)核文件中首要位置,這就是為什么我們經(jīng)常說arch/arm/kernel/head-armv.s是ARM-Linux內(nèi)核第一個被執(zhí)行的源碼文件的原因。 共九十七頁CORE_FILES變量在頂層Makefile中定義,并在arch/arm/Makefile中被進一步擴展。在頂層Makefile文件中CORE_FILES變量定義如下: CORE_FILES=kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o 在arch/arm/Makefile文件中CORE_FILES變量被進一步擴展,如下: CORE_FILES:=arch/arm/kernel/kerne
45、l.o arch/arm/mm/mm.o $(CORE_FILES)從CORE_FILES的定義我們可以看出,CORE_FILES變量代表著內(nèi)核的核心文件,比如(br)內(nèi)存管理相關(guān)文件(mm/mm.o和arch/arm/mm/mm.o)、文件系統(tǒng)相關(guān)文件(fs/fs.o)以及進程間通信相關(guān)文件(ipc/ipc.o)。 共九十七頁在ARM-Linux系統(tǒng)中包含了非常多的硬件驅(qū)動程序,這些驅(qū)動程序分散在drivers目錄下,那么系統(tǒng)如何將用戶選中的驅(qū)動程序編譯進內(nèi)核(ni h)文件呢?DRIVERS變量起到非常重要的作用。共九十七頁DRIVERS-n :=DRIVERS-y :=DRIVERS-m
46、 :=DRIVERS- :=DRIVERS-$(CONFIG_ACPI) += drivers/acpi/acpi.oDRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.oDRIVERS-$(CONFIG_I2C) += drivers/i2c/i2c.oDRIVERS-$(CONFIG_L3) += drivers/l3/l3.oDRIVERS-y += drivers/serial/serial.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/
47、net/net.o drivers/media/media.oDRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.oDRIVERS-$(CONFIG_DRM_NEW) += drivers/char/drm/drm.oDRIVERS-$(CONFIG_DRM_OLD) += drivers/char/drm-4.0/drm.oDRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a共九十七頁以筆者目前所使用(shyng)到的.config文件為例,DRIVERS-y的值如下:DRIVERS-y = drivers/
48、serial/serial.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/scsi/scsidrv.o drivers/mtd/mtdlink.o drivers/usb/usbdrv.o drivers/input/inputdrv.o 共九十七頁因此這些驅(qū)動目標(biāo)文件將會被連接(linji)到內(nèi)核文件中,也就是說內(nèi)核啟動后可以使用這些驅(qū)動硬件設(shè)備,而哪些沒有被編譯進內(nèi)核的驅(qū)動設(shè)備,將無法直接使用(但可以以模塊的方式將
49、驅(qū)動編譯進內(nèi)核,而且這種方式使用更方便,更普遍)。 共九十七頁NETWORKS變量在頂層Makefile文件(wnjin)中定義如下:NETWORKS=net/network.o其中net/network.o文件是網(wǎng)絡(luò)相關(guān)的代碼的集合,后面在分析子Makefile時再詳細分析network.o文件是如何產(chǎn)生地。 共九十七頁 LIBS變量在頂層(dn cn)Makefile和arch/arm/Makefile中都被定義,分別如下: LIBS=$(TOPDIR)/lib/lib.a和 LIBS := arch/arm/lib/lib.a $(LIBS)因此lib/lib.a和arch/arm/li
50、b/lib.a兩個靜態(tài)庫文件被加載到內(nèi)核中。 共九十七頁前面介紹了Makefile文件中眾多變量(binling),可以用export把這些變量聲明出去,以便其它Makefile文件可以使用這些變量。exportVERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH TMPDIR CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODF
51、LAGS PERLexport CPPFLAGS CFLAGS CFLAGS_KERNEL AFLAGS AFLAGS_KERNEL共九十七頁 include其它(qt)Makefile文件 ifeq (.config,$(wildcard .config)include .configifeq (.depend,$(wildcard .depend)include .dependdo-it-all:Version vmlinuxelseCONFIGURATION = dependdo-it-all:dependendifelseCONFIGURATION = configdo-it-all:
52、configendif共九十七頁$(wildcard .config)意思是在頂層目錄(ml)下查找以.config結(jié)尾的文件,如果有這樣的文件,返回值就是該文件名,并進一步比較該文件是否就是.config文件,如果是表明頂層目錄下已經(jīng)存在.config文件,將該文件包含進來。如果該文件不存在,說明用戶從沒有執(zhí)行過make config (或make menuconfig 或make xconfig)命令,因為只有執(zhí)行過這些命令,才會在該目錄下生成.config文件,這時會提醒用戶執(zhí)行make config命令,并退出Makefile的執(zhí)行。同理接下來的兩行代碼是查找頂層目錄下是否存在.dep
53、end文件,如果存在該文件也將其包含進Makefile中。如果該文件不存在,說明用戶從沒有執(zhí)行過make depend命令,因為只有執(zhí)行過該命令,才能生成.depend文件,這時會提醒用戶執(zhí)行make depend命令,并退出Makefile的執(zhí)行。共九十七頁規(guī)則(guz)解析 Makefile中第一條規(guī)則總是占據(jù)重要的地位,因為如果我們執(zhí)行make命令時(沒有帶具體目標(biāo)名參數(shù)),它總是執(zhí)行第一條規(guī)則。在頂層(dn cn)Makefile文件中,第一條規(guī)則定義如下:all:do-it-alldo-it-all規(guī)則根據(jù)是否執(zhí)行過make config(或make menuconfig 或make
54、 xconfig)命令,是否執(zhí)行過make depend命令而不同,具體定義如下:ifeq (.config,$(wildcard .config)include .configifeq (.depend,$(wildcard .depend)include .dependdo-it-all:Version vmlinuxelseCONFIGURATION = dependdo-it-all:dependendifelseCONFIGURATION = configdo-it-all:configendif如果執(zhí)行過這兩條命令,則.config文件和.depend文件都已經(jīng)存在,此時do-it
55、-all目標(biāo)規(guī)則定義為do-it-all:Version vmlinux共九十七頁version目標(biāo)(mbio)規(guī)則定義為:Version: dummyrm -f include/linux/compile.h共九十七頁而vmlinux目標(biāo)生成規(guī)則(guz)定義為:vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o -start-group $(CORE_FILE
56、S) $(DRIVERS) $(NETWORKS) $(LIBS) -end-group -o vmlinux$(NM) vmlinux | grep -v (compiled)|(.o$)|( aUw )|(.ng$)|(LASHRLDI) | sort System.map共九十七頁要生成vmlinux目標(biāo)文件,必須先生成linuxsubdirs目標(biāo),而linuxsubdirs目標(biāo)是如何定義的呢?Linuxsubdirs目標(biāo)的生成規(guī)則是頂層Makefile中最重要的一條規(guī)則,它的定義如下(rxi)所示:linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIR
57、S)因為SUBDIRS=kernel drivers mm fs net ipc lib所以linuxsubdirs目標(biāo)生成規(guī)則經(jīng)過變換后為:linuxsubdirs:_dir_kernel _dir_drivers _dir_mm _dir_fs _dir_net _dir_ipc _dir_lib 共九十七頁目標(biāo)(mbio)_dir_kernel _dir_drivers _dir_mm _dir_fs _dir_net _dir_ipc _dir_lib定義的規(guī)則為:$(patsubst %, _dir_%, $(SUBDIRS) : dummy include/linux/versio
58、n.h$(MAKE) CFLAGS=$(CFLAGS) $(CFLAGS_KERNEL) -C $(patsubst _dir_%, %, $)共九十七頁假設(shè)選擇_dir_kernel目標(biāo),其規(guī)則為:_dir_kernel:dummy include/linux/version.h include/config/MARKER$(MAKE) CFLAGS=$(CFLAGS) $(CFLAGS_KERNEL) -C $(patsubst _dir_%, %, $)將這條規(guī)則轉(zhuǎn)換后變?yōu)椋篲dir_kernel:dummy include/linux/version.h include/config/
59、MARKERMAKE CFLAGS=$(CFLAGS) $(CFLAGS_KERNEL) C kernel其實(qsh)就是到kernel子目錄下調(diào)用Makefile,編譯kernel子目錄下的源碼文件。同理會到drivers子目錄、mm子目錄、fs子目錄、net子目錄、ipc子目錄和lib子目錄下調(diào)用相應(yīng)Makefile文件,完成對應(yīng)目錄下的文件的編譯。共九十七頁內(nèi)核配置(pizh)規(guī)則 配置ARM-Linux內(nèi)核,可以在頂層目錄下執(zhí)行下列三個命令中的一個:make config 或make menuconfig或make xconfig熟悉Makefile的讀者知道在Makefile文件中
60、一定有config、menuconfig和xconfig目標(biāo)(mbio)生成規(guī)則 共九十七頁symlinks:rm -f include/asm( cd include ; ln -sf asm-$(ARCH) asm)if ! -d include/linux/modules ; then mkdir include/linux/modules; fioldconfig: symlinks$(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.inxconfig: symlinks$(MAKE) -C scripts kconfig.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45127-2025塑料微生物作用的評價
- 監(jiān)測施工方案
- 二零二五年度工傷事故賠償補償爭議解決協(xié)議
- 二零二五年度新能源汽車買賣合同分期付款協(xié)議
- 二零二五年度魚塘承包與漁業(yè)多元化經(jīng)營合作協(xié)議
- 二零二五年度新能源研發(fā)合作合伙人協(xié)議書
- 2025年度退房協(xié)議書規(guī)范范本
- 二零二五年度新型購物積分制合作協(xié)議合同
- 二零二五年度房屋租賃市場租金評估合同
- 2025年度離婚子女撫養(yǎng)權(quán)及財產(chǎn)分割協(xié)議書
- 隨機過程與數(shù)學(xué)金融
- (應(yīng)用詳盡版)純?nèi)斯趧?wù)分包簡單的合同(通用)
- 民事抗訴申請書(參考范文)
- 《汽車油料與維護》課件
- 《有限元基礎(chǔ)》課件
- 2024年中國鐵路南寧局集團招聘筆試參考題庫含答案解析
- 《3D打印技術(shù)》課程標(biāo)準(zhǔn)2
- 第三章稻谷碾米
- 中小學(xué)教師評課評價量表
- 胸痛中心培訓(xùn)課件胸痛中心救治流程
- 紙與我們的生活
評論
0/150
提交評論