一、手工加載測試
創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站設計、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元武隆做網(wǎng)站,已為上家服務,為武隆各地企業(yè)和個人服務,聯(lián)系電話:13518219792
1、insmod
./key_test.ko
加載驅動模塊到內核
2、cat
/proc/modules
|grep
key_test
查看key_test模塊在內核中的地址,不加過濾器可以看到全部加載的模塊。
3、lsmod
顯示模塊,這時可以看到所有的模塊名字,后面跟的是主設備號和次設備號。
4、rmmod
key_test
把模塊從內核里卸載。
二、動態(tài)加載
1、把key_test.c源代碼放到內核源代碼的/drives/char/下,因為這是屬字符型驅動,放在這編譯到zImage中。
2、這時我們make
menuconfig
編譯內核是看不到key_test這個選項的。我們把這個選項寫到菜單里面才行。在內核源代碼的/drives/char/下有一個Kconfig文件,打開
(1)
vi
Kconfig
加幾行到里面:
config
ConFig_key_test
bool
"key
test"
//前面那個bool換成tristate就是支持模塊化編譯
上面句是在make
menuconfig時會出現(xiàn)key
test這個選項在drive/char子菜單下,bool前面是TAB鍵
------help----------
這句是出現(xiàn)在菜單選項下面的
This
key
test
help.
這句是你的驅動的說明會出現(xiàn)在help里面
(2)在/drivers/char目錄下的Makefile文件里加上一句:
obj-$(CONFIG_key_test)
+=
key_test.o
上面這句是讓Make時把key_test編譯到內核中.
(3)
make
menuconfig
把key_test選項選取上
(4)
make
zImage
生成zImage文件,重啟動加載這個新編的內核。
3、lsmod就能看到key_test了,但是還不能用,沒有接口,也就是/dev下面沒有
4、mknod
/dev/key_test
c
121
這是創(chuàng)建設備到/dev下,使普通程序可以調用了,121是在源代碼里定義的它的主設備號,0是次設備號。
5、cat
/dev/key_test
這是相當于open這個設備了,或者寫一個程序直接調用open、write等函數(shù)。
fd=("/dev/key_test",ORW);
第一步:準備源代碼
首先我們還是要來編寫一個符合linux格式的模塊文件,這樣我們才能開始我們的模塊編譯。假設我們有一個源文件mymod.c。它的源碼如下:
mymodules.c
1. #include linux/module.h /* 引入與模塊相關的宏 */
2. #include linux/init.h /* 引入module_init() module_exit()函數(shù) */
3. #include linux/moduleparam.h /* 引入module_param() */
4
5. MODULE_AUTHOR("Yu Qiang");
6. MODULE_LICENSE("GPL");
7
8. static int nbr = 10;
9. module_param(nbr, int, S_IRUGO);
10.
11. static int __init yuer_init(void)
12.{
13. int i;
14. for(i=0; inbr; i++)
15. {
16. printk(KERN_ALERT "Hello, How are you. %d/n", i);
17. }
18. return 0;
19.}
20.
21.static void __exit yuer_exit(void)
22.{
23. printk(KERN_ALERT"I come from yuer's module, I have been unlad./n");
24.}
25.
26. module_init(yuer_init);
27. module_exit(yuer_exit);
我們的源文件就準備的差不多了,這就是一個linux下的模塊的基本結構。第9行是導出我們的符號變量nbr。這樣在你加載這個模塊的時候可以動態(tài)修改這個變量的值。稍后將演示。yuer_init()函數(shù)將在模塊加載的時候運行,通過輸出的結果可以看到我們的模塊是否加載成功。
第二步:編寫Makefile文件
首先還是來看看我們Makefile的源文件,然后我們再來解釋;
Makefile
obj-m := modules.o #要生成的模塊名
modules-objs:= mymod.o #生成這個模塊名所需要的目標文件
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions
ARM平臺
Makefile
obj-m += mymod.o
KDIR := /home/workspace2/kernel/linux-2.6.25 #如果是用于arm平臺,則內核路徑為arm內核的路徑
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o
在arm板上插入是
insmod mymod
如果出現(xiàn)以下錯誤
insmod: chdir(/lib/modules): No such file or directory
則運行
mkdir /lib/modules/2.6.25 (與arm內核版本相同)
并將mymod.ko文件復制到該目錄下
cp mymod.ko /lib/modules/2.6.25
然后再執(zhí)行 (insmod 只在/lib/modules/2.6.25目錄下查找相關驅動模塊)
insmod mymod
現(xiàn)在我來說明一下這個Makefile。請記住是大寫的Makefile而不是小寫的makefile;
obj-m :這個變量是指定你要聲稱哪些模塊模塊的格式為 obj-m := 模塊名.o
modules-objs :這個變量是說明聲稱模塊modules需要的目標文件 格式要求 模塊名-objs := 目標文件
切記:模塊的名字不能取與目標文件相同的名字。如在這里模塊名不能取成 mymod;
KDIR :這是我們正在運行的操作系統(tǒng)內核編譯目錄。也就是編譯模塊需要的環(huán)境
M= :指定我們源文件的位置
PWD :這是當前工作路徑$(shell )是make的一個內置函數(shù)。用來執(zhí)行shell命令。
第三步:編譯模塊
現(xiàn)在我們已經準備好了我們所需要的源文件和相應的Makefile。我們現(xiàn)在就可以編譯了。在終端進入源文件目錄輸入make
運行結果:
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'
CC [M] /home/yuqiang/桌面/mymodule/mymodules.o
LD [M] /home/yuqiang/桌面/mymodule/modules.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/yuqiang/桌面/mymodule/modules.mod.o
LD [M] /home/yuqiang/桌面/mymodule/modules.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'
第四步:加載/卸載我們的模塊
從上面的編譯中我可以看到。已經有一個modules.ko生成了。這就是我們的模塊了?,F(xiàn)在我們就可以來加載了。
首先在終端輸入:sudo insmod modules.ko
現(xiàn)在我們來看看我們的模塊加載成功沒有呢?
在終端輸入:dmesg | tail -12 這是查看內核輸出信息的意思。tail -12 顯示最后12條;
顯示結果如下:
[17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0
[18046.790019] usb 5-8: USB disconnect, address 9
[19934.224812] Hello, How are you. 0
[19934.224817] Hello, How are you. 1
[19934.224818] Hello, How are you. 2
[19934.224820] Hello, How are you. 3
[19934.224821] Hello, How are you. 4
[19934.224822] Hello, How are you. 5
[19934.224824] Hello, How are you. 6
[19934.224825] Hello, How are you. 7
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
看到了吧。我們的模塊的初始化函數(shù)yuer_init();已經成功運行了。說明我們的模塊已經加載成功;
現(xiàn)在我們再來卸載模塊試試看。
在終端輸入:sudo rmmod modules
在終端輸入:dmesg | tail -3
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
[20412.046932] I come from yuer's module, I have been unlad.
可以從打印的信息中看到,我們的模塊的退出函數(shù)已經被執(zhí)行了。說明我們的模塊已經被成功的卸載了。到目前位置我們就已經算是對模塊的編譯到編譯運行算是有了一個整體上的認識了。對于以后深入的學習還是應該有點幫助的。下面我們將在看看于模塊相關的一些簡單的操作。
第五步:加載模塊時傳遞參數(shù)
在終端輸入:sudo insmod module_name.ko nbr=4
在終端輸入:dmesg | tail -6
顯示結果如下:
[20800.655694] Hello, How are you. 9
[21318.675593] I come from onefile module, I have been unlad.
[21334.425373] Hello, How are you. 0
[21334.425378] Hello, How are you. 1
[21334.425380] Hello, How are you. 2
[21334.425381] Hello, How are you. 3
這樣我們就可以看到在模塊加載的時候動態(tài)設置了我們的一個變量。初始化函數(shù)中的循環(huán)只執(zhí)行了4次。
可能你會問我怎么知道一個模塊可以設置那些變量呢。當然,你可以先不設變量加載一次。然后可以在終端輸入ls /sys/module/modules_name/parameters/來查看。在這里我們是這樣輸入的
在終端輸入:ls /sys/moedle/modules/parameters/
顯示結果:
nbr
如果我們的模塊加載成功了。最后我們還可以通過modinfo來查看我們的模塊信息。如下
在終端輸入:sudo modinfo modules.ko
顯示結果:
filename: modules.ko
license: GPL
author: Yu Qiang
srcversion: 20E9C3C4E02D130E6E92533
depends:
vermagic: 2.6.24-24-generic SMP mod_unload 586
parm: nbr:int
linux 編譯安裝驅動有兩種,動態(tài)加載與靜態(tài)加載
動態(tài)加載
一,編譯,在指點內核樹下編譯,生成.o文件或.ko文件
二,將生成的.o或.ko文件拷到相應目錄,一般是/lib/module/kernel下面
三,用insmod命令加載,用rmmod命令卸載
靜態(tài)加載
靜態(tài)加載主要就是編譯內核。就是將編寫好的驅動放進內核相應的目錄下面。然后編譯內核。然后運行編譯好的內核。
配置好了Ubuntu下的c++環(huán)境,gcc以及g++可用。2.使用eclipse for c+做OpenGL開發(fā) 步驟一:在ubuntu終端下運行以下命令,安裝opengl所需要的庫文件$ sudo apt-get
第二步, 運行驅動程序,切換到“硬件檢測”選項卡,就可以查看本機電腦顯卡驅動程序的版本以及具體顯卡型號啦;
第三步,通過切換到“驅動程序”選項卡,選擇最新版本的顯卡驅動進行安裝。
除顯卡驅動版本較低外,顯卡硬件較差也有可能導致無法正常運行,模擬器電腦顯卡配置要求情況如下,對此只得升級顯卡硬件或購買新的高性能顯卡硬件設備來運行模擬器。
第二種:
第一步,右鍵點擊我的電腦(win10用戶則是此電腦)—管理,
第二步,在彈出來的計算機管理窗口里面找到設備管理器-顯示適配器;
第三步,打開顯示適配器之后,右鍵點擊對應的顯卡,然后點擊更新驅動程序;
第四步,在點擊更新驅動程序之后,會彈出如下窗口,點擊找到搜索驅動程序進行更新即可。