版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
模塊靜態(tài)及動(dòng)態(tài)加載方式電子信息工程專業(yè)主要內(nèi)容模塊靜態(tài)加載
靜態(tài)加載的定義
靜態(tài)加載的實(shí)例模塊動(dòng)態(tài)加載
動(dòng)態(tài)加載的定義
動(dòng)態(tài)加載的優(yōu)點(diǎn)
動(dòng)態(tài)加載的實(shí)例模塊靜態(tài)加載驅(qū)動(dòng)的靜態(tài)加載指的是直接把驅(qū)動(dòng)程序編譯進(jìn)內(nèi)核,在系統(tǒng)啟動(dòng)后可直接調(diào)用,不需要任何加載卸載命令。修改內(nèi)核目錄下的configure文件添加LED選項(xiàng)修改$linux-/drivers/char目錄下的Kconfig文件,在圖中黑底位置加入如下內(nèi)容修改并保存:修改內(nèi)核目錄下的makefile文件添加編譯LED目標(biāo)文件
修改$linux-/drivers/char目錄下的Makefile文檔,在文件的適當(dāng)位置按照如下內(nèi)容修改并保存:進(jìn)行內(nèi)核配置加入LED模塊的支持單擊菜單應(yīng)用程序->附件->終端打開終端,在終端命令行輸入以下命令配置裁剪內(nèi)核。$cd$linux-$makemenuconfig.完成配置文件的選擇后,菜單將進(jìn)入到初始界面,接下來(lái)將根據(jù)下面的步驟來(lái)完成對(duì)LED驅(qū)動(dòng)的支持,通過(guò)計(jì)算機(jī)鍵盤上下鍵選擇DeviceDrivers并按回車,將出現(xiàn)以下菜單:內(nèi)核配置添加對(duì)字符類設(shè)備的支持編譯內(nèi)核執(zhí)行以下命令編譯內(nèi)核:$makezImage編譯完成之后將在路徑$linux-/arch/arm/boot下生成zImage
鏡象,
下載到開發(fā)板編譯測(cè)試程序Arm-linux-gcc–oled-testled-test.c
生成執(zhí)行程序準(zhǔn)備開發(fā)板準(zhǔn)備好EmbedSky2440平臺(tái),注意板上的跳線為閉合狀態(tài),
且確保EmbedSky2440板載Linux
映像為實(shí)驗(yàn)映像(請(qǐng)參照下冊(cè)開篇:實(shí)驗(yàn)環(huán)境構(gòu)建),連接好交叉串口線于板載COM2和PC端串口,
連接好交叉網(wǎng)線與板載主板網(wǎng)卡接口和PC
端網(wǎng)口。運(yùn)行測(cè)試程序11.啟動(dòng)完成后,在minicom下執(zhí)行以下命令將led_test
下載到tmp目錄下12.給led_test
添加可執(zhí)行權(quán)限。#chmod777led_test13.運(yùn)行l(wèi)ed_test。#./led_test字符類驅(qū)動(dòng)程序的框架Structcdev的定義Struct可能包含以下函數(shù)定義設(shè)備的打開與釋放:open(),release()設(shè)備的讀寫操作:read(),write()設(shè)備的控制操作:ioctl()*設(shè)備的中斷和輪詢處理示例:static
structdemo_fops={ owner:
THIS_MODULE, write:
demo_write, read:
demo_read, ioctl: demo_ioctl, open: demo_open, release: demo_release,…};設(shè)備的打開與釋放-open(),release()經(jīng)常為print語(yǔ)句static
int
demo_open(structinode
*inode,structfile*file) { MOD_INC_USE_COUNT; sprintf(drv_buf,"deviceopensucess!\n"); printk("deviceopensucess!\n");
return0;}設(shè)備的讀寫操作:read(),write()主要是調(diào)用copy_to_user()和copy_from_user()完成;示例:staticssize_tdemo_read(structfile*filp,char*buffer,size_tcount,loff_t*ppos){
if(count>MAX_BUF_LEN) count=MAX_BUF_LEN;
//yourcodehere,readdataintodrv_buffromdevice, copy_to_user(buffer,drv_buf,count); printk("userreaddatafromdriver\n");
returncount;}設(shè)備的控制操作:ioctl()利用switch語(yǔ)句實(shí)現(xiàn)對(duì)設(shè)備的控制staticintleds_ioctl(structinode*inode,structfile*file,unsignedintcmd,
unsignedlongarg)
{
switch(cmd)
{
case0:
case1:
if(arg>4)
{
return-EINVAL;
}
write_gpio_bit(led_table[arg],!cmd);
default:
return-EINVAL;
}
模塊加載函數(shù)init()函數(shù)獲取設(shè)備號(hào)注冊(cè)設(shè)備register
函數(shù)分配內(nèi)存空間alloc
函數(shù)示例:staticint__init
dev_init(void){intret;inti;for(i=0;i<4;i++){s3c2410_gpio_cfgpin(gpio_table[i],gpio_cfg_table[i]);s3c2410_gpio_setpin(gpio_table[i],0);}ret=misc_register(&misc);printk(DEVICE_NAME"initialized\n");returnret;}模塊卸載函數(shù)exit()函數(shù)注銷設(shè)備示例staticvoid__exitdev_exit(void){misc_deregister(&misc);}動(dòng)態(tài)加載優(yōu)點(diǎn)
可以讓內(nèi)核保持很小的尺寸并非常靈活。模塊機(jī)制可以無(wú)需
重構(gòu)內(nèi)核并頻繁重新啟動(dòng)來(lái)嘗試運(yùn)行新內(nèi)
核代碼。用戶可以根據(jù)自己
系統(tǒng)的需要構(gòu)筑自己的私有內(nèi)核。Linux源碼的公開更是為改造其內(nèi)核、
重建有特殊要求的操作系統(tǒng)提供了可能。動(dòng)態(tài)加載的命令I(lǐng)nsmod/modprobe加載模塊Rmmod
卸載模塊Lsmod
顯示模塊Depmod
建立依賴關(guān)系Insmod命令方式語(yǔ)法:insmod[-fkmpsvxX][-o<模塊名稱>][模塊文件][符號(hào)名稱=符號(hào)值]補(bǔ)充說(shuō)明:Linux有許多功能是通過(guò)模塊的方式,在需要時(shí)才載入kernel。如此可使kernel較為精簡(jiǎn),進(jìn)而提高效率,以及保有較大的彈性。
這類可載入的模塊,通常是設(shè)備驅(qū)動(dòng)程序。示例:Insmod
led.o模塊動(dòng)態(tài)卸載方式和模塊的加載類似,可利用
rmmod
命令手工卸載模塊,當(dāng)對(duì)需求加載的模塊則由
kerneld
在不再需要時(shí)自動(dòng)卸載。每次
kerneld
的空閑定時(shí)器到期時(shí),它會(huì)利用系統(tǒng)調(diào)用將當(dāng)前不再使用的需求加載模塊從內(nèi)核中移走。啟動(dòng)
kerneld
時(shí)指定該定時(shí)器的時(shí)間,通常的時(shí)間為180秒。如果內(nèi)核的其他部分依賴于裝入的模塊時(shí),該模塊不能卸載。例如,如果掛裝了FAT文件系統(tǒng),則不能卸載已裝入的FAT文件系統(tǒng)模塊。lsmod命令的輸出會(huì)顯示已安裝模塊的使用計(jì)數(shù),例如:Module: #pages: Usedby:
msdos 5 1
vfat
4 1(autoclean)
fat
6 2(autoclean)模塊動(dòng)態(tài)加載的步驟編譯生成模塊文件(*.ko)利用命令
加載進(jìn)內(nèi)核查看加載
情況及獲取主設(shè)備號(hào)節(jié)點(diǎn)掛
載運(yùn)行測(cè)
試程序模塊動(dòng)態(tài)加載實(shí)例說(shuō)明:myled.c、myled.h、Make文件放在/home/cj/myled文件夾下;內(nèi)核代碼在/home/cj/linux-文件夾下;系統(tǒng)通過(guò)tftp進(jìn)行啟動(dòng),系統(tǒng)的文件系統(tǒng)在/opt/下面通過(guò)nfs進(jìn)行掛載。模塊動(dòng)態(tài)加載實(shí)例利用交叉編譯器將設(shè)備驅(qū)動(dòng)源碼編譯生成模塊文件例如:在/home/cj/myled文件夾下進(jìn)行make得myled.
ko文件模塊動(dòng)態(tài)加載實(shí)例
將模塊加載進(jìn)開發(fā)板內(nèi)核中例如:在myled文件夾下,通過(guò)insmod./myled.ko命令加載內(nèi)核目標(biāo)文件不用時(shí)通過(guò)rmmod./meyled命令可以卸載它。此
外,也可以通過(guò)modprobe./myled命令加載,通過(guò)modprobe–r./myled進(jìn)行卸載。
其中modprobe命令比insmod命令要強(qiáng)大,
它在加載某模塊時(shí)會(huì)同時(shí)加載該模塊所依賴的其他模塊。模塊動(dòng)態(tài)加載實(shí)例
查看模塊加載情況,獲取主設(shè)備號(hào)例如:可通過(guò)lsmod命令獲得系統(tǒng)中加載了的所有模塊以及模塊間的依賴關(guān)系。通過(guò)cat
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度新能源行業(yè)銷售人員2025年度勞動(dòng)合同2篇
- 2025年住房公積金租房提取政策執(zhí)行效果評(píng)估合同3篇
- 二零二五年度農(nóng)村土地互換及農(nóng)業(yè)科技創(chuàng)新協(xié)議書
- 二零二五年度農(nóng)村房屋贈(zèng)與合同附農(nóng)業(yè)科技研發(fā)合作協(xié)議
- 二零二五年度醫(yī)療影像設(shè)備加工承攬合同3篇
- 二零二五年度公司租賃車輛駕駛?cè)藛T考核及培訓(xùn)協(xié)議2篇
- 二零二五年度公司與自然人環(huán)保項(xiàng)目合作協(xié)議3篇
- 二零二五年度智能家電產(chǎn)品開發(fā)合作協(xié)議書2篇
- 2025年度網(wǎng)約貨車司機(jī)兼職服務(wù)協(xié)議3篇
- 2025年度環(huán)保型機(jī)械研發(fā)與生產(chǎn)合作協(xié)議3篇
- 麻醉科主任述職報(bào)告
- PDCA降低護(hù)士針刺傷發(fā)生率
- 申請(qǐng)失業(yè)保險(xiǎn)金承諾書
- 工程竣工資料整理工程資料服務(wù)合同
- 智能化手術(shù)室介紹strykerisuite課件
- 水利機(jī)械施工方案
- 廣東省佛山市南海區(qū)大瀝鎮(zhèn)2023-2024學(xué)年九年級(jí)上學(xué)期期中物理試卷
- ESD內(nèi)部審核日程計(jì)劃表+內(nèi)審檢查表+內(nèi)審報(bào)告全套資料
- HSK標(biāo)準(zhǔn)教程5下-課件-L
- 電腦基礎(chǔ)知識(shí)
- 工程竣工預(yù)驗(yàn)收簽到表
評(píng)論
0/150
提交評(píng)論