本章導讀 在前面入門視頻第十期“搭建編譯環(huán)境 uboot_linux_Android”中,只介紹了輸入 Make命令就可以編譯出內核,并沒有介紹它是如何運行的。 在向內核中添加驅動的時候要完成 3 項工作,包括: 1)在 Kconfig 中添加新代碼對應項目的編譯條件,這一部分在實驗 3 已經介紹過; 2)將驅動源碼添加到對應的目錄中,這一步比較好理解,在本章實驗中將給大家演示一下; 3)在目錄 Makefile 中文件中增加針對新代碼的編譯條目,這一部分將在本章節(jié)介紹到。 4.1.1 工具 4.1.1.1 硬件工具 1)PC 機 4.1.1.2 軟件工具 1)虛擬機 Vmware 2)Ubuntu12.04.2 3)Ubuntu 系統下解壓生成的 Linux 源碼 4.1.2 預備課程 入門視頻“01-燒寫、編譯以及基礎知識視頻” →“實驗 10-搭建編譯環(huán)境 uboot_linux_Android”或者使用手冊“五 Android 開 發(fā)環(huán)境搭建以及編譯”; 實驗三 Menuconfig_Kconfig 4.1.3 視頻資源 本節(jié)配套視頻為“視頻 04_Makefile 編譯” 4.2 學習目標 本章需要學習以下內容: 掌握 Linux 內核編譯命令 掌握編譯器路徑設置的方法 理解環(huán)境變量路徑、編譯器、源碼 Makefile 文件中編譯器路徑三者之間的關系 理解 Makefile 文件結構 掌握向 Makefile 文件中添加腳本命令的方法,能夠看懂 Makefile 腳本 4.3 編譯器路徑的設置 在前面入門知識中,只介紹了在什么目錄解壓編譯器,在環(huán)境變量文件中添加路徑,就可以編譯出內核,并沒有介紹他們之間是如何對應的。 如下圖所示,按照前面提供的基礎教程,配置好 Ubuntu 中的編譯器和庫文件,輸入命令“#make”,就可以編譯生成內核的二進制鏡像。 ![]() 如下圖所示,使用命令“#cd”,使用命令“#vim .bashrc”打開環(huán)境變量文件“.bashrc”。 ![]() 如下圖所示,進入最底行,可以看到,在環(huán)境變量文件中編譯器路徑設置為“exportPATH=$PATH:/usr/local/arm/arm-2009q3/bin”。 ![]() 然后使用命令“#cd /usr/local/arm/”,進入解壓編譯器“arm-2009q3.tar.bz2”的文件目錄。 ![]() 可以明顯的看到,環(huán)境變量中設置的路徑和解壓的路徑是對應的。 這里回到內核源碼的目錄,如下圖所示。 ![]() 如下圖所示,使用命令“#vim Makefile”打開內核目錄下的 Makefile 文件。 ![]() 這里通過 vim 編輯器查找參數“CROSS_COMPILE”,如下圖所示。 ![]() 可以查到參數“CROSS_COMPILE”,如下圖所示。 ![]() 如上圖所示,可以看到這個參數是“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”。 再看一下參數“CROSS_COMPILE”的下一行,可以看出這里有修改過的痕跡。很容易推斷出,原來三星是用的“4.5.1”版本的編譯器,不過這個沒關系,只要能編譯通過就可以了。 一般說來,拿到源碼之后的第一步,是要先要先將源碼編譯通過。 設置上圖中的變量“CROSS_COMPILE”以及環(huán)境變量還有編譯器實際解壓路徑三者對應。這三者對應之后,就能確保執(zhí)行 Make 命令之后,系統能夠找到這個編譯器。 在編譯命令執(zhí)行的過程中,會提示一些錯誤,然后根據提示的錯誤,挨個去排查修改,去添加庫文件或者修改庫文件。這個過程有長有短,考驗的只是耐心,并沒有太多技巧。由于已經將缺少的庫文件寫成腳本,這樣大家在編譯器執(zhí)行以下腳本就能夠編譯通過。 針對內核目錄下的 Makefile 文件,提醒大家一下,這個文件中內容很多,除了上面編譯器路徑變量以外的其它部分幾乎不用關注。 另外還有一個地方需要了解一下,如下圖所示,在該文件的第一行,可以看到內核的版本。 ![]() 4.4 Make 內核編譯命令執(zhí)行過程簡介 如下圖所示,編譯內核需要執(zhí)行 make 命令,在執(zhí)行 make 命令之后,并沒有介紹它是如何執(zhí)行的。 ![]() 在 make 命令執(zhí)行之后,它會首先找到當前目錄下的“Makefile”文件,如下圖所示。 ![]() 運行 Makefile 文件之后,它會在 Makefile 文件中找到編譯器的路徑“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”如下圖所示。 ![]() 然后系統根據環(huán)境變量找到“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”編譯器的路徑,如下圖所示。 ![]() 如下圖所示,使用命令“l(fā)s /usr/local/arm/arm-2009q3/bin/”可以查看到 arm2009q3解壓之后有哪些具體編譯器。 ![]() 如上圖,系統找到編譯器之后,同時基礎的庫文件也是和編譯器在一起的,有時候編譯一個新的內核,還有可能需要修改庫文件。 編譯執(zhí)行前還需要找到“.config”文件,默認是放在源碼目錄下的。使用命令“l(fā)s -a”就可以看到,如下圖所示。 ![]() 從本章‘實驗 03’的 3.5 小節(jié),學習到這個“.config”是通過 menuconfig 工具生成的,里面只是一些宏定義,如下圖所示,打開這個文件。 ![]() 查找宏定義”LEDS,”是編譯 led 驅動的宏定義“LEDS_CTL”,如下圖所示。 ![]() 現在系統找到這個宏定義“LEDS_CTL”,在編譯具體中間文件的時候會用到。 具體是怎么實現的,繼續(xù)看下一小節(jié)的內容就可以搞清楚這個宏定義有什么用處。 ![]() |