?

免費教程_免費網賺教程_破解版軟件-寂涯網絡學習基地

當前位置: 主頁 > 系統綜合 > linux > linux字符設備驅動的程序設計

linux字符設備驅動的程序設計

時間:2012-06-12 21:24來源:未知 整理:寂涯網絡 點擊:

字符設備是linux系統中應用最廣泛的一類設備,它能夠像字節流一樣順序訪問,
通過直接傳輸來自用戶進程的數據而不經過緩存。字符設備驅動的優點在于它不和硬
件相關,因為每臺計算機都有內存。字符設備驅動只是操作某些內存,通過k」11alfoc進
行分配。任何人都可以編譯和運行,而且可以將其移植到Linux支持的所有計算機平
臺上。
  4.1Linux字符設備驅動結構
編寫Linux字符設備去冬程序首先要熟悉三個結構體,即file_operations(文件
操作)、file(文件)、和inode(節點)。
4.1.1 file--operations結構體
file一perations為應用程序提供接口,是系統調用和驅動程序光澈的重要數據結構。
結構體中每一個成員都對應著一個系統調用。/dev目錄下的設備文件和驅動程序的連
接就是通過file_operations結構體建立的。這個結構體的定義在內核源碼的
kemel/linux/fs。h中。fil屯。peration結構中的每個成員都是指向函數的指針,指向驅動
中的函數,這些函數實現一個特別的操作,或者對于不支持的操作留置為NULL。當
指定為NuLL指針時內核確切的行為針對每個函數是不同的。structfil處operations是
一個字符設備把驅動的操作和設備號聯系在一起的接口,是一系列指針的集合,每個
被打開的文件都對應于一系列的操作,這就是file一perations,用來執行一系列的系統
調用。
file_operations結構體中的成員函數是字符設備驅動程序設計的主體內容,這些函
數會在應用程序進行Linux的open、read、write、elose和ioetl等系統調用時最終被調
用。file_operations結構體在2.6版本內核中的定義如下:
 Struetfile_operations{
 stroCtmodule*owner;//擁有該結構的模塊的指針,一般為 THISMODULES
 loff--t(*11Seek)(struetfile*,loff--t,int);//用來修改文件當前的讀
寫位置
  ssiZe_t(*read)(struetfile*,Char_user*,size_t,loff_t*);//
從設備中同步讀取數據
 ssiZe_t(*aio_read)(struetkioeb*,ehar_user*,size_t,loff--t);
//初始化一個異步的讀取操作
 ssizet(*write)(struetfile*,  eonsteharuser*,sizet,lofft);
//向設備發送數據
 ssize_t(*aio_write)(struetkioeb*, eonstehar_user*,size_t,loff_t);
//初始化一個異步的寫入操作;
 int(*readdir)(Structfile*,void*,findir_t);_//僅用于讀取目
錄,對于設備文件,該字段為NULL
  unsignedint(*poll)(struetfile*, Struetpoll_table_struet*);//輪
詢函數,判斷目前是否可以進行非阻塞的讀取或寫入
 int(*ioetl)(struetinode*, struetfile*, unsignedint, unsignedlong);
//執行設備工/O控制命令
 long(*unloeked_ioetl)(struetfile*, unsignedint, unsignedlong);//
不使用BLK文件系統,將使用此函數代替 1octl
long(*eompat_i。 etl)(struetfile*, unsignedint, unsignedlong);//
在64位系統上
 int(*mmap)(struetinode*, struetfile*, Struetvm--area_struet*);//
用于請求將設備內存映射到進程地址空間
 int(*open)(struetinode*, struetfile*);//打開
 int(*flush)(struetfile*);
 int(*release)(struetinode*, Struetfile*);//關閉
 int(*syneh)(struetfile*, Struetdentry*, intdatasyne);//刷新等
待處理數據
 int(*aio_fsyne)(struetkioeb*, intdatasyne);//異步fsyne
int(*fasyne)(int, Struetfile*,int);//通知設備FASYNC標志位發
生變化
 int(*loek)(struetfile*,int, Struetfile_loek*);//用于實現文件鎖
定,鎖定是常規文件不可缺少的特性,但設備驅動程序幾乎從來不會實現這個方法
 ssize_t(*ready)(struCtfile*,  eonststruetiovee*, unsignedlong,loff--t
*);
  Ssize_t(*writev)(Struetfile*,  eonststruetiovee*, unsignedlong,lof幾t
*);//用來實現“分散/聚集”型的讀寫操作。應用程序有時需要進行涉及多個內
存區域的單次讀或寫操作,利用上面這些系統調用可完成這類工作,而不必強加額外
的數據拷貝操作。
 ssiZe_t(*sendfile)(struCtfile*,loff--t*,size_t,read_aetor_t,void
*);
 ssize_t(*sendpage)(struetfile*, struetpage*,int,size_t,loff--t
*,int);
  unsignedlong(*get_unmapped_area)(struetfile*, unsignedlong,unsigned
10ng, unsignedlong, unsignedlong);//進程地址空l間找到一個將底
層設備中的內存段映射的位置
int(*check_flags)(int);//允許模塊檢查傳遞給fcntl調用的標志

本頁地址 http://www.ionrce.tw/linux/20120612950.html

百度搜索更多

谷歌搜索更多

頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
?
評價:
昵稱: 驗證碼:點擊我更換圖片
推薦內容
贊助商
贊助商
?

關于本站免責聲明視頻更新google百度地圖視頻地圖RRS訂閱

如有什么問題請在本站留言,或發郵件到 hxt167#foxmail.com

内蒙古十一选五基本走势图手机版