核心模組的編譯

來源:互聯網
上載者:User

      編譯核心模組的方法與編譯一般應用程式的方法略有不同.
我們會發現在核心源碼樹的層層目錄中, 都存在有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進行編譯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.