国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > Linux內(nèi)核驅(qū)動(dòng)的platform機(jī)制

Linux內(nèi)核驅(qū)動(dòng)的platform機(jī)制 時(shí)間:2018-07-26      來(lái)源:未知

1.模塊(一種特殊的內(nèi)核代碼寫(xiě)法,一般編譯成ko文件,用于承載用戶(hù)想要?jiǎng)討B(tài)添加進(jìn)內(nèi)核的代碼(不限于驅(qū)動(dòng)))

a.寫(xiě)法

module_init(模塊構(gòu)造函數(shù) );

module_init(模塊析構(gòu)函數(shù) );

b.編譯

標(biāo)準(zhǔn)的Makefile

c.模塊相關(guān)工具

insmod/rmmod/lsmod/modinfo/modprobe/depmod

為了自動(dòng)安裝有依賴(lài)關(guān)系的模塊,兩個(gè)前提: 1.模塊必須都拷貝到/lib/modules/3.14.0; 2.執(zhí)行depmod

2.字符設(shè)備驅(qū)動(dòng)框架

1.認(rèn)知

a. 無(wú)系統(tǒng)編程(裸機(jī)編程.bin,hex)--有系統(tǒng)編程(安全,并發(fā),豐富的驅(qū)動(dòng)。。。elf,exe)

b. OS管理了所有驅(qū)動(dòng),而且各個(gè)操作系統(tǒng)管理結(jié)構(gòu)(數(shù)據(jù)結(jié)構(gòu))不一定一樣

c. 了解數(shù)據(jù)結(jié)構(gòu)的意義

d. 回掉

e. 計(jì)算機(jī)喜歡數(shù)字而不是字符串

2.名詞

設(shè)備文件: 一個(gè)特殊的文件用于抽象設(shè)備操作入口,用與隱藏設(shè)備號(hào)細(xì)節(jié)(域名-IP)

設(shè)備號(hào):設(shè)備驅(qū)動(dòng)的代號(hào),主設(shè)備號(hào) 次設(shè)備號(hào)

驅(qū)動(dòng):讓硬件工作起來(lái)的軟件(裸機(jī)驅(qū)動(dòng) 系統(tǒng)之下的驅(qū)動(dòng))

驅(qū)動(dòng)框架:平臺(tái)(操作系統(tǒng))對(duì)驅(qū)動(dòng)編寫(xiě)的要求

3.涉及的函數(shù)

申請(qǐng)?jiān)O(shè)備號(hào):

強(qiáng)制申請(qǐng)int register_chrdev_region(dev_t first, unsigned int count, char *name)

動(dòng)態(tài)申請(qǐng)int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)//name設(shè)備號(hào)說(shuō)明信息(/proc/devices)

釋放設(shè)備號(hào):

void unregister_chrdev_region(dev_t first, unsigned int count);

初始化cdev:

void cdev_init(struct cdev *, const struct file_operations *);

注冊(cè)cdev:

int cdev_add(struct cdev *, dev_t, unsigned);

移除cdev:

void cdev_del(struct cdev *);

1.長(zhǎng)得像驅(qū)動(dòng)

struct cdev myled{

.dev = 250

.fops{

.open = led_on;

.release = led_off;

}

};

2.放到內(nèi)核中去

寫(xiě)到module.c

3.加入內(nèi)核管理驅(qū)動(dòng)的數(shù)據(jù)結(jié)構(gòu)

cdev_add(&myled, 250, 1);

cdev_del(&myled);

1.內(nèi)核希望你寫(xiě)驅(qū)動(dòng)的時(shí)候采用總線(xiàn)、設(shè)備、驅(qū)動(dòng)分離的方式來(lái)寫(xiě),而為了分離沒(méi)有具體(I2C,SPI,USB...)總線(xiàn)的設(shè)備發(fā)明了一個(gè)虛擬的platform_bus總線(xiàn)

a.platform_device: 注冊(cè)設(shè)備必要的資源(基地址,引腳,中斷號(hào),波特率,ip,精度。。。)信息

b.platform_driver:實(shí)現(xiàn)設(shè)備操作做的算法(不包含具體數(shù)據(jù),必須先匹配再獲取);

1. Linux系統(tǒng)中以模塊方式組織設(shè)備驅(qū)動(dòng)程序,請(qǐng)列舉在一個(gè)模塊程序中必不可少的組成部分。 (可以寫(xiě)個(gè)Hello world模塊的程序)__init __exit

2. 請(qǐng)說(shuō)明一下從零創(chuàng)建一個(gè)linux字符設(shè)備驅(qū)動(dòng)的步驟?

4. 簡(jiǎn)述Linux設(shè)備驅(qū)動(dòng)中使用中斷的步驟。

5. 簡(jiǎn)述信號(hào)量和自旋鎖的異同和使用時(shí)的注意事項(xiàng)。

6. 簡(jiǎn)述命令 mknod /dev/zero c 1 5 的做用和命令各個(gè)部分的含義,并寫(xiě)出創(chuàng)建一個(gè)塊設(shè)備節(jié)點(diǎn)的命令(把c改成b)。

7. 簡(jiǎn)述命令insmod,rmmod,lsmod,depmod,modprobe 的功能。

8. 簡(jiǎn)述platform設(shè)備基本原理, platform設(shè)備最大優(yōu)勢(shì)是什么?

9. 簡(jiǎn)述設(shè)備驅(qū)動(dòng)程序和普通應(yīng)用程序的異同點(diǎn)。

10. 簡(jiǎn)述mmap機(jī)制的作用和使用mmap的好處。

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.

使用alloc_...方法動(dòng)態(tài)注冊(cè)設(shè)備號(hào);

為cdev申請(qǐng)內(nèi)存;

初始化設(shè)備并添加該設(shè)備;

完成file_operations中的相應(yīng)函數(shù)功能;

4. request_irq,申請(qǐng)irq;

free_irq,釋放irq。

5. 信號(hào)量和自旋鎖都是解決互斥問(wèn)題的基本手段,信號(hào)量的實(shí)現(xiàn)依賴(lài)于自旋鎖。使用信號(hào)量機(jī)制時(shí),進(jìn)程若不能獲得信號(hào)量,進(jìn)程不會(huì)如自旋鎖那樣原地打轉(zhuǎn),而是讓進(jìn)程進(jìn)入休眠等待狀態(tài)。當(dāng)使用信號(hào)量的開(kāi)銷(xiāo)時(shí)間T1大于使用自旋鎖的開(kāi)銷(xiāo)T2時(shí),宜使用自旋鎖,若T2大于T1,則宜使用信號(hào)量。由于信號(hào)量所保護(hù)的臨界區(qū)可能包含引起阻塞的代碼,而自旋鎖則絕對(duì)要避免用來(lái)保護(hù)這樣的代碼。信號(hào)量存在于進(jìn)程上下文,而如果被保護(hù)的資源需要在中斷或者軟中斷情況下使用,則只能選擇自旋鎖。

6. mknod,該命令用于創(chuàng)建設(shè)備節(jié)點(diǎn)。/dev/zero 表示設(shè)備節(jié)點(diǎn)創(chuàng)建的目錄和名字,c 代表創(chuàng)建的設(shè)備節(jié)點(diǎn)為字符設(shè)備節(jié)點(diǎn),1 代表主設(shè)備號(hào),5 代表此設(shè)備號(hào)。

創(chuàng)建塊設(shè)備節(jié)點(diǎn)的命令:mknod /dev/blockdev b 253 0

7.insmod:加載驅(qū)動(dòng)模塊到內(nèi)核;

Rmmod:從內(nèi)核刪除驅(qū)動(dòng)模塊;

Lsmod:查看當(dāng)前內(nèi)核包含哪些模塊

8.原理:

第一:定義一個(gè)platform_driver結(jié)構(gòu)體,對(duì)probe和remove函數(shù)指針進(jìn)行初始化,對(duì)driver里面的成員.owner,.name進(jìn)行初始化;

第二:在模塊的初始化函數(shù)中調(diào)用platform_drive_registe()初始化這個(gè)驅(qū)動(dòng),在卸載模塊中調(diào)用platfrom_driver_unregister()注銷(xiāo)這個(gè)驅(qū)動(dòng);

第三:將驅(qū)動(dòng)中實(shí)用的設(shè)備資源信息通過(guò)傳遞進(jìn)來(lái)的platform_device結(jié)構(gòu)體指針獲取。

第四:平臺(tái)設(shè)備添加,一種是:用platform_device手動(dòng)編碼;另一種是在設(shè)備樹(shù)中添加一個(gè)節(jié)點(diǎn)。

匹配過(guò)程:一種是:如果是平臺(tái)設(shè)備與平臺(tái)驅(qū)動(dòng)的匹配以名字匹配,平臺(tái)總線(xiàn)將會(huì)遍歷

對(duì)方,如果名字相同,則調(diào)用平臺(tái)驅(qū)動(dòng)的probe函數(shù),并且將匹配上的平臺(tái)設(shè)備的結(jié)構(gòu)體指針傳給設(shè)備函數(shù);另一種是:去匹配設(shè)備樹(shù)中的設(shè)備節(jié)點(diǎn)里面的兼容屬性的值,配上則調(diào)用平臺(tái)驅(qū)動(dòng)的probe函數(shù),并且將匹配上的平臺(tái)設(shè)備的結(jié)構(gòu)體指針傳給設(shè)備函數(shù)。

優(yōu)勢(shì):

platform機(jī)制將本身的資源注冊(cè)進(jìn)內(nèi)核,由內(nèi)核統(tǒng)一管理,在驅(qū)動(dòng)程序中使用這些資源時(shí)通過(guò)platform_device提供的標(biāo)準(zhǔn)接口進(jìn)行申請(qǐng)并使用。這樣提高了驅(qū)動(dòng)和資源管理的獨(dú)立性,并且擁有較好的可移植性和安全性

9.異同點(diǎn):

驅(qū)動(dòng)運(yùn)行于內(nèi)核,應(yīng)用程序再用戶(hù)空間;應(yīng)用程序能調(diào)用C庫(kù);應(yīng)用程序順序執(zhí)行,驅(qū)動(dòng)被動(dòng)的接受調(diào)用;應(yīng)用程序的棧很大,驅(qū)動(dòng)很小,通常4K;應(yīng)用程序可以做浮點(diǎn)運(yùn)算,驅(qū)動(dòng)中很少做浮點(diǎn)運(yùn)算。

10. 原理:mmap將一個(gè)文件或者其它對(duì)象映射進(jìn)內(nèi)存。文件被映射到多個(gè)頁(yè)上,如果文件的大小不是所有頁(yè)的大小之和,最后一個(gè)頁(yè)不被使用的空間將會(huì)清零。

作用:讓用戶(hù)程序直接訪問(wèn)設(shè)備內(nèi)存,在要求高性能的應(yīng)用當(dāng)中比較常用。應(yīng)用程序使用的動(dòng)態(tài)庫(kù)映射到這個(gè)區(qū)域;應(yīng)用程序調(diào)用mmap,將設(shè)備物理地址和這個(gè)區(qū)域的虛擬內(nèi)存進(jìn)行映射;

上一篇:變量存儲(chǔ)類(lèi)型 動(dòng)態(tài)內(nèi)存分配詳解

下一篇:樹(shù)的基本概念

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專(zhuān)線(xiàn):010-82525158 企業(yè)培訓(xùn)洽談專(zhuān)線(xiàn):010-82525379 院校合作洽談專(zhuān)線(xiàn):010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見(jiàn)科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部