偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何在2.6內(nèi)核中編譯內(nèi)核模塊

系統(tǒng) Linux
在以往的內(nèi)核版本中,編譯內(nèi)核模塊比較麻煩。但是在2.6內(nèi)核中全新的編譯內(nèi)核模塊系統(tǒng)做了些簡(jiǎn)化。這就更加方便了大家的使用。

之前我們?cè)?a target="_blank">怎樣完成內(nèi)核模塊編譯?中向大家介紹了如何進(jìn)行模塊編譯。今天在這里,繼續(xù)向大家介紹有關(guān)在2.6內(nèi)核中內(nèi)核模塊的編譯方法。編譯內(nèi)核模塊的方法與編譯一般應(yīng)用程序的方法略有不同. 我們會(huì)發(fā)現(xiàn)在內(nèi)核源碼樹的層層目錄中, 都存在有Makefile. 即這些Makefile是分層次組織的. 以往的內(nèi)核版本中, 編譯內(nèi)核模塊比較麻煩, 需要我們對(duì)這些Makefile做出許多更改. 2.6的內(nèi)核采用了"kbuild"編譯系統(tǒng), 簡(jiǎn)化了這些問題. 關(guān)于kbuild, 可參考內(nèi)核源碼樹中的 /Documentation/kbuild/modules.txt.

編譯之前, 肯定是需要源文件的. 這些源文件可以放在內(nèi)核源碼樹中, 也可以放在內(nèi)核源碼樹之外的任何地方. 根據(jù)源文件存在的目錄, 存在兩種編譯方法: 在源碼樹之中和在源碼樹之外.

在源碼樹中編譯模塊

官方內(nèi)核模塊的源代碼都是按模塊(驅(qū)動(dòng))類型組織的, 我們到內(nèi)核源碼樹的drivers目錄可以看到char, usb, block之類的子目錄. 那么我們?cè)趦?nèi)核源碼樹中添加文件時(shí), ***也遵循這些分類. 分類的規(guī)則自己靈活把握.

下面以前面的"hello, world"這個(gè)簡(jiǎn)單的模塊為例, 來看看如何在內(nèi)核源碼樹中編譯內(nèi)核模塊.

1, 不新建子目錄

(1) 先在內(nèi)核源碼樹中的drivers目錄編輯一個(gè)c源程序, 名為hello.c.
(2) 修改drivers目錄的Makefile文件, 添加: obj-m += hello.o
(3) 重新編譯內(nèi)核(回到源碼樹根目錄, 運(yùn)行 $ sudo make).

這樣, 在drivers目錄多出了這樣幾個(gè)文件: hello.mod.c, hello.mod.o, hello.o, hello.ko. hello.ko就是編譯出來的模塊了.

2, 新建子目錄

如果源文件比較多, 可以在drivers目錄中新建子目錄. 還是以hello, world為例:

(1) 在內(nèi)核源碼樹的drivers目錄中新建一個(gè)hello子目錄, 并將hello.c放在hello目錄中.
(2) 修改drivers目錄的Makefile文件, 添加: obj-m += hello/
(3) 在hello目錄中新建一個(gè)Makefile文件, 內(nèi)容為: obj-m += hello.o
(4) 重新編譯內(nèi)核(回到源碼樹根目錄, 運(yùn)行 $ sudo make).

這樣, 新生成的模塊文件就位于hello目錄中.

若在內(nèi)核源碼樹中編譯內(nèi)核模塊, 如果不新建子目錄, 那么只需修改當(dāng)前目錄的Makefile, 否則應(yīng)該在當(dāng)前新建的子目錄中新建Makefile指定編譯選項(xiàng), 并修改上層目錄的Makefile以讓kbuild能夠進(jìn)入新建的子目錄.

在源碼樹之外編譯模塊

還是以上面的hello, world為例. 在當(dāng)前目錄有個(gè)hello.c:

(1)首先在模塊代碼所在的目錄新建一個(gè)Makefile, 內(nèi)容為:

obj-m := hello.o

(2)這樣調(diào)用make命令:

$ sudo make -C /usr/local/src/kernel/linux-2.6.16.20 SUBDIRS=$PWD modules

這里/usr/local/src/kernel/linux-2.6.16.20是內(nèi)核源碼樹所在的目錄.

-C表示要求make先切換到-C指定的目錄. SUBDIRS(也可以用M代替SUBDIRS)使make在編譯內(nèi)核模塊之前回到當(dāng)前目錄.

整個(gè)編譯過程實(shí)際上是執(zhí)行-C指定的內(nèi)核源碼樹的Makefile, 并通過SUBDIR指定你要編譯的內(nèi)核源文件的目錄.

簡(jiǎn)化命令行輸入

每次調(diào)用make的時(shí)候輸入這些參數(shù)比較比較麻煩, 可以這樣來改寫Makefile以簡(jiǎn)化:

 

obj-m += hello.oall: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
這樣, 只需在當(dāng)前目錄調(diào)用 $ sudo make 就可以完成上面的工作. 調(diào)用 $ sudo make clean 將刪除所有新生成的文件.

上面的Makefile是這樣確定內(nèi)核源碼樹所在的目錄的: 我們先到/lib/modules目錄, 會(huì)看到一些以內(nèi)核版本為名的目錄, 目錄中有一個(gè)build文件, 它是一個(gè)符號(hào)連接, 指向內(nèi)核源碼樹. 那么如何確定進(jìn)入哪個(gè)內(nèi)核版本的目錄呢? 這就可以通過 $ uname -r 來確定, 它指出了當(dāng)前運(yùn)行內(nèi)核的版本.

還可以進(jìn)一步簡(jiǎn)化這個(gè)Makefile:

  1. obj-m :hello.o  
  2. KERNELDIR ?= /lib/modules/$(shell uname -r)/build  
  3. PWD := $(shell pwd)  
  4. default:   
  5. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
  6. clean:   
  7. $(MAKE) -C $(KERNELDIR) M=$(PWD) clean 

 

這樣不用在Makefile中一次又一次地指定內(nèi)核代碼樹的目錄.

上面的例子中只討論了所有的代碼在一個(gè)文件中的情況. 若代碼分布在多個(gè)源文件中, 比如file1.c, file2.c, 生成hello.ko. 應(yīng)該這樣寫Makefile:

  1. obj-m :hello.o  
  2. hello-objs :file1.o file2.o 

注意, 雖然我們的目的是生成.ko文件, 但在Makefile中寫為.o!

【編輯推薦】

  1. Linux 2.6.31內(nèi)核優(yōu)化指南
  2. Ubuntu 9.10基于Linux 2.6.31.1內(nèi)核
  3. Linux 2.6完全公平調(diào)度器內(nèi)幕
  4. linux 2.6內(nèi)核配置選項(xiàng)注解
  5. uboot燒錄和啟動(dòng)Linux2.6.16內(nèi)核
責(zé)任編輯:張浩 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2009-12-17 15:28:32

內(nèi)核模塊編譯

2023-05-08 08:05:42

內(nèi)核模塊Linux

2010-01-22 11:01:04

linux內(nèi)核模塊

2018-06-19 09:07:57

Linux內(nèi)核模塊

2011-08-29 15:12:24

UbuntuLinux模塊

2019-07-08 20:00:35

Linux內(nèi)核模塊

2021-09-03 08:44:51

內(nèi)核模塊Linux社區(qū)

2010-02-02 11:00:03

Linux 2.6內(nèi)核

2021-07-06 14:36:05

RustLinux內(nèi)核模塊

2018-05-14 09:48:45

Linux內(nèi)核模塊Kgotobed

2022-05-14 17:01:21

開源LinuxNVIDIA

2021-05-18 14:25:30

Linux運(yùn)維Linux系統(tǒng)

2017-01-15 22:51:16

2011-02-28 10:31:02

Linux 2.6內(nèi)核

2022-05-12 09:58:31

LinuxNVIDIA開源

2017-03-09 17:02:23

UbuntuLinux升級(jí)

2021-03-08 11:47:34

內(nèi)核Linux內(nèi)核模塊

2010-01-13 09:58:42

2014-07-24 14:35:26

Linux內(nèi)核模塊

2019-08-19 11:55:10

UbuntuLinux內(nèi)核
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)