国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號(hào)

深入淺出 Linux字符設(shè)備驅(qū)動(dòng)程序解析 一
2007-04-30   網(wǎng)絡(luò)

Linux下的設(shè)備驅(qū)動(dòng)程序被組織為一組完成不同任務(wù)的函數(shù)的集合,通過這些函數(shù)使得linux的設(shè)備操作猶如文件一般。在應(yīng)用程序看來,硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作,如open()、close()、read()、write() 等。

Linux主要將設(shè)備分為二類:字符設(shè)備和塊設(shè)備。字符設(shè)備是指設(shè)備發(fā)送和接收數(shù)據(jù)以字符的形式進(jìn)行;而塊設(shè)備則以整個(gè)數(shù)據(jù)緩沖區(qū)的形式進(jìn)行。字符設(shè)備的驅(qū)動(dòng)相對(duì)比較簡單。

下面我們來假設(shè)一個(gè)非常簡單的虛擬字符設(shè)備:這個(gè)設(shè)備中只有一個(gè)4個(gè)字節(jié)的全局變量int global_var,而這個(gè)設(shè)備的名字叫做"globalvar"。對(duì)"globalvar"設(shè)備的讀寫等操作即是對(duì)其中全局變量global_var的操作。

驅(qū)動(dòng)程序是內(nèi)核的一部分,因此我們需要給其添加模塊初始化函數(shù),該函數(shù)用來完成對(duì)所控設(shè)備的初始化工作,并調(diào)用register_chrdev() 函數(shù)注冊(cè)字符設(shè)備:

static int __init globalvar_init(void)
{
  if (register_chrdev(MAJOR_NUM, " globalvar ", &gobalvar_fops))

 {

  //…注冊(cè)失敗

 }

 else

 {

  //…注冊(cè)成功

 }
}

其中,register_chrdev函數(shù)中的參數(shù)MAJOR_NUM為主設(shè)備號(hào), "globalvar"為設(shè)備名,globalvar_fops為包含基本函數(shù)入口點(diǎn)的結(jié)構(gòu)體,類型為file_operations。當(dāng)globalvar模塊被加載時(shí),globalvar_init被執(zhí)行,它將調(diào)用內(nèi)核函數(shù)register_chrdev,把驅(qū)動(dòng)程序的基本入口點(diǎn)指針存放在內(nèi)核的字符設(shè)備地址表中,在用戶進(jìn)程對(duì)該設(shè)備執(zhí)行系統(tǒng)調(diào)用時(shí)提供入口地址。

與模塊初始化函數(shù)對(duì)應(yīng)的就是模塊卸載函數(shù),需要調(diào)用register_chrdev()的"反函數(shù)"

unregister_chrdev():

static void __exit globalvar_exit(void)

{

 if (unregister_chrdev(MAJOR_NUM, " globalvar "))

 {

  //…卸載失敗

 }

 else

 {

  //…卸載成功

 }

}

隨著內(nèi)核不斷增加新的功能,file_operations結(jié)構(gòu)體已逐漸變得越來越大,但是大多數(shù)的驅(qū)動(dòng)程序只是利用了其中的一部分。對(duì)于字符設(shè)備來說,要提供的主要入口有:open()、release()、read()、write()、ioctl()、llseek()、poll()等。

open()函數(shù) 對(duì)設(shè)備特殊文件進(jìn)行open()系統(tǒng)調(diào)用時(shí),將調(diào)用驅(qū)動(dòng)程序的open() 函數(shù):

int (*open)(struct inode * ,struct file *);

其中參數(shù)inode為設(shè)備特殊文件的inode (索引結(jié)點(diǎn)) 結(jié)構(gòu)的指針,參數(shù)file是指向這一設(shè)備的文件結(jié)構(gòu)的指針。open()的主要任務(wù)是確定硬件處在就緒狀態(tài)、驗(yàn)證次設(shè)備號(hào)的合法性(次設(shè)備號(hào)可以用 MINOR(inode-> i - rdev) 取得)、控制使用設(shè)備的進(jìn)程數(shù)、根據(jù)執(zhí)行情況返回狀態(tài)碼(0表示成功,負(fù)數(shù)表示存在錯(cuò)誤)等;

release()函數(shù) 當(dāng)最后一個(gè)打開設(shè)備的用戶進(jìn)程執(zhí)行close ()系統(tǒng)調(diào)用時(shí),內(nèi)核將調(diào)用驅(qū)動(dòng)程序的release() 函數(shù):

void (*release) (struct inode * ,struct file *) ;

release 函數(shù)的主要任務(wù)是清理未結(jié)束的輸入/輸出操作、釋放資源、用戶自定義排他標(biāo)志的復(fù)位等。

read()函數(shù) 當(dāng)對(duì)設(shè)備特殊文件進(jìn)行read() 系統(tǒng)調(diào)用時(shí),將調(diào)用驅(qū)動(dòng)程序read()函數(shù):

ssize_t (*read) (struct file *, char *, size_t, loff_t *);

用來從設(shè)備中讀取數(shù)據(jù)。當(dāng)該函數(shù)指針被賦為NULL 值時(shí),將導(dǎo)致read 系統(tǒng)調(diào)用出錯(cuò)并返回-EINVAL("Invalid argument,非法參數(shù)")。函數(shù)返回非負(fù)值表示成功讀取的字節(jié)數(shù)(返回值為"signed size"數(shù)據(jù)類型,通常就是目標(biāo)平臺(tái)上的固有整數(shù)類型)。

globalvar_read函數(shù)中內(nèi)核空間與用戶空間的內(nèi)存交互需要借助第2節(jié)所介紹的函數(shù):

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)

{

 …

 copy_to_user(buf, &global_var, sizeof(int));

 …

}

write( ) 函數(shù) 當(dāng)設(shè)備特殊文件進(jìn)行write () 系統(tǒng)調(diào)用時(shí),將調(diào)用驅(qū)動(dòng)程序的write () 函數(shù):

ssize_t (*write) (struct file *, const char *, size_t, loff_t *);

向設(shè)備發(fā)送數(shù)據(jù)。如果沒有這個(gè)函數(shù),write 系統(tǒng)調(diào)用會(huì)向調(diào)用程序返回一個(gè)-EINVAL。如果返回值非負(fù),則表示成功寫入的字節(jié)數(shù)。

globalvar_write函數(shù)中內(nèi)核空間與用戶空間的內(nèi)存交互需要借助第2節(jié)所介紹的函數(shù):

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)

{

…

copy_from_user(&global_var, buf, sizeof(int));

…

}

ioctl() 函數(shù) 該函數(shù)是特殊的控制函數(shù),可以通過它向設(shè)備傳遞控制信息或從設(shè)備取得狀態(tài)信息,函數(shù)原型為:

int (*ioctl) (struct inode * ,struct file * ,unsigned int ,unsigned long);

unsigned int參數(shù)為設(shè)備驅(qū)動(dòng)程序要執(zhí)行的命令的代碼,由用戶自定義,unsigned long參數(shù)為相應(yīng)的命令提供參數(shù),類型可以是整型、指針等。如果設(shè)備不提供ioctl 入口點(diǎn),則對(duì)于任何內(nèi)核未預(yù)先定義的請(qǐng)求,ioctl 系統(tǒng)調(diào)用將返回錯(cuò)誤(-ENOTTY,"No such ioctl fordevice,該設(shè)備無此ioctl 命令")。如果該設(shè)備方法返回一個(gè)非負(fù)值,那么該值會(huì)被返回給調(diào)用程序以表示調(diào)用成功。

熱詞搜索:

上一篇:暴強(qiáng)的40個(gè)Win XP和Vista技巧
下一篇:深入淺出 Linux字符設(shè)備驅(qū)動(dòng)程序解析

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
亚洲精品一二三| 99视频在线观看一区三区| 一色屋精品视频在线看| 欧美老女人xx| 亚洲第一免费播放区| 国产精品第三页| 欧美日本久久| 欧美激情网站在线观看| 裸体歌舞表演一区二区| 久久久久se| 久久综合色天天久久综合图片| 亚洲视频欧美视频| 日韩一区二区精品视频| 亚洲日韩欧美一区二区在线| 亚洲国产精品久久久久秋霞影院| 黑人巨大精品欧美一区二区| 国产亚洲一本大道中文在线| 国产一区二区三区四区hd| 国产亚洲va综合人人澡精品| 国产日韩精品一区二区| 国产亚洲精久久久久久| 激情一区二区三区| 亚洲国产欧美一区二区三区同亚洲 | 在线视频中文亚洲| 99视频精品在线| 亚洲视频一二| 亚洲欧美制服另类日韩| 欧美一区二粉嫩精品国产一线天| 欧美在线一二三区| 久久综合综合久久综合| 欧美超级免费视 在线| 欧美xx69| 国产精品v一区二区三区| 国产日韩精品入口| 亚洲国产精品va在线观看黑人| 亚洲精选在线| 午夜精品久久久久久久久久久久 | 久久综合九色99| 午夜精品久久久久影视| 久久精品国产一区二区电影| 久久视频在线看| 久久婷婷国产综合精品青草 | 欧美精品在线视频| 国产综合视频在线观看| 亚洲激情在线视频| 午夜欧美理论片| 欧美不卡激情三级在线观看| 欧美在线观看视频一区二区三区| 欧美网站大全在线观看| 一区二区三区自拍| 99国产精品久久| 另类av导航| 日韩一级片网址| 欧美激情综合| 欧美性色aⅴ视频一区日韩精品| 国产精品一区在线观看| 亚洲高清123| 亚洲欧美国产精品va在线观看| 久久视频在线看| 国产精品裸体一区二区三区| 伊人成人在线| 欧美一级播放| 欧美日韩蜜桃| …久久精品99久久香蕉国产| 亚洲欧美日韩另类精品一区二区三区 | 亚洲欧美日韩爽爽影院| 欧美成人福利视频| 国产亚洲欧美日韩日本| 欧美三级乱码| 91久久综合| 亚洲少妇一区| 欧美高清在线一区二区| 国产一区二区三区在线观看精品| 99视频精品在线| 欧美国产精品v| 在线观看视频一区| 久久av资源网站| 欧美成年人网| 欧美激情按摩在线| 亚洲大胆在线| 久久久青草婷婷精品综合日韩| 国产精品视频福利| 亚洲一区bb| 国内精品久久久久影院色| 国产精品入口尤物| 夜夜嗨av一区二区三区免费区| 亚洲破处大片| 欧美+亚洲+精品+三区| 在线观看一区| 男女av一区三区二区色多| 精品成人一区二区| 久久夜色精品国产亚洲aⅴ | 国产精品欧美风情| 一区二区三区www| 欧美精品激情blacked18| 日韩视频在线观看| 午夜激情一区| 亚洲一区二区三区精品在线| 欧美成人在线免费观看| 欧美日韩高清在线播放| 激情欧美日韩| 久久亚洲精品一区| 亚洲高清在线视频| 免费亚洲视频| 亚洲人成在线播放| 欧美国产一区二区在线观看| 亚洲另类一区二区| 欧美久久婷婷综合色| 夜夜嗨av一区二区三区网站四季av| 欧美激情中文字幕一区二区| 99视频+国产日韩欧美| 欧美午夜电影在线观看| 西瓜成人精品人成网站| 韩国av一区| 欧美激情精品| 亚洲免费中文字幕| 国语自产精品视频在线看8查询8| 久久亚洲精品伦理| 亚洲精品1234| 欧美日韩中文字幕精品| 亚洲淫性视频| 亚洲丶国产丶欧美一区二区三区| 欧美精品成人一区二区在线观看 | 欧美一级在线播放| 国精品一区二区三区| 你懂的视频一区二区| 亚洲性av在线| 永久免费精品影视网站| 欧美日韩色婷婷| 久久国产精品久久久久久电车| 欧美无砖砖区免费| 国产亚洲欧美另类中文| 免费成人在线观看视频| 狠狠色丁香久久婷婷综合丁香| 中文在线资源观看网站视频免费不卡 | 欧美日韩伦理在线| 欧美日本精品一区二区三区| 国产乱码精品一区二区三区忘忧草| 亚洲一区二区精品| 国产美女精品视频免费观看| 久久理论片午夜琪琪电影网| 国产一区二区黄| 欧美日韩国产一级片| 久久成人综合视频| 亚洲欧洲一区二区在线播放| 国产性猛交xxxx免费看久久| 久久噜噜亚洲综合| 亚洲五月婷婷| 国产一区二区欧美| 欧美日韩喷水| 欧美一区亚洲| 制服丝袜激情欧洲亚洲| 欧美日韩一区二区三区视频| 久久精品一二三| 亚洲永久在线| 在线精品亚洲| 国产一区成人| 欧美日韩精品中文字幕| 免费视频久久| 欧美一区二区三区精品电影| 一区二区三区www| 国内精品嫩模av私拍在线观看| 国产精品成人观看视频国产奇米| 午夜欧美不卡精品aaaaa| 一区二区精品在线| 亚洲美女区一区| 极品av少妇一区二区| 国产日韩亚洲欧美精品| 欧美日本一区| 欧美日韩成人网| 久久久精彩视频| 欧美综合二区| 亚洲午夜视频| 亚洲精品欧美日韩| 日韩亚洲欧美成人一区| ●精品国产综合乱码久久久久| 一区二区在线观看av| 国产精品视频一| 久久综合九色九九| 欧美在线一级va免费观看| 99视频一区二区三区| 亚洲国产成人久久综合一区| 国精品一区二区三区| 国产女主播一区二区三区| 欧美视频免费在线观看| 国产精品麻豆va在线播放| 欧美日韩国产另类不卡| 欧美激情一区二区三区不卡| 久久久水蜜桃av免费网站| 新片速递亚洲合集欧美合集| 亚洲午夜极品| 亚洲无亚洲人成网站77777| 亚洲精品一区在线| 中文久久乱码一区二区| 亚洲美女福利视频网站| 亚洲一区二区成人| 亚洲视频www| 欧美在线一区二区三区| 在线看片一区| 亚洲精品男同|