开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

          開通VIP
          Linux內(nèi)核中Makefile、Kconfig和.config的關(guān)系

          我們?cè)诰幾gLinux內(nèi)核時(shí),往往在Linux內(nèi)核的頂層目錄會(huì)執(zhí)行一些命令,這里我以RK3288舉例,比如:make firefly-rk3288-linux_defconfig、make menuconfig、make firefly-rk3288.img、make zImage等等。先不管這具體的含義,首先提出幾個(gè)疑問:

          本文引用地址:http://emb.hqyj.com/Column/7565.html

          (1)Linux內(nèi)核如此龐大(幾萬個(gè)文件),目錄又分為很多層,它是如何將各層目錄下的文件關(guān)聯(lián)起來的?

          (2)Linux支持如此多的架構(gòu)(X86、ARM、AVR、mips等等),為何我們?cè)谑褂媚骋患軜?gòu)的芯片,比如RK3288時(shí),其他架構(gòu)的代碼不會(huì)被編譯?并且同為ARM架構(gòu)下的其他系列SOC架構(gòu)相關(guān)的代碼不被編譯?

          (3)在編譯內(nèi)核前,執(zhí)行命令:make menuconfig的意義為何?

          (4)編譯內(nèi)核時(shí),執(zhí)行命令:make zImage的意義為何?

          (5)Linux內(nèi)核中各層目錄下的Makefile文件和Kconfig文件是如何編寫的。

          個(gè)人認(rèn)為,當(dāng)理解了解決了以上的幾個(gè)問題,那么本文題目的疑問就自然而然的解決了。以下筆者來一一回答這個(gè)問題:

          問題1.Linux內(nèi)核如此龐大(幾萬個(gè)文件),目錄又分為很多層,它是如何將各層目錄下的文件關(guān)聯(lián)起來的?

          關(guān)于此問題,如果要準(zhǔn)確的回答,估計(jì)只有真正的大神才能回答了,這里只講自己的理解。Linux內(nèi)核源碼的代碼管理是非??茖W(xué)的,在Linux內(nèi)核源碼的頂層目錄下,分配了相應(yīng)的目錄,在對(duì)應(yīng)的目錄下,代表這就一些功能或者是屬性的集群,這樣就實(shí)現(xiàn)了模塊化,便于管理,比如arch目錄與平臺(tái)架構(gòu)相關(guān)、include目錄存放著大量的內(nèi)核頭文件、drivers目錄存放著各種驅(qū)動(dòng)代碼,比如顯卡、網(wǎng)卡、USB總線、PCI總線等等、kernel目錄存放著支持體系結(jié)構(gòu)特有的諸如信號(hào)量處理和SMP之類特征的實(shí)現(xiàn)、mm目錄存放著體系結(jié)構(gòu)特有的內(nèi)存管理程序的實(shí)現(xiàn)等等;然而在各個(gè)子目錄下,又會(huì)進(jìn)行細(xì)分,比如arch目錄下,就存在和x86架構(gòu)相關(guān)的目錄x86、與ARM架構(gòu)相關(guān)的目錄arm、與MIPS目錄相關(guān)的目錄mips等等,以此類推。所以這就構(gòu)成了一顆樹形結(jié)構(gòu)。

          學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu)的童鞋應(yīng)該知道,對(duì)于一棵非標(biāo)準(zhǔn)樹,還是有辦法將其進(jìn)行遍歷的,只是算法比較復(fù)雜而已。那么在Linux內(nèi)核源碼的這棵樹,就是通過Kconfig文件建立各層子目錄之間的連接,通過Makefile文件來選擇各個(gè)目錄下的對(duì)應(yīng)的文件是否被編譯,而.config文件就像是作為總控制臺(tái)吧,控制著Makefile文件去編譯指定的程序代碼文件(主要是C和匯編)。而這一切控制關(guān)系是由Kconfig文件建立起來的。

          在我理解而言,這其實(shí)就是在遍歷樹形結(jié)構(gòu)時(shí),用的一種方法,即指路法。每當(dāng)我們?cè)谀硞€(gè)陌生的地方問路時(shí),假設(shè)從A地到E地,情景通常如下:

          通常我們也會(huì)按照路人的回答,很準(zhǔn)確的就找到了目的地E,所以,在程序中或者代碼架構(gòu)中也是一樣的。所以在Linux內(nèi)核源碼中,.config文件就相當(dāng)于路人,而Kconfig就為問路的人,而Makefile就為兩只腳了,聽指令干苦力的貨!嘿嘿!

          問題2.Linux支持如此多的架構(gòu)(X86、ARM、AVR、mips等等),為何我們?cè)谑褂媚骋患軜?gòu)的芯片,比如RK3288時(shí),其他架構(gòu)的代碼不會(huì)被編譯?并且同為ARM架構(gòu)下的其他系列SOC架構(gòu)相關(guān)的代碼不被編譯?

          關(guān)于這個(gè)問題,其實(shí)和我們?cè)诰幾gLinux內(nèi)核時(shí),執(zhí)行的命令:make firefly-rk3288-linux_defconfig或者make menuconfig有關(guān)了,執(zhí)行以上兩個(gè)命令的目的是為了生成.config文件。往往我們執(zhí)行命令make menuconfig只是為了修改一些驅(qū)動(dòng)模塊和要編譯的一些程序,往往我們是不會(huì)去選擇架構(gòu)相關(guān)的,比如說,自行的去選擇RK3288這顆SOC,再去選擇基于Firefly平臺(tái)的板卡,其實(shí)這也是可以的,只要你開心,都可以自行在菜單里面選擇,但是通常我們不會(huì)這樣,我們通常是先執(zhí)行make firefly-rk3288-linux_defconfig生成了一個(gè)基于Firefly平臺(tái)的RK3288相關(guān)配置的.config文件,然后再執(zhí)行命令make menuconfig來選擇一些模塊代碼進(jìn)行編譯,這樣做的好處就是減少了很多工作量。當(dāng)然,存在一個(gè)問題是,假設(shè)需要編譯的內(nèi)核不支持現(xiàn)有的開發(fā)板怎么辦?比如從官網(wǎng)下載下來的原始Linux內(nèi)核源碼,只支持RK3288這顆SOC,但是并沒有急于Firefly開發(fā)的這款RK3288的開發(fā)板,怎么辦呢?這涉及到了Linux內(nèi)核的移植,在此不作過多的敘述,提醒一點(diǎn)的是,可以找一塊基于RK3288這顆SOC的開發(fā)板的配置(在官方發(fā)布的初始Linux內(nèi)核源碼中,每支持一款SOC,基本上都會(huì)對(duì)于的支持一款官方開發(fā)板作為參考),進(jìn)行移植和模擬,后生成一個(gè)類似于firefly-rk3288-linux_defconfig的配置文件,用它來生成基本的.config文件。

          清楚了以上的關(guān)系,在根據(jù)問題1的原因,就不難理解了。沒錯(cuò),就是基于firefly-rk3288-linux_defconfig文件生成了基礎(chǔ)的,默認(rèn)的.config配置文件,此文件的內(nèi)容就包含了架構(gòu)相關(guān)的東西,所以在進(jìn)行Linux內(nèi)核源碼的編譯時(shí),根據(jù).config文件的基本配置,尋找架構(gòu)相關(guān)的代碼進(jìn)行編譯和設(shè)備相關(guān)的代碼進(jìn)行編譯??傊黄鸲?config這個(gè)控制臺(tái)為準(zhǔn)。

          問題3.在編譯內(nèi)核前,執(zhí)行命令:make menuconfig的意義為何?

          其實(shí)這個(gè)問題在前兩個(gè)問題中基本上都回答了,make menuconfig就是以菜單的形式打開內(nèi)核源碼的樹形結(jié)構(gòu),然后程序員在默認(rèn)配置的基礎(chǔ)上自行配置和選擇需要編譯的模塊代碼。

          其實(shí)能做這個(gè)工作的命令有很多,比如:

          ·make config:基于文本的為傳統(tǒng)的配置界面,太復(fù)雜,不直觀,不推薦使用。

          ·#make xconfig:基于圖形窗口模式的配置界面,直觀明了,Xwindow界面下推薦使用。

          ·make oldconfig:如果只想在原來內(nèi)核配置的基礎(chǔ)上修改一些小地方,會(huì)省去不少麻煩,可以使用。

          ·make menuconfig:基于文本選單的配置界面,直觀明了,字符終端下推薦使用。

          大概好像這幾種吧,其實(shí)還有一種就是,手動(dòng)修改.config文件,呵呵!相信基本上沒人會(huì)去干這種事的。

          問題4.編譯內(nèi)核時(shí),執(zhí)行命令:make zImage的意義為何?

          通常在編譯時(shí),都是執(zhí)行這個(gè)命令或者執(zhí)行make uImage命令進(jìn)行編譯的。意義為何呢?其實(shí)是生成名為zImage或uImage的內(nèi)核鏡像。當(dāng)然,有人在疑問了,在編譯Firefly的RK3288開發(fā)板時(shí),執(zhí)行的命令是make firefly-rk3288.img ,而不是上面的任何一個(gè),其實(shí)這是Firefly修改過的方法了,其實(shí)說白了也就是一個(gè)名字而已。這個(gè)不要太過糾結(jié),想具體了解的話,答案就在Firefly提供的內(nèi)核源碼內(nèi)。

          執(zhí)行編譯命令后,通過.config文件、Kconfig文件和Makefile文件,就可以有規(guī)律有選擇的去編譯源代碼了。

          問題5.內(nèi)核中各層目錄下的Makefile文件和Kconfig文件是如何編寫的。

          其實(shí)前面的4個(gè)問題只是基礎(chǔ)的鋪墊,這才是重點(diǎn),但是這里必須依賴于前面的原理。

          首先我們先確定一點(diǎn),在Linux內(nèi)核源碼的各層目錄下。都存在一個(gè)Kconfig文件和一個(gè)Makefile文件,.config文件存在頂層目錄。如下圖:

          上圖基本上可以證明一切了。

          為了更好的詮釋,我在drivers目錄下創(chuàng)建了一個(gè)my_dr目錄,主要存放我自己編寫的內(nèi)核驅(qū)動(dòng)代碼,此目錄下的其他目錄都是我編寫的驅(qū)動(dòng)代碼,現(xiàn)在需要將它們連接起來,當(dāng)執(zhí)行make menuconfig命令時(shí),能夠找到我自己編寫的內(nèi)核驅(qū)動(dòng)代碼。在這里以一個(gè)hello程序舉例。

          那么到底該如何做呢?·········兩字:“模仿”!

          如下圖:

          上圖中就是我要舉例的目錄層了,hello目錄里為hello.c程序;my_dr目錄里為我想把我自己寫的驅(qū)動(dòng)程序存放的目錄;drivers目錄為Linux內(nèi)核驅(qū)動(dòng)目錄;firefly-rk3288-kernel目錄為Linux內(nèi)核源碼頂層目錄。所以按照前文的推斷,在每一層目錄下都會(huì)存在一個(gè)Makefile文件和一個(gè)Kconfig文件。下面從底層hello到drivers目錄各層Makefile文件和Kconfig文件分析。

          (1)hello目錄

          如上圖,左邊為Makefile文件,右邊為Kconfig文件。對(duì)于Makefile文件,如果變量CONFIG_HELLO為真或假,則判斷這是否將目錄下的hello.c文件編譯為hello.o文件。CONFIG_HELLO變量的值來自于.config文件的配置。.config的配置又來自于通過Kconfig文件的顯式選擇(就是通過菜單選擇)。再看Kconfig文件,如下圖:

          Config為配置關(guān)鍵字;HELLO為配置項(xiàng);tristate為三態(tài)選擇器,此關(guān)鍵字在為上層提供菜單配置時(shí),有三種選擇,分別是不編譯、編譯成內(nèi)核鏡像和編譯成模塊驅(qū)動(dòng),除了這個(gè)關(guān)鍵字,還有另一個(gè)bool,這個(gè)不難理解,即為布爾類型,西游兩種選擇,編譯或者不編譯;help為幫助提示。這基本上是比較經(jīng)典的格式了。所以通常在進(jìn)行編寫這樣的配置時(shí),通常的做法是參考Linux內(nèi)核源碼中存在的Kconfig文件和Makefile文件,然后模仿他們的格式進(jìn)行編寫。

          (2)my_dr目錄

          如上圖,即為mu_dr目錄下的Makefile文件和Kconfig文件的內(nèi)容了。對(duì)于Makefile文件,一句話指引找到hello目錄。而對(duì)于Kconfig文件,因?yàn)閙y_dr目錄下可能要存在很多驅(qū)動(dòng)程序,所以必須要建立好一個(gè)菜單,進(jìn)行對(duì)各個(gè)驅(qū)動(dòng)程序的選擇,所以第1行代碼就算建立名為my Drivers的菜單;第5行代表可以在相對(duì)路徑drivers/my_dr/hello/Kconfig找到Kconfig資源(注意,這里的路徑是相對(duì)于Linux內(nèi)核源碼的頂層目錄的)。后的第7行表示使用關(guān)鍵字endmenu結(jié)束文件。

          (3)drivers目錄

          如上圖,即為drivers目錄下的Makefile文件和Kconfig文件了。還是一樣的,在Makefile文件中添加洗衣歌資源的菜單目錄路徑;而在Kconfig文件中,還是添加此目錄下的資源的Kconfig文件的路徑。就這樣配合使用。而且,基本上在這兩個(gè)文檔中,可以直接看到很多的參考示例,直接參考即可!其實(shí)有一個(gè)疑問是,在Makefile文件中,比如第158行,如下圖:

          存在變量CONFIG_GATOR,這是為啥嘞?其實(shí)是這樣的,這表示如果想想在菜單中顯示選擇關(guān)于gator的目錄菜單,就必須依賴于變量CONFIG_GATOR的值為y,這樣才能在使用make menuconfig命令時(shí),才能看到gator目錄下的菜單,而CONFIG_GATOR變量則是在gator目錄的上層,依賴于某些代碼,選擇后,其值為y。而筆者自己寫的直接使用了語句obj-y,表示變量值為y(其實(shí)就是yes),所以直接就可見了,不依賴于其他的代碼。

          那么整一個(gè)過程就如上三步了,現(xiàn)在執(zhí)行make menuconfig命令查看是否能看到前面建立的菜單。如下圖:

          如上圖可以看到我自己創(chuàng)建的名為my Dribers的菜單了。


           

          如上兩圖即為所使用的tristate關(guān)鍵字所表現(xiàn)出的三態(tài)結(jié)果了,即就是三種狀態(tài)??梢园凑招枰M(jìn)行合適的選擇即可。

          總結(jié):本文主要根據(jù)個(gè)人的理解,記錄了Linux內(nèi)核源碼中的Makefile、Kconfig和.config文件的編寫和使用,從某個(gè)角度來講,其貫穿了整一個(gè)Linux內(nèi)核源碼,有以圖形菜單的形式體現(xiàn)給開發(fā)者,編譯開發(fā)和選擇。

          聲明:以上內(nèi)容純屬為個(gè)人理解,如若有誤,還望大神賜教!

          本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          編譯Linux內(nèi)核(下)---KConfig、Makefile詳解以及ARM平臺(tái)Linux內(nèi)核的編譯
          Linux Kbuild文檔
          往android的內(nèi)核添加驅(qū)動(dòng)(其實(shí)就是添加linux內(nèi)核驅(qū)動(dòng))
          Linux內(nèi)核開發(fā)之將驅(qū)動(dòng)程序添加到內(nèi)核
          Linux內(nèi)核構(gòu)建系統(tǒng)之三
          Linux內(nèi)核中的Kconfig、Makefile、.config
          更多類似文章 >>
          生活服務(wù)
          分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
          綁定賬號(hào)成功
          后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點(diǎn)擊這里聯(lián)系客服!

          聯(lián)系客服