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