【迅為iTop4412學習筆記】3. 編譯linux的Makefile修改
本節目標
如何把原本編譯進linux核心的LEDS取消掉
首先編譯一個最小的linux燒寫試試
解壓迅為提供過的原始碼包iTop4412_Kernel_3.0_20180604.tar.gz
tar -xvf iTop4412*.tar.gz
cd iTop4412*
因為我是 SCP 1G,我要的是最小linux,所以
cp config_for_linux_scp_elite .config
最後make打包成zImage,進行漫長的等待
make zImage
最後一行告知zImage的路徑和編譯完成通知,然後燒寫進去就行了,燒寫過程就跟著迅為的pdf就行,不多加敘述了。
Kernel: arch/arm/boot/zImage is ready
此時我們用shell命令看linux的驅動裡面,會有leds的驅動。我們接下來要做的,就是要在linux編譯前修改Makefile,目標是不讓把leds編譯進核心
[[email protected]]# ls /dev/l*
/dev/leds /dev/loop0 /dev/loop2 /dev/loop4 /dev/loop6
/dev/log /dev/loop1 /dev/loop3 /dev/loop5 /dev/loop7
下面進入正題
1. 修改編譯器
首先開啟linux根目錄下的Makefile搜尋CROSS_COMPILE,大致看到以下兩行
CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
#CROSS_COMPILE ?= /usr/local/arm/4.5.1/bin/arm-none-linux-gnueabi-
CROSS_COMPILE指交叉編譯,我們編譯出來的linux是要跑在ARM平臺的,所以核心編譯器需要使用arm的交叉編譯器,之所以有兩行,是迅為已經幫我們修改好了,被註釋的是原本的linux的編譯器,我們需要改為arm編譯器,第一行就是迅為幫我們改好的arm編譯器,有興趣可以ls檢視這個目錄下有哪些編譯器。
2. 瞭解強制編譯(強制編譯進核心的檔案)
以 drivers/Makefile 為例
vim drivers/Makefile
開啟之後以這倆為例
obj-y += gpio/
obj-$(CONFIG_PCI) += pci/
對於pci來說,只有定義了巨集變數CONFIG_PCI,才會編譯pci
對於gpio來說,直接就yes了,不就是強制編譯…
3. 瞭解配置編譯
我們有了概念之後就繼續往下看,發現了
obj-y += char/
char後面有個 / ,意味著強制編譯了char目錄下的內容,那我們就繼續再往裡層資料夾找,所以推斷應該是檢視 drivers/char/ 下的 Makefile 檔案
vim drivers/char/Makefile
檔案裡搜尋 leds就看到了
obj-$(CONFIG_LEDS_CTL) += itop4412_leds.o
到這裡其實就已經很眼熟了,CONFIG_LEDS_CTL就是仿寫Kconfig的時候寫的,而驅動檔名就是itop4412_leds.c,寫的.o是連結,要編譯成.o自然就是.c咯…
4. 瞭解依賴編譯
這裡就隨便略過吧,有些驅動不是單個檔案就編譯完了,而是可能依賴其他的驅動。如果你要編譯,當然不要你把需要的其他驅動都從頭擼一遍,只需要在Kconfig中選中依賴的那些驅動就可以了。
我現在也只是聽了個理論,具體還沒有實踐過,以後實踐了看還記不記得來更新吧…
現在開始將LEDS不編譯進核心
我們先直接開啟.config檔案看看LEDS被編譯進核心是什麼樣子的
vim .config
搜尋LEDS會發現
CONFIG_LEDS_CTL=y
y就是yes嘛,這就說明了LEDS目前是被編譯進核心的,不編譯進就要改成n嗎?emmm,我們人還是看著工具,使用工具來修改吧
進入圖形化介面
make menuconfig
找到 Devices Drivers/Character devices目錄下的 Enable LEDS config,前面有個星號表示被選中,用空格讓他顯示空,就意味著被取消編譯進核心了。
至於為什麼路徑是這個,因為LED是個字元裝置,所以肯定是驅動/字元裝置目錄下找,為什麼顯示的是Enable LEDS config,仿寫Kconfig中自己寫的,應該回憶起來了吧!
配置完了,就可以make zImage類似最開始那樣編譯成zImage檔案並燒寫了。
進入Linux輸入命令檢視驅動,發現已經沒有LED了
[[email protected]]# ls /dev/l*
/dev/log /dev/loop1 /dev/loop3 /dev/loop5 /dev/loop7
/dev/loop0 /dev/loop2 /dev/loop4 /dev/loop6
Linux核心編譯流程圖
等待插圖
本次總結
其實說簡單也簡單,就是make menuconfig中選中就編譯,取消就不編譯。
說簡單好像也不簡單,因為它把之前都綜合起來了,首先要編寫一個驅動LED的驅動,其次就是編寫Kconfig新增巨集定義,才能把這些都顯示在圖形介面上,再才是選擇是否編譯進linux中。
本節應該算是帶我們在最淺顯的地方初探Linux核心編譯?