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