Linux內核驅(qu)動的platform機(ji)制(zhi)
時間(jian):2018-07-26 來源:未知
1.模塊(一種特殊(shu)的(de)內核代碼寫法,一般編譯成ko文件,用于(yu)承載用戶想要動態添加進內核的(de)代碼(不限于(yu)驅動))
a.寫法
module_init(模塊構造(zao)函數 );
module_init(模(mo)塊(kuai)析構(gou)函數 );
b.編譯
標準的Makefile
c.模塊相關工具(ju)
insmod/rmmod/lsmod/modinfo/modprobe/depmod
為了自動(dong)安裝有(you)依賴關(guan)系的模塊,兩個前提: 1.模塊必(bi)須(xu)都(dou)拷貝(bei)到/lib/modules/3.14.0; 2.執(zhi)行(xing)depmod
2.字符設備驅動框架
1.認知
a. 無系統(tong)編程(裸機編程.bin,hex)--有系統(tong)編程(安(an)全,并發,豐(feng)富的驅動。。。elf,exe)
b. OS管(guan)理了所(suo)有驅動,而且各個(ge)操(cao)作系(xi)統管(guan)理結構(數據結構)不(bu)一定一樣
c. 了解(jie)數據結構的意義
d. 回掉
e. 計算(suan)機喜(xi)歡數字(zi)而不是字(zi)符串
2.名詞
設(she)備文(wen)件(jian): 一(yi)個(ge)特殊的文(wen)件(jian)用于抽象設(she)備操作入口,用與隱藏(zang)設(she)備號細(xi)節(jie)(域名-IP)
設(she)備(bei)號(hao):設(she)備(bei)驅動的(de)代號(hao),主設(she)備(bei)號(hao) 次設(she)備(bei)號(hao)
驅動:讓硬件工作起來的軟件(裸機驅動 系(xi)統之下的驅動)
驅動框架:平臺(操作系統(tong))對驅動編寫的要求
3.涉及的函數
申請設備號:
強制(zhi)申請(qing)int register_chrdev_region(dev_t first, unsigned int count, char *name)
動(dong)態申(shen)請int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)//name設備號說明(ming)信息(/proc/devices)
釋放設備號:
void unregister_chrdev_region(dev_t first, unsigned int count);
初(chu)始(shi)化cdev:
void cdev_init(struct cdev *, const struct file_operations *);
注冊cdev:
int cdev_add(struct cdev *, dev_t, unsigned);
移除(chu)cdev:
void cdev_del(struct cdev *);
1.長(chang)得像驅動
struct cdev myled{
.dev = 250
.fops{
.open = led_on;
.release = led_off;
}
};
2.放到(dao)內(nei)核中去
寫到(dao)module.c
3.加入內(nei)核管理(li)驅動的數據(ju)結構
cdev_add(&myled, 250, 1);
cdev_del(&myled);
1.內核希望你(ni)寫(xie)(xie)驅(qu)動(dong)的時候采用總線(xian)(xian)、設(she)備(bei)、驅(qu)動(dong)分離的方式來(lai)寫(xie)(xie),而為了分離沒(mei)有(you)具體(ti)(I2C,SPI,USB...)總線(xian)(xian)的設(she)備(bei)發明(ming)了一個虛擬的platform_bus總線(xian)(xian)
a.platform_device: 注冊設備(bei)必要的資源(基(ji)地址,引腳,中斷號,波特率,ip,精度。。。)信息
b.platform_driver:實現設備(bei)操作做的算(suan)法(不包含具體數據,必須先匹(pi)配(pei)再獲取);
1. Linux系統中以模塊方式(shi)組織設備驅動程(cheng)序(xu)(xu),請(qing)列(lie)舉在(zai)一(yi)個(ge)模塊程(cheng)序(xu)(xu)中必不可(ke)少的組成部分(fen)。 (可(ke)以寫(xie)個(ge)Hello world模塊的程(cheng)序(xu)(xu))__init __exit
2. 請說明一下從(cong)零創建(jian)一個linux字(zi)符設備驅動的步驟?
4. 簡述Linux設備(bei)驅動(dong)中(zhong)使用中(zhong)斷的步驟(zou)。
5. 簡述信號(hao)量和自旋鎖的(de)異同和使用時的(de)注意事項。
6. 簡述命令(ling) mknod /dev/zero c 1 5 的(de)做用和命令(ling)各個(ge)部分(fen)的(de)含義(yi),并寫出創建一個(ge)塊設備節(jie)點(dian)的(de)命令(ling)(把(ba)c改成b)。
7. 簡述命令(ling)insmod,rmmod,lsmod,depmod,modprobe 的(de)功能(neng)。
8. 簡(jian)述(shu)platform設(she)備(bei)(bei)基本原理(li), platform設(she)備(bei)(bei)最(zui)大優勢是(shi)什(shen)么?
9. 簡述設備驅動程序和普(pu)通(tong)應用(yong)程序的異同點。
10. 簡述mmap機(ji)制的作用(yong)和使用(yong)mmap的好(hao)處。
1. #include
#include
#include
static int hello_init(void)
{
printk(KERN_ALERT "Hello world enter!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ ALERT " Hello world exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
2.
使(shi)用(yong)alloc_...方法動態注冊(ce)設備(bei)號;
為cdev申請內(nei)存;
初始化設(she)備(bei)并(bing)添(tian)加該設(she)備(bei);
完(wan)成file_operations中的相應函(han)數(shu)功能;
4. request_irq,申請irq;
free_irq,釋(shi)放irq。
5. 信(xin)號(hao)(hao)(hao)量(liang)和自(zi)(zi)(zi)旋(xuan)(xuan)鎖(suo)都是解決互斥(chi)問題的(de)基本手(shou)段,信(xin)號(hao)(hao)(hao)量(liang)的(de)實現依賴于自(zi)(zi)(zi)旋(xuan)(xuan)鎖(suo)。使(shi)用(yong)信(xin)號(hao)(hao)(hao)量(liang)機制時,進(jin)程若不(bu)(bu)能(neng)獲得信(xin)號(hao)(hao)(hao)量(liang),進(jin)程不(bu)(bu)會如自(zi)(zi)(zi)旋(xuan)(xuan)鎖(suo)那(nei)樣(yang)原地(di)打轉,而是讓進(jin)程進(jin)入(ru)休眠(mian)等待狀態。當使(shi)用(yong)信(xin)號(hao)(hao)(hao)量(liang)的(de)開銷(xiao)時間T1大于使(shi)用(yong)自(zi)(zi)(zi)旋(xuan)(xuan)鎖(suo)的(de)開銷(xiao)T2時,宜使(shi)用(yong)自(zi)(zi)(zi)旋(xuan)(xuan)鎖(suo),若T2大于T1,則(ze)宜使(shi)用(yong)信(xin)號(hao)(hao)(hao)量(liang)。由(you)于信(xin)號(hao)(hao)(hao)量(liang)所保護(hu)的(de)臨界區可能(neng)包含(han)引起阻塞的(de)代碼(ma),而自(zi)(zi)(zi)旋(xuan)(xuan)鎖(suo)則(ze)絕對要(yao)避(bi)免用(yong)來(lai)保護(hu)這樣(yang)的(de)代碼(ma)。信(xin)號(hao)(hao)(hao)量(liang)存在于進(jin)程上下文,而如果被保護(hu)的(de)資源需要(yao)在中斷或者軟中斷情況下使(shi)用(yong),則(ze)只(zhi)能(neng)選(xuan)擇自(zi)(zi)(zi)旋(xuan)(xuan)鎖(suo)。
6. mknod,該命令用于創(chuang)建(jian)設備(bei)(bei)(bei)節點。/dev/zero 表(biao)(biao)示(shi)設備(bei)(bei)(bei)節點創(chuang)建(jian)的目錄(lu)和名(ming)字(zi),c 代(dai)(dai)表(biao)(biao)創(chuang)建(jian)的設備(bei)(bei)(bei)節點為字(zi)符(fu)設備(bei)(bei)(bei)節點,1 代(dai)(dai)表(biao)(biao)主設備(bei)(bei)(bei)號,5 代(dai)(dai)表(biao)(biao)此設備(bei)(bei)(bei)號。
創建塊設備節點的命令:mknod /dev/blockdev b 253 0
7.insmod:加載(zai)驅動模塊到內核;
Rmmod:從內核刪除驅動模塊;
Lsmod:查看(kan)當(dang)前內核包(bao)含哪些模塊(kuai)
8.原理:
第一(yi):定義一(yi)個platform_driver結構體(ti),對probe和remove函數指針(zhen)進(jin)行初始化(hua),對driver里面的成員.owner,.name進(jin)行初始化(hua);
第(di)二:在模塊(kuai)的初始化(hua)函數中(zhong)調用platform_drive_registe()初始化(hua)這個驅(qu)動(dong),在卸載模塊(kuai)中(zhong)調用platfrom_driver_unregister()注銷這個驅(qu)動(dong);
第三:將驅動中實用的設備資源信息(xi)通過傳遞進(jin)來的platform_device結構體指針獲取。
第四:平臺設備(bei)添加(jia),一(yi)(yi)種是:用platform_device手動(dong)編碼;另一(yi)(yi)種是在設備(bei)樹中(zhong)添加(jia)一(yi)(yi)個節(jie)點。
匹配(pei)過程:一種是:如果是平臺(tai)設(she)備與(yu)平臺(tai)驅動的匹配(pei)以名字匹配(pei),平臺(tai)總線將(jiang)會遍歷
對方(fang),如果名字(zi)相同,則調(diao)用(yong)平(ping)(ping)臺驅(qu)(qu)動(dong)的(de)probe函數(shu),并且將(jiang)匹配(pei)(pei)上(shang)的(de)平(ping)(ping)臺設(she)(she)備(bei)的(de)結構(gou)體指針傳(chuan)給(gei)設(she)(she)備(bei)函數(shu);另一種是:去匹配(pei)(pei)設(she)(she)備(bei)樹中的(de)設(she)(she)備(bei)節點里面的(de)兼容屬性的(de)值,配(pei)(pei)上(shang)則調(diao)用(yong)平(ping)(ping)臺驅(qu)(qu)動(dong)的(de)probe函數(shu),并且將(jiang)匹配(pei)(pei)上(shang)的(de)平(ping)(ping)臺設(she)(she)備(bei)的(de)結構(gou)體指針傳(chuan)給(gei)設(she)(she)備(bei)函數(shu)。
優勢:
platform機制將本(ben)身的(de)(de)(de)資源(yuan)注冊進(jin)內核(he),由內核(he)統一管理,在驅(qu)動程序中(zhong)使用(yong)這些資源(yuan)時(shi)通過platform_device提供的(de)(de)(de)標準接口進(jin)行申請并(bing)使用(yong)。這樣提高了驅(qu)動和(he)資源(yuan)管理的(de)(de)(de)獨立性(xing),并(bing)且擁有較(jiao)好的(de)(de)(de)可移植性(xing)和(he)安全性(xing)
9.異同點:
驅(qu)(qu)動運行于內(nei)核,應用(yong)程(cheng)序(xu)(xu)再(zai)用(yong)戶(hu)空(kong)間;應用(yong)程(cheng)序(xu)(xu)能(neng)調(diao)用(yong)C庫;應用(yong)程(cheng)序(xu)(xu)順序(xu)(xu)執行,驅(qu)(qu)動被動的接受(shou)調(diao)用(yong);應用(yong)程(cheng)序(xu)(xu)的棧很(hen)(hen)大(da),驅(qu)(qu)動很(hen)(hen)小,通(tong)常4K;應用(yong)程(cheng)序(xu)(xu)可以做浮點運算,驅(qu)(qu)動中很(hen)(hen)少做浮點運算。
10. 原理(li):mmap將(jiang)一個文(wen)(wen)件或者其(qi)它對象映(ying)射進內存。文(wen)(wen)件被(bei)映(ying)射到多(duo)個頁上,如果文(wen)(wen)件的大(da)小不是所有頁的大(da)小之和,最(zui)后一個頁不被(bei)使用的空間將(jiang)會(hui)清零。
作用:讓(rang)用戶程序直接(jie)訪問設備內存,在要求高性(xing)能(neng)的應(ying)用當中比較常(chang)用。應(ying)用程序使用的動態庫映射到這個(ge)(ge)區域(yu);應(ying)用程序調用mmap,將設備物(wu)理地址和這個(ge)(ge)區域(yu)的虛擬(ni)內存進行映射;

