<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > linux 基礎復習(9)設備驅動(dòng)入門(mén)

linux 基礎復習(9)設備驅動(dòng)入門(mén)

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò ) 收藏

Linux 內核中采用可加載的模塊化設計(LKMs,Loadable Kernel Modules),一般情況下編譯的Linux 內核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內核中,其他的代碼可以選擇在內核中,或者編譯為內核的模塊文件。常見(jiàn)的驅動(dòng)程序也是作為內核模塊動(dòng)態(tài)加載的。

本文引用地址:http://dyxdggzs.com/article/201610/305814.htm

模塊相關(guān)命令

lsmod 列出當前系統加載的模塊

rmmod 將當前模塊卸載

insmod、modprobe 用于加載當前模塊。但insmod不會(huì )自動(dòng)解決依存關(guān)系,而modprobe可以根據模塊間的依存關(guān)系以及 /etc/modules.conf 文件中的內容自動(dòng)插入模塊

mknod 創(chuàng )建相關(guān)模塊

Linux 系統的設備文件分為三類(lèi):塊設備文件、字符設備文件和網(wǎng)絡(luò )設備文件。

· 塊設備文件通常指一些需要以塊(如512 字節)的方式寫(xiě)入的設備,如IDE 硬盤(pán)、SCSI硬盤(pán)、光驅等。

· 字符型設備文件通常指可以直接讀寫(xiě),沒(méi)有緩沖區的設備,如并口、虛擬控制臺等。

· 網(wǎng)絡(luò )設備文件通常是指網(wǎng)絡(luò )設備訪(fǎng)問(wèn)的BSD socket接口,如網(wǎng)卡等。

設備號設備號是一個(gè)數字,它是設備的標志。就如前面所述,一個(gè)設備文件(也就是設備節點(diǎn))可以通過(guò)mknod命令來(lái)創(chuàng )建,其中指定了主設備號和次設備號。主設備號表明某一類(lèi)設備,

一般對應著(zhù)確定的驅動(dòng)程序;次設備號一般是用于區分標明不同屬性,例如不同的使用方法,不同的位置,不同的操作等,它標志著(zhù)某個(gè)具體的物理設備。高字節為主設備號和底字節為次設備號。例如,在系統中的塊設備IDE 硬盤(pán)的主設備號是3,而多個(gè)IDE 硬盤(pán)及其各個(gè)分區分別賦予次設備號1、2、3……

Linux 設備驅動(dòng)程序包含中斷處理程序和設備服務(wù)子程序兩部分

設備服務(wù)子程序包含了所有與設備操作相關(guān)的處理代碼。它從面向用戶(hù)進(jìn)程的設備文件系統中接受用戶(hù)命令,并對設備控制器執行操作。這樣,設備驅動(dòng)程序屏蔽了設備的特殊性,使用戶(hù)可以像對待文件一樣操作設備。

設備控制器需要獲得系統服務(wù)時(shí)有兩種方式:查詢(xún)和中斷。因為L(cháng)inux 下的設備驅動(dòng)程序是內核的一部分,在設備查詢(xún)期間系統不能運行其他代碼,查詢(xún)方式的工作效率比較低,所以只有少數設備如軟盤(pán)驅動(dòng)程序采取這種方式,大多設備以中斷方式向設備驅動(dòng)程序發(fā)出輸入/輸出請求。

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} onclick=if(!this.resized) {return true;} else {window.open(this.src);} alt= src=http://blogimg.chinaunix.net/blog/upfile2/080413193842.jpg onload=if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} border=0>

Linux 中的設備驅動(dòng)程序有如下特點(diǎn)。

(1)內核代碼:設備驅動(dòng)程序是內核的一部分,如果驅動(dòng)程序出錯,則可能導致系統崩潰。

(2)內核接口:設備驅動(dòng)程序必須為內核或者其子系統提供一個(gè)標準接口。比如,一個(gè)終端驅動(dòng)程序必須為內核提供一個(gè)文件I/O 接口;一個(gè)SCSI設備驅動(dòng)程序應該為SCSI子系統提供一個(gè)SCSI設備接口,同時(shí)SCSI子系統也必須為內核提供文件的I/O 接口及緩沖區。

(3)內核機制和服務(wù):設備驅動(dòng)程序使用一些標準的內核服務(wù),如內存分配等。

(4)可裝載:大多數的Linux 操作系統設備驅動(dòng)程序都可以在需要時(shí)裝載進(jìn)內核,在不需要時(shí)從內核中卸載。

(5)可設置:Linux 操作系統設備驅動(dòng)程序可以集成為內核的一部分,并可以根據需要把其中的某一部分集成到內核中,這只需要在系統編譯時(shí)進(jìn)行相應的設置即可。

(6)動(dòng)態(tài)性:在系統啟動(dòng)且各個(gè)設備驅動(dòng)程序初始化后,驅動(dòng)程序將維護其控制的設備。

如果該設備驅動(dòng)程序控制的設備不存在也不影響系統的運行,那么此時(shí)的設備驅動(dòng)程序只是多占用了一點(diǎn)系統內存罷了。

驅動(dòng)開(kāi)發(fā)時(shí)卻沒(méi)有main 函數,模塊在調用insmod命令時(shí)被加載,此時(shí)的入口點(diǎn)是init_module函數,通常在該函數中完成設備的注冊。同樣,模塊在調rmmod

函數時(shí)被卸載,此時(shí)的入口點(diǎn)是cleanup_module函數,在該函數中完成設備的卸載。在設備完成注冊加載之后,用戶(hù)的應用程序就可以對該設備進(jìn)行一定的操作,如read、write等,而驅動(dòng)程序就是用于實(shí)現這些操作,在用戶(hù)應用程序調用相應入口函數時(shí)執行相關(guān)的操作,init_module入口點(diǎn)函數則不需要完成其他如read、write之類(lèi)功能。

設備驅動(dòng)程序的入口點(diǎn),它是一個(gè)在中定義的struct file結構,這是一個(gè)內核結構,不會(huì )出現在用戶(hù)空間的程序中,它定義了常見(jiàn)文件I/O 函數的入口。

struct file_operations {

loff_t (*llseek) (struct file *, loff_t, int);

ssize_t (*read) (struct file *filp, char *buff, size_t count, loff_t *offp);

ssize_t (*write) (struct file *filp, const char *buff, size_t count, loff_t *offp);

int (*readdir) (struct file *, void *, filldir_t);

unsigned int (*poll) (struct file *, struct poll_table_struct *);

int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned

long);

int (*mmap) (struct file *, struct vm_area_struct *);

int (*open) (struct inode *, struct file *);

int (*flush) (struct file *);

int (*release) (struct inode *, struct file *);

int (*fsync) (struct file *, struct dentry *);

int (*fasync) (int, struct file *, int);

int (*check_media_change) (kdev_t dev);

int (*revalidate) (kdev_t dev);

int (*lock) (struct file *, int, struct file_lock *);

};

每個(gè)設備的驅動(dòng)程序不一定要實(shí)現其中所有的函數操作,若不需要定義實(shí)現時(shí),則只需將其設為NULL即可。


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>