在看的時候,作者其中提到setting up your test system。他只是指出為2.6.x編寫模組,首先,要求你在linux系統上構建和配置核心樹,對於2.6版本的核心來說,已有的標頭檔案已經足夠了,但是2.6的模組鏈結著核心原始碼樹中的物件檔案。這樣模組載入器將更健壯,但是也要求這些物件檔案存在。所以驅動開發的第一件事情就是構建核心原始碼樹。
他沒有提到如何構建,我從網上找了一些資料,構建了自己的核心樹,寫出來大家分享一下。
本人使用的是debian 8, 如果是虛擬機器的話,記憶體最好要大於15g,不然可能不夠用。
首先檢視自己的linux核心的版本,在終端中輸入: uname -r(也可以使用uname -a 來檢視更具體的資訊)
然後進入 usr/src/下檢視是否有linux-source 檔案,一般是沒有的,至少我的debian 8沒有
沒有就去網上查詢,在終端中輸入: apt-cache search linux-source
可以看到結果:
linux-source-3.16 - linux kernel source for version 3.16 with debian patches
linux-source - linux kernel source (meta-package)
xz−
dlin
ux−s
ourc
e−3.16.ta
r.xz
tar jxvf linux-source-3.16.tar
解壓得到檔案源**檔案,該源**資料夾名稱為linux-source-3.16,進入該目錄,注意此時在終端中應該是這樣的:
lightmouse@lightmouse:/usr/src/linux-source-3.16$
因為解壓出來的源**資料夾位於linux-source-3.16下,所以有兩層。
開始配置核心,選擇最快的原版的配置(預設)方式:在終端中輸入:make oldconfig
然後編譯模組,定位到源**資料夾下,在終端中輸入: make modules
等待將近1個小時,該編譯完成。完成之後,安裝模組,在終端中輸入:make modules_install
至此,原始碼樹構建完成,重啟系統,
將《linux device driver third edition》中的第乙個例子執行下吧。
文中**:helloworld.c
[cpp] view plaincopy
#include#includemodule_license("dual bsd/gpl");
static int hello_init(void)
static void hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
makefile檔案內容:
[cpp] view plaincopy
obj-m := helloworld.o #必須與helloworld.c檔名稱相同。
kerneldir := /lib/modules/linux/build
pwd := $(shell pwd)
modules:
$(make) -c $(kerneldir) m=$(pwd) modules
modules_install:
$(make) -c $(kerneldir) m=$(pwd) modules_install
編譯,在終端中輸入:make
[cpp] view plaincopy
jk1860@jk1860-machine:~/driverlinux$ make
make -c /lib/modules/linux/build m=/home/jk1860/driverlinux modules
make[1]: 正在進入目錄 `/usr/src/linux-headers-2.6.35-22-generic'
building modules, stage 2.
modpost 1 modules
make[1]:正在離開目錄 `/usr/src/linux-headers-2.6.35-22-generic'
然後載入模組 (root使用者)
root@jk1860-machine:/home/shana/driver# insmod ./helloworld.ko
按照書上的例子 會在終端顯示 hello , world 但是執行後什麼都沒有出現 (原因不解)
root@jk1860-machine:/home/shana/driver# insmod ./helloworld.ko
檢視載入模組
root@jk1860-machine:/home/shana/driver# lsmod
module size used by
helloworld 2560 0
刪除模組
root@jk1860-machine:/home/shana/driver# rmmod helloworld
書中說明,如果不出現在終端,則會寫進 syslog 檔案中
root@jk1860-machine:~# cat /var/log/syslog |grep world
jan 20 10:21:23 jk1860-machine kernel: [ 1683.984471] hello world
jan 20 10:22:35 jk1860-machine kernel: [ 1755.752461] goodbye, cruel world
驅動開發環境搭建完成。 Linux驅動開發環境配置 核心原始碼樹構造
2 然後在linux核心原始碼目錄 usr src linux source 2.6.32目錄下面用老的方法配置好linux核心 root jiq desktop usr src linux source 2.6.32 make oldconfig 3 然後執行 root jiq desktop u...
linux 驅動開發環境配置 核心原始碼樹構造
linux驅動開發環境配置 核心原始碼樹構造 初次接觸linux驅動程式開發,買了一本 linux裝置驅動程式 第一件事當然就是構建開發環境了!它上面有乙個hello world的列子 include include module license dual bsd gpl static int he...
Linux驅動開發環境配置 核心原始碼樹構造
2 然後在linux核心原始碼目錄 usr src linux source 2.6.32目錄下面用老的方法配置好linux核心 root jiq desktop usr src linux source 2.6.32 make oldconfig 3 然後執行 root jiq desktop u...