一、裝置驅動之資料結構:
1、dev_t :裝置編號,包含主裝置號、次裝置號。
dev_t是乙個32位的數,12位表示主裝置號,20為表示次裝置號
(1)主裝置號= major(dev_t dev)
(2)次裝置號= minor(dev_t dev)
(3)裝置編號= mkdev(int major,int minor)
2、file_operations:裝置驅動向核心提供的操作函式指標結構
static const struct file_operations ***_fops = ;
3、file:檔案結構體代表乙個開啟的裝置檔案
struct file ;
4、inode:資訊節點結構,索引節點。管理檔案的屬性(訪問許可權、大小、最後修改時間等)
struct inode ;
void *i_private; //裝置私有資料指標 };
5、cdev:字元裝置標準結構體
struct cdev ;
二、裝置驅動之核心函式
裝置驅動實現流程:
1、分配裝置號//
動態分配裝置號
intalloc_chrdev_region
(dev_t *dev, //裝置號
unsigned int firstminor, //第乙個次裝置號
unsigned int count, //所請求連續裝置編號的個數。
char *name //裝置名稱)
//靜態分配裝置號
int register_chrdev_region
( dev_t first, //預分配的裝置號
unsigned int count,//連續裝置編號的個數
char* name//裝置名稱)
2、裝置體結構分配空間
void *kmalloc(size_t size, int flags);
size:分配記憶體大小
flags:要分配記憶體的型別;值為gfp_kernel:表示不能立刻分配記憶體時,要等待
3、 註冊裝置
//初始化裝置
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
//新增裝置到系統,啟用裝置
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
4、釋放和登出裝置
cdev_del(cdev); //登出cdev,即從系統中刪除此裝置
kfree(devp); //釋放結構裝置體內存
unregister_chrdev_region(dev_t, 1); //釋放裝置號
5、定義裝置檔案操作函式
開啟、讀寫、裝置控制等
6、宣告裝置的初始化函式和銷毀函式
module_init(***_init);
module_exit(***_exit);
三、裝置驅動實現流程探析
1、根據linux規範編寫驅動程式:宣告、實現驅動的初始化函式和退出函式;實現裝置檔案操作函式。
2、載入驅動:insmod ***.so –對應執行模組的初始化函式***_init,初始化驅動,同時把裝置新增到系統,同時啟用裝置。這時可以通過lsmod和cat /proc/devices檢視
3、建立裝置節點,相當於在檔案目錄中新增裝置檔案
通過sudo mknod /dev/testdev c 254 0(裝置檔名、型別為字元裝置、主裝置號為254、次裝置開始序號為0)命令,建立了/dev/testdev裝置節點。
4、命令列操作裝置:
寫資料到裝置:echo hello>/dev/testdev 命令終端通過作業系統呼叫核心驅動的寫函式,把使用者空間的資料寫到核心空間的裝置上。
讀資料到終端:cat /dev/testdev命令終端通過作業系統呼叫核心驅動的讀函式,把裝置上的資料讀到命令列終端。
解除安裝:rmnod:解除安裝裝置,通過作業系統呼叫裝置驅動的解除安裝函式
5、使用者應用程式操作:
a.先開啟裝置檔案,獲取檔案控制代碼:
myfile = open("/dev/testdev",o_rdwr):向作業系統,請求開啟檔案,並傳遞裝置檔案的全路徑,作業系統呼叫驅動的open開啟函式,並傳遞該裝置相關的inode引數和file引數(在裝置載入和建立裝置節點時已產生)。
b.寫檔案:write(myfile,"hello,",sizeof("hellor"));
呼叫檔案系統的標準寫檔案函式,通過作業系統,呼叫核心的裝置驅動的寫函式,並把引數轉換為核心驅動寫函式的標準引數。核心驅動的寫函式,通過呼叫核心的函式,從使用者空間向核心空間寫資料。
c.讀檔案:read(myfile,buffer,size);
通過作業系統,呼叫核心的裝置驅動的讀函式,通過核心的函式,從核心空間向使用者空間的buffer空間寫資料。
d.裝置控制:int ioctl(int fd, ind cmd, …):
通過作業系統呼叫核心裝置驅動的ioctl函式即可。
e. 關閉檔案:close(myfile):作業系統做相應的清理工作,但並不解除安裝裝置驅動。
四、裝置驅動程式編寫實戰
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...