linux裝置驅動程式分為字元裝置驅動(無緩衝且只能順序訪問),塊裝置驅動程式(有緩衝且可以隨機訪問)。每個字元裝置和塊裝置都必須有主,次裝置號,主裝置號相同的裝置是同類裝置(使用同一驅動程式)。這些裝置中,有些裝置是對實際物理硬體的抽象,而有些裝置則是則是核心自身提供的功能(不依賴於特定的物理硬體,又稱為「虛擬裝置」)。每個裝置在/dev目錄下都有乙個對應的檔案(節點),可以通過 cat /proc/devices命令檢視當前已經載入的裝置驅動程式的主裝置號。
在核心中,dev_t型別用來儲存裝置編號(包括主裝置號和次裝置號):
dev_t是無符長整型
分配和釋放裝置號:
字元裝置的註冊:
早期的辦法:
在核心空間和使用者空間之間拷貝資料使用:
scull裝置的布局:
這個結構是乙個二維陣列,qset是第乙個下限,quantum是第二個下限。
下面是我寫的驅動程式,沒有用書上的,數了一下,書上的例子快到兩千行**了,所以自己寫個容易的,裝置是記憶體,first.c
需要注意的地方是,下面的struct file_operations first_fops是用c99標準寫的,是標記化結構體初始化語法。左邊的open,release,read,write都是系統呼叫,也就是說呼叫read是去執行read_test,呼叫write時執行write_test。在使用者空間和核心空間之間傳輸資料應該使用函式copy_to_user和copy_from_user.
#include #include #include #include #include #include #include #include #include #include #include #include #include struct cdev first; unsigned int dev; char * data; static ssize_t read_test(struct file *file, char *buf, size_t count,loff_t*pos); static ssize_t write_test(struct file *file, const char *buf,size_t count,loff_t*pos); static ssize_t open_test(struct inode *inode, struct file *file); static ssize_t release_test(struct inode *inode, struct file *file); struct file_operations first_fops=; static ssize_t read_test(struct file *file, char *buf, size_t count,loff_t*pos) static ssize_t write_test(struct file *file, const char *buf,size_t count,loff_t*pos) static ssize_t open_test(struct inode *inode, struct file *file) static ssize_t release_test(struct inode *inode, struct file *file) static int __init init_first(void) cdev_init(&first,&first_fops); first.owner = this_module; ret = cdev_add(&first,dev,1); if(ret < 0) return 0; } static void __exit exit_first(void) module_init(init_first); module_exit(exit_first);
初始化模組時:
登出模組:
makefile
ifneq ($(kernelrelease),) obj-m:= first.o else kerneldir ?= /lib/modules/$(shell uname -r)/build pwd := $(shell pwd) modules: $(make) -c $(kerneldir) m=$(pwd) modules modules_install: $(make) -c $(kerneldir) m=$(pwd) modules_install clear: rm -rf *.o .phony: modules modules_install clear endif
首先make,進行編譯,生成first.ko檔案。執行:
test.c
#include #include #include #include #include #include int main() write(fd,s1,strlen(s1)); read(fd,s2,strlen(s1)); printf("顯示出字串:/n"); printf("%s/n",s2); close(fd); return 0; }
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...
裝置驅動 字元裝置驅動程式
linux下的應用程式在訪問字元裝置時,一般都是通過裝置檔案訪問的。裝置檔案一般都存放在 dev目錄下。字元裝置檔案的第乙個標誌是c,如下所示 總結 每乙個檔案代表乙個裝置,在時間前面有兩個用逗號隔開的數字,第乙個數字是主裝置號,第二個數字是次裝置號。一般認為乙個主裝置號對應乙個驅動程式,這裡列出的...