Linux內核的編譯及加載

1.  Linux內核的編譯

Linux 驅動開發者需要牢固地掌握Linux 內核的編譯方法以爲嵌入式系統構建可運行的Linux 操作系統映像。在編譯內核時,需要配置內核,可以使用下面命令中的一個:

#make config (基於文本的最爲傳統的配置界面,不推薦使用)
#make menuconfig (基於文本菜單的配置界面, 推薦使用)
#make xconfig (要求QT被安裝)

運行make menuconfig 等時,配置工具首先分析與體系結構對應的/arch/xxx/Kconfig 文件(xxx 即爲傳入的ARCH 參數),/arch/xxx/Kconfig 文件中除本身包含一些與體系結構相關的配置項和配置菜單以外,還通過source 語句引入了一系列Kconfig 文件,而這些Kconfig又可能再次通過source 引入下一層的Kconfig,配置工具依據Kconfig 包含的菜單和條目即可描繪出一個如圖3的分層結構。

2. Kconfig 和 Makefile

在Linux 內核中增加程序需要完成以下3 項工作。

● 將編寫的源代碼複製到 Linux 內核源代碼的相應目錄中。

● 在目錄的 Kconfig 文件中增加關於新源代碼對應項目的編譯配置選項。

● 在目錄的 Makefile 文件中增加對新源代碼的編譯條目。

2.1. 實例引導:TTY_PRINTK 字符設備

在講解Kconfig 和Makefile 的語法之前,我們先利用兩個簡單的實例引導讀者對其建立對具初步的認識。

首先,在drivers/char 目錄中包含了TTY_PRINTK 設備驅動的源代碼drivers/char/ttyprintk.c。而在該目錄的Kconfig 文件中包含關於TTY_PRINTK 的配置項:

config TTY_PRINTK
        tristate "TTY driver to output user messages via printk"
        depends on EXPERT && TTY
        default n
        ---help---
          If you say Y here, the support for writing user messages (i.e.
          console messages) via printk is available.

          The feature is useful to inline user messages with kernel
          messages.
          In order to use this feature, you should output user messages
          to /dev/ttyprintk or redirect console to this TTY.

          If unsure, say N.

上述Kconfig 文件的這段腳本意味着只有在EXPERT 和TTY 被配置的情況下,纔會出現TTY_PRINTK 配置項,這個配置項爲三態(可編譯入內核,可不編譯,也可編譯爲內核模塊,選項分別爲“ Y”、“ N”和“ M”),菜單上顯示的字符串爲“ TTY driver to output user messages via printk ”,“ help”後面的內容爲幫助信息。顯示了TTY_PRINTK 菜單以及help 在運行make menuconfig 時的情況。

除了布爾(bool)配置項外,還存在一種布爾配置選項,它意味着要麼編譯入內核,要麼不編譯,選項爲“Y”或“N”。

在目錄的Makefile 中關於TTY_PRINTK 的編譯項爲:

obj-$(CONFIG_TTY_PRINTK)   += ttyprintk.o

上述腳本意味着如果TTY_PRINTK 配置選項被選擇爲“ Y”或“M”,即obj-$(CONFIG_TTY_PRINTK) 等同於obj-y 或obj-m,則編譯ttyprintk.c,選“Y”時會直接將生成的目標代碼連接到內核,選“ M”時則會生成模塊ttyprintk.ko ;如果TTY_PRINTK 配置選項被選擇爲“N”,即obj-$(CONFIG_TTY_PRINTK) 等同於obj-n,則不編譯ttyprintk.c。

一般而言,驅動開發者會在內核源代碼的drivers 目錄內的相應子目錄中增加新設備驅動的源代碼或者在arch/arm/mach-xxx 下新增加板級支持的代碼,同時增加或修改Kconfig 配置腳本和Makefile 腳本,具體執行完全仿照上述過程即可。

2.2 Makefile

這裏主要對內核源代碼各級子目錄中的kbuild(內核的編譯系統)Makefile 進行簡單介紹,這部分是內核模塊或設備驅動開發者最常接觸到的。

Makefile 的語法包括如下幾個方面。

(1)目標定義

目標定義就是用來定義哪些內容要作爲模塊編譯,哪些要編譯並鏈接進內核。

例如:

obj-y += fingerprint.o

表示要由fingerprint.c 或者fingerpint.s 文件編譯得到fingerprint.o 並鏈接進內核(無條件編譯,所以不需要Kconfig 配置選項),而obj-m 則表示該文件要作爲模塊編譯。obj-n 形式的目標不會被編譯。

更常見的做法是根據make menuconfig 後生成的config 文件的CONFIG_ 變量來決定文件的編譯方式,如:

obj-$(CONFIG_ISDN) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章