編譯核心模組的方法與編譯一般應用程式的方法略有不同.
我們會發現在核心源碼樹的層層目錄中, 都存在有Makefile.
即這些Makefile是分層次組織的.
以往的核心版本中, 編譯模組比較麻煩,
需要我們對這些Makefile做出許多更改. 2.6的核心採用了"kbuild"編譯系統,
簡化了這些問題. 編譯之前,
肯定是需要源檔案的. 這些源檔案可以放在核心源碼樹中,
也可以放在核心源碼樹之外的任何地方. 根據源檔案存在的目錄,
存在兩種編譯方法: 在源碼樹之中和在源碼樹之外.
源碼樹中編譯
官方核心模組的原始碼都是按模組(驅動)類型組織的,
我們到核心源碼樹的drivers目錄可以看到char, usb, block之類的子目錄.
不建立子目錄:
(1)先在核心源碼樹中的drivers目錄編輯一個c來源程式,
名為hello.c.
(2)修改drivers目錄的Makefile檔案,
添加: obj-m += hello.o
(3)重新編譯核心(回到源碼樹根目錄,
運行 $
sudo make).
建立子目錄:
如果源檔案比較多,
可以在drivers目錄中建立子目錄.
還是以hello, world為例:
(1) 在核心源碼樹的drivers目錄中建立一個hello子目錄,
並將hello.c放在hello目錄中.
(2) 修改drivers目錄的Makefile檔案,
添加: obj-m += hello/
(3) 在hello目錄中建立一個Makefile檔案,
內容為: obj-m += hello.o
(4) 重新編譯核心(回到源碼樹根目錄,
運行 $
sudo make).
這樣,
新產生的模組檔案就位於hello目錄中.
源碼樹外編譯
(1) 首先在模組代碼所在的目錄建立一個Makefile,
內容為:
obj-m := hello.o
(2)這樣調用make命令:
$ sudo make -C /usr/local/src/kernel/linux-2.37.6 SUBDIRS=$PWD modules
簡化命令列輸入
obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
這樣不用在Makefile中一次又一次地指定核心代碼樹的目錄,只需在源碼樹所在路徑中輸入sudo make進行編譯。