字符设备驱动基础篇3——字符设备驱动工作原理
以下內(nèi)容源于朱有鵬嵌入式課程的學(xué)習(xí),如有侵權(quán),請告知刪除。
參考資料:http://www.cnblogs.com/biaohc/p/6575074.html。
1、系統(tǒng)整體工作原理
(1)應(yīng)用層-》API-》設(shè)備驅(qū)動-》硬件;
(2)API:open、read、write、close等操作邏輯(“吃飯”這個宏觀操作);
(3)驅(qū)動源碼中提供真正的open、read、write、close等函數(shù)實(shí)體(右手,用筷子等具體操作);
2、file_operations結(jié)構(gòu)體
結(jié)構(gòu)體成員的解釋,見博文:http://blog.csdn.net/oqqhutu12345678/article/details/78508273
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
(1)該結(jié)構(gòu)體的元素主要是函數(shù)指針,用來掛接實(shí)體函數(shù)地址;
(2)每個設(shè)備驅(qū)動都需要一個該結(jié)構(gòu)體類型的變量;
(3)設(shè)備驅(qū)動向內(nèi)核注冊時,提供該結(jié)構(gòu)體類型的變量。
(4)該結(jié)構(gòu)體的成員函數(shù)是字符設(shè)備驅(qū)動程序設(shè)計的主體內(nèi)容,這些函數(shù)實(shí)際會在應(yīng)用程序進(jìn)行l(wèi)inux的open()、read()等系統(tǒng)調(diào)用時最終被內(nèi)核調(diào)用。
3、注冊字符設(shè)備
- 在沒有框架模型前,這里注冊驅(qū)動、注冊設(shè)備混為一談(設(shè)備號和file_opertion緊結(jié)合,一個驅(qū)動的信息包含兩者)。
(1)為何要注冊驅(qū)動?如果不注冊,內(nèi)核查無此人。
(2)誰去負(fù)責(zé)注冊?驅(qū)動去注冊自己。
(3)向誰注冊?向內(nèi)核注冊。
(4)注冊函數(shù)從哪里來?內(nèi)核提供了注冊函數(shù),驅(qū)動需要調(diào)用此函數(shù)來注冊自己。
(5)注冊前怎樣?注冊后怎樣?注冊產(chǎn)生什么結(jié)果?查有此人,內(nèi)核可以調(diào)用此驅(qū)動去驅(qū)動硬件。
4、register_chrdev函數(shù)詳解(#include <linux/fs.h>)
(1)作用是驅(qū)動向內(nèi)核注冊某設(shè)備的file_operations
- 成功返回值為0,失敗返回負(fù)數(shù)。
(2)參數(shù)
- major,可以自己指定,也可以讓內(nèi)核幫忙分配。表征當(dāng)前設(shè)備的編號,范圍是1~254;猶如身份證號。
- name,表示當(dāng)前設(shè)備驅(qū)動的名字;猶如具體名字。
- fops,file_operations結(jié)構(gòu)體指針。
- cat /proc/devices,可以查看哪些設(shè)備號可用。
(3)inline和static
- inline修飾:因?yàn)榇撕瘮?shù)定義在頭文件里面,如果被兩個文件包含,就會被重復(fù)定義,使用inline后,就只剩函數(shù)體了,而不是函數(shù)定義。本質(zhì)原因是此函數(shù)太短了。
5、內(nèi)核如何管理字符設(shè)備驅(qū)動
(1)內(nèi)核中用一個數(shù)組,來存儲注冊的字符設(shè)備驅(qū)動;
- 數(shù)組的缺陷,因此只有1-254?
(2)register_chrdev函數(shù)將(要注冊的)驅(qū)動的信息(包括設(shè)備號和file_operations)存儲在數(shù)組中相應(yīng)的位置;
(3)使用cat /proc/devices,查看內(nèi)核中已經(jīng)注冊過的字符設(shè)備驅(qū)動和塊設(shè)備驅(qū)動;
- 有些編號默認(rèn)分配給某些設(shè)備。
- 理解主設(shè)備號(major)的概念。
總結(jié)
以上是生活随笔為你收集整理的字符设备驱动基础篇3——字符设备驱动工作原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老卫带你学---keras中文文档
- 下一篇: 位操作实现加减乘除