字元裝置驅動程式

2021-05-26 21:56:22 字數 3043 閱讀 8054

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.

view plain

copy to clipboard

print?

#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 

return 0;  

}  static

void __exit exit_first(void)  

module_init(init_first);  

module_exit(exit_first);  

初始化模組時:

登出模組:

makefile

view plain

copy to clipboard

print?

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

view plain

copy to clipboard

print?

#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,如下所示 總結 每乙個檔案代表乙個裝置,在時間前面有兩個用逗號隔開的數字,第乙個數字是主裝置號,第二個數字是次裝置號。一般認為乙個主裝置號對應乙個驅動程式,這裡列出的...