校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Linux內核設備驅動之高級字符設備驅動筆記整理

Linux內核設備驅動之高級字符設備驅動筆記整理

熱門標簽:申請400電話價格多少 涪陵商都400電話開通辦理 外呼系統的經營范圍 安陽ai電銷機器人軟件 智能電話機器人坐席 外呼系統不彈窗 云會外呼系統 柳州市機器人外呼系統報價 廈門營銷外呼系統平臺
/******************
 * 高級字符設備驅動
 ******************/

(1)ioctl

除了讀取和寫入設備外,大部分驅動程序還需要另外一種能力,即通過設備驅動程序執行各種類型的硬件控制。比如彈出介質,改變波特率等等。這些操作通過ioctl方法支持,該方法實現了同名的系統調用。

在用戶空間,ioctl系統調用的原型是:

  • int ioctl(int fd, unsigned long cmd, ...);
  • fd: 打開的設備文件描述符
  • cmd: 命令
  • 第三個參數:根據不同的命令,可以是整數或指針,也可以沒有。
  • 采用"..."的方式只是用于避免編譯器報錯。

驅動程序的ioctl方法原型和用戶空間的版本有一些不同:

int (*ioctl) (struct inode *inode,    
      struct file *filp, 
      unsigned int cmd,
      unsigned long arg);
inode/filp: 對應用戶空間的fd
cmd: 對應用戶空間傳來的cmd
arg: 對應傳來的cmd參數

大多數ioctl的實現中都包括一個switch語句,用于根據cmd參數選擇對應的操作。用戶空間和內核空間的命令號要一致。

(2)選擇ioctl的命令號

在編寫ioctl的代碼之前,要選擇對應不同命令的編號。不能簡單地從0或1開始選擇編號,因為linux要求這個命令號應該在系統范圍內唯一。linux內核采用約定方法為驅動程序選擇ioctl號,可以參考include/asm/ioctl.h和Documentation/ioctl-number.txt。

一個ioctl號為32位,linux將其分成4個部分,構建一個ioctl號碼所需要的宏都定義在<linux/ioctl.h>:

  • type 8位幻數。其實就是為你的驅動選定一個號碼。參考ioctl-number.txt
  • number 8位序數。
  • direction 2位。定義了數據的傳輸方向。如_IOC_NONE(沒有數據傳輸),_IOC_READ|_IOC_WRITE(雙向數據傳輸)。注意這個方向是對用戶而言的,所以IOC_READ意味著從設備讀取數據,驅動應該向用戶空間寫入數據。
  • size 14位。所涉及的用戶數據大小。

可以采用<linux/ioctl.h>中的宏構建一個ioctl號

  • _IO(type, nr)
  • _IOR(type,nr,datatype)
  • _IOW(type,nr,datatype)

返回值

對于系統調用來說,正的返回值是首保護的,而負值被認為是一個錯誤,并被用來設置用戶空間的error變量。如果在調用ioctl方法時傳入了沒有定義的ioctl號,則系統返回的錯誤值為-ENVAL和-ENOTTY

(3)阻塞和非阻塞型操作

對于read和write等操作,默認的操作是阻塞型的,其特性是:

*如果一個進程調用了read但還沒有數據可讀,則此進程必須阻塞。數據到達時進程被喚醒,并把數據返回給調用者,即使數據數目少于count參數指定的數據也會返回。

*如果一個進程調用了write但緩沖區沒有空間,則此進程必須阻塞,而且必須休眠在與讀進程不同的等待隊列上。當向硬件設備寫入一些數據,從而騰出了部分輸出緩沖區后,進程即被喚醒,write調用成功。

有時我們希望改變這一特性,將其改為非阻塞型的,這樣,無論設備是否有數據可讀寫,read/write方法都馬上返回。

如果希望設定某個文件是非阻塞的,則應設定filp->f_flags的O_NONBLOCK標志。處理非阻塞型文件時,應用程序調用stdio函數必須非常小心,因為很容易把一個非阻塞型的返回誤認為是EOF,所以必須始終檢查errno。

(4)異步通知

a.異步通知的作用

大多數時候阻塞型和非阻塞型操作的組合以及select方法可以有效查詢設備,但有時候用這種技術效率就不高了。在面對某些隨機或很少出現的情況時(如通過鍵盤輸入CTRL+C),則需要采用異步通知(asynchronous notification)。

b.用戶空間程序如何啟動異步通知

為了啟動文件的異步通知機制,用戶程序必須執行兩個步驟:

  • 01.指定一個進程作為設備文件的 "屬主(owner)"。當進程使用fcntl系統調用執行F_SETOWN命令時,屬主進程的進程ID號就被保存在 filp->f_owner中。這一步是必需的,目的是讓內核知道該通知誰。
  • 02.為了真正啟動異步通知機制,用戶程序還必須在設備中設置FASYNC標志,這是通過fchtl命令F_SETFL完成的。執行完這兩步后,設備文件就可以在新數據到達時請求發送一個SIGIO信號。該信號被送到存放在file->f_owner中的進程(如果是負值就是進程組)。不是所有的設備都支持異步通知,應用程序通常假設只有套接字和終端才有異步通知能力.

(5)驅動程序中如何實現異步通知

a.用戶空間操作在內核的對應

  • 01.當設定F_SETOWN時,對file->f_owner賦值
  • 02.執行F_SETFL以啟動FASYNC時,調用驅動程序的fasync方法。只要filp->f_flags中的FASYNC標志(文件打開時,默認為清除)發生了變化,就會調用該方法。
  • 03.當數據到達時,由內核發送一個SIGIO信號給所有注冊為異步通知的進程

b.在設備結構體中加入fasync_struct的指針

該結構在<linux/fs.h>中定義:

struct fasync_struct {
int magic;
int fa_fd;
struct fasync_struct *fa_next;
struct file *fa_file;
};

c.驅動要調用的兩個函數

這兩個函數在<linux/fs.h>中聲明。

定義在/fs/fcntl.c中。

原型如下:

  • 01. int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);
  • 02. void kill_fasync(struct fasync_struct **fa, int sig, int band);

當一個打開文件的FASYNC標志被修改,調用fasync_helper以便從相關的進程列表中增加或刪除文件,而kill_fasync在數據到達時通知所有相關進程。

d.例子

01.在設備類型中定義fasync_struct動態數據結構

struct my_pipe {
  struct fasync_struct *async_queue; /* 異步讀取結構 */
......
};

02.驅動中的fasync函數調用fasync_helper

int my_fasync(fasync_file fd, struct file *filp, int mode)
{
  my_pipe *dev = filp->private_data;
  return fasync_helper(fd, filp, mode, &dev->async_queue);
}

03.符合異步通知條件時調用kill_fasync

異步通知的是一個讀進程,所以要用write發送kill_fasync。

調用kill_fasync向所有注冊在設備上的異步隊列async_queue中的進程發送信號SIGIO。

ssize_t my_write(struct file *filp, const char *buf, size_t count,
        loff_t *f_pos)
{
......
if (dev->async_queue)
    kill_fasync(&dev->async_queue, SIGIO, POLL_IN); 
    ......
}

04.關閉文件時必須調用fasync方法

當關閉文件時必須調用fasync方法,以便從活動的異步讀進程列表中刪除該文件。

在release中調用:scull_p_fasync(-1, filp, 0);

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽:蕪湖 撫順 孝感 巴中 綏化 晉城 南充 福州

巨人網絡通訊聲明:本文標題《Linux內核設備驅動之高級字符設備驅動筆記整理》,本文關鍵詞  Linux,內核,設備驅動,之,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux內核設備驅動之高級字符設備驅動筆記整理》相關的同類信息!
  • 本頁收集關于Linux內核設備驅動之高級字符設備驅動筆記整理的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    成人在线一区二区三区| 91小视频在线| 色综合天天做天天爱| 国产日产欧美一区二区视频| 国产激情91久久精品导航| 久久婷婷色综合| av在线播放不卡| 亚洲高清久久久| 日韩精品一区二区三区视频播放 | 3751色影院一区二区三区| 五月婷婷综合网| 国产欧美视频在线观看| 99国产精品99久久久久久| 天堂va蜜桃一区二区三区漫画版 | 精品日韩在线观看| 99re亚洲国产精品| 久久国产精品99久久人人澡| 成人欧美一区二区三区视频网页 | 色婷婷亚洲婷婷| 免费在线观看日韩欧美| 国产欧美精品一区二区色综合 | 日韩精品亚洲一区二区三区免费| 精品少妇一区二区三区| 色国产综合视频| 国产jizzjizz一区二区| 香蕉影视欧美成人| 国产精品不卡在线| 欧美成人a在线| 欧美亚洲愉拍一区二区| 成人网男人的天堂| 久久福利视频一区二区| 亚洲成人黄色小说| 亚洲美女视频一区| 国产日产欧美一区| 精品av综合导航| 欧美日韩视频在线一区二区| 91丨porny丨在线| 不卡大黄网站免费看| 国产精品亚洲一区二区三区在线| 亚洲一区欧美一区| 一区二区三区四区在线| 欧美国产禁国产网站cc| 亚洲精品一区二区三区精华液| 欧美欧美欧美欧美首页| 91精品办公室少妇高潮对白| av电影天堂一区二区在线| 国产露脸91国语对白| 国产精品1024| 国产一区二区三区免费播放| 国产在线看一区| 国产伦精品一区二区三区在线观看 | 国产精品自拍一区| 精品一区二区久久| 国产乱码精品一区二区三区忘忧草 | 欧美性生活久久| 色综合中文字幕国产| 国产成a人亚洲精品| 国产成人啪免费观看软件| 国产一区二区精品在线观看| 国内久久精品视频| 国产盗摄一区二区| 成人午夜大片免费观看| 99精品久久久久久| 欧美影院一区二区三区| 欧美日韩dvd在线观看| 91麻豆精品国产91久久久使用方法 | 欧美精品久久天天躁| 91精品视频网| 久久免费看少妇高潮| 中文字幕免费不卡| 亚洲蜜桃精久久久久久久| 亚洲自拍另类综合| 麻豆精品久久精品色综合| 国产精品69毛片高清亚洲| 不卡的av电影在线观看| 欧美乱熟臀69xxxxxx| 欧美一级黄色录像| 国产精品国产成人国产三级 | 色就色 综合激情| 欧美日韩成人在线| 亚洲国产精品黑人久久久| 一区二区欧美国产| 久久99精品国产91久久来源| 成人av电影免费在线播放| 欧美人牲a欧美精品| 国产目拍亚洲精品99久久精品| 亚洲美女一区二区三区| 久久99精品国产麻豆婷婷 | 色伊人久久综合中文字幕| 欧美肥妇free| 中文字幕日韩欧美一区二区三区| 天堂久久一区二区三区| 成人午夜电影久久影院| 欧美一级欧美三级在线观看| 国产精品色婷婷| 久久激情五月婷婷| 欧美亚州韩日在线看免费版国语版| 91精品国产91久久久久久一区二区| 国产校园另类小说区| 日韩专区在线视频| 91免费版pro下载短视频| 日韩欧美国产成人一区二区| 亚洲欧美日韩成人高清在线一区| 六月丁香婷婷久久| 欧美亚洲一区二区在线观看| 国产女人水真多18毛片18精品视频| 婷婷丁香久久五月婷婷| 成人国产精品免费网站| 精品国产成人在线影院| 亚洲大片精品永久免费| 99久久免费国产| 久久影院视频免费| 日本 国产 欧美色综合| 欧洲日韩一区二区三区| 中文字幕日韩精品一区| 国产高清不卡一区| 欧美丝袜丝nylons| 国产精品毛片高清在线完整版 | va亚洲va日韩不卡在线观看| 精品国精品自拍自在线| 日韩精彩视频在线观看| 欧洲精品中文字幕| 亚洲女性喷水在线观看一区| 粉嫩av亚洲一区二区图片| 久久―日本道色综合久久| 日韩精品一级二级| 91精品欧美综合在线观看最新| 亚洲不卡一区二区三区| 色网综合在线观看| 一区二区三区精品视频| 91蝌蚪国产九色| 亚洲日本乱码在线观看| 99精品一区二区三区| 国产精品久久久久久亚洲毛片 | 亚洲福利一二三区| 在线看国产日韩| 亚洲国产欧美在线| 欧美男女性生活在线直播观看| 一区二区三区国产精品| 欧美午夜精品免费| 天天综合色天天| 日韩手机在线导航| 国产精品一区二区在线观看不卡 | 免费在线观看一区二区三区| 日韩欧美一区电影| 经典一区二区三区| 久久久国产精华| 成人自拍视频在线观看| 亚洲综合色区另类av| 欧美色手机在线观看| 日韩有码一区二区三区| 国产网站一区二区三区| 99精品国产99久久久久久白柏| 亚洲国产综合91精品麻豆| 欧美精品一卡二卡| 国产一区二区主播在线| 亚洲欧美日韩在线不卡| 67194成人在线观看| 国产69精品一区二区亚洲孕妇| 亚洲人亚洲人成电影网站色| 欧美精品色综合| 精品亚洲免费视频| 亚洲欧美日韩一区| 欧美二区三区的天堂| 国产乱子伦一区二区三区国色天香| 综合欧美亚洲日本| 欧美一区二区日韩一区二区| 精品一区二区三区在线观看国产| 中文无字幕一区二区三区| 欧美日韩视频不卡| 国产.精品.日韩.另类.中文.在线.播放| 国产精品久久综合| 日韩欧美国产不卡| 欧美系列亚洲系列| 成人午夜激情片| 日韩精品福利网| 国产精品超碰97尤物18| 欧美电视剧在线看免费| 在线视频一区二区免费| 美国十次综合导航| 亚洲国产成人91porn| 国产精品久久久一本精品| 日韩视频一区二区三区在线播放| 日本韩国精品在线| 不卡的电视剧免费网站有什么| 久久99精品久久久久久动态图| 午夜久久久久久久久久一区二区| 亚洲欧美中日韩| 国产色一区二区| 久久久蜜臀国产一区二区| 欧美成人女星排名| 91麻豆精品国产无毒不卡在线观看| 色婷婷综合久色| 91免费看片在线观看| 成人动漫中文字幕| 国产河南妇女毛片精品久久久| 久久机这里只有精品| 韩国v欧美v亚洲v日本v| 日本大胆欧美人术艺术动态 | 亚洲尤物视频在线|