国产一级一区二区_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久久夜色精品国产_欧美色网一区二区
性欧美18~19sex高清播放| 国产精品午夜在线| 亚洲人体1000| 欧美揉bbbbb揉bbbbb| 亚洲校园激情| 久久久久成人网| 亚洲福利在线观看| 欧美三日本三级少妇三2023| 亚洲欧美电影院| 一本色道久久综合亚洲精品不| 亚洲一区高清| 欧美日韩一区二| 国产日韩欧美精品在线| 亚洲国产精品一区二区尤物区| 久久尤物视频| 久久国产99| 蜜臀av在线播放一区二区三区| 免费看亚洲片| 欧美黄色精品| 欧美午夜美女看片| 亚洲国产精品成人一区二区 | 久久久噜噜噜久久人人看| 亚洲国产毛片完整版| 亚洲电影在线播放| 亚洲免费中文字幕| 欧美成人乱码一区二区三区| 欧美日韩一区二区三区| 国产亚洲亚洲| 亚洲欧美日韩综合| 老司机精品视频网站| 久久精品一区四区| 国产精自产拍久久久久久蜜| 亚洲欧洲一二三| 日韩一级在线| 午夜久久黄色| 国产一区二区黄色| 亚洲日本中文字幕区 | 欧美大片在线影院| 亚洲国产成人在线播放| 玖玖玖免费嫩草在线影院一区| 久久久www| 国产精品视频第一区| 国产精品久久久久91| 欧美裸体一区二区三区| 99精品视频一区二区三区| 国产欧美在线视频| 亚洲第一区在线| 亚洲第一精品久久忘忧草社区| 欧美精品尤物在线| 欧美主播一区二区三区| 一区二区三区精品国产| 国产精品美女午夜av| 久久疯狂做爰流白浆xx| 亚洲一区二区在线视频| 日韩视频中文字幕| 欧美日韩视频在线第一区| 在线中文字幕不卡| 国内外成人免费激情在线视频| 欧美日韩专区在线| 欧美国产免费| 蜜臀久久久99精品久久久久久| 亚洲欧洲在线观看| 欧美黄网免费在线观看| 亚洲在线黄色| 亚洲欧美日韩爽爽影院| 亚洲三级性片| 国产夜色精品一区二区av| 欧美精品18videos性欧美| 性欧美超级视频| 99天天综合性| 亚洲国产天堂久久综合网| 亚洲国产精品传媒在线观看 | 国内精品久久久久久影视8| 另类av一区二区| 亚洲视频在线看| 欧美久久久久免费| 欧美韩国日本综合| 欧美福利网址| 欧美日韩一视频区二区| 欧美成人一区在线| 欧美精品粉嫩高潮一区二区| 另类国产ts人妖高潮视频| 午夜精品久久久久久久99樱桃| 国产日韩高清一区二区三区在线| 欧美激情黄色片| 韩国精品久久久999| 这里只有精品视频| 欧美精品导航| 亚洲大胆美女视频| 久久精品中文字幕免费mv| 欧美大秀在线观看| 一区二区在线观看视频| 午夜亚洲福利| 欧美午夜激情小视频| 久久中文久久字幕| 欧美日韩国产美女| 韩国av一区二区| 99re66热这里只有精品4| 亚洲尤物在线视频观看| 久久这里有精品15一区二区三区| 午夜精品久久久久久久99热浪潮 | 亚洲欧美在线观看| 亚洲桃花岛网站| 久久美女性网| 欧美日韩一卡二卡| 欧美88av| 国产一区二区三区在线观看网站| 伊人久久噜噜噜躁狠狠躁| 亚洲午夜女主播在线直播| 欧美一区二区大片| 欧美日韩成人精品| 在线免费观看一区二区三区| 亚洲一线二线三线久久久| 久久青草久久| 国产日本欧美一区二区| 亚洲视频免费在线| 欧美日韩精品高清| 国产婷婷成人久久av免费高清| 亚洲欧洲精品成人久久奇米网 | 好吊色欧美一区二区三区四区| 日韩视频一区二区在线观看 | 亚洲日本欧美日韩高观看| 午夜在线一区二区| 国产精品嫩草影院一区二区| 99亚洲伊人久久精品影院红桃| 能在线观看的日韩av| 国产精品伦一区| 午夜精品福利一区二区蜜股av| 欧美日韩福利视频| 日韩视频一区二区三区在线播放免费观看| 欧美在线关看| 在线播放不卡| 欧美高清影院| 在线午夜精品| 国产日韩亚洲欧美| 老牛影视一区二区三区| 国产一区二区| 欧美国产日本韩| 亚洲影音先锋| 亚洲成人原创| 国产精品福利在线观看| 久久久久久夜| 亚洲麻豆一区| 国产女主播在线一区二区| 麻豆91精品91久久久的内涵| 亚洲精品免费电影| 国产精品毛片大码女人| 久久视频一区| 亚洲欧美激情视频| 亚洲国产毛片完整版 | 午夜在线一区| 91久久精品日日躁夜夜躁欧美 | 久久er精品视频| 亚洲精品乱码久久久久久久久| 国产精品久久久久毛片软件 | 亚洲少妇诱惑| 91久久在线| 国产一区二区三区黄视频| 欧美日韩情趣电影| 久久国产精品久久久久久久久久| 日韩视频永久免费观看| 国产精品资源在线观看| 欧美日韩亚洲三区| 欧美国产丝袜视频| 欧美国产免费| 久久综合久久88| 欧美一区二区在线| 午夜精品福利在线| 午夜电影亚洲| 欧美在线播放| 久久成人一区二区| 欧美一区二区视频免费观看| 亚洲精品久久久久久久久| 亚洲精品三级| 亚洲一区二区三区影院| 午夜精品国产更新| 午夜精品99久久免费| 亚洲欧美日韩一区二区三区在线| 一区二区三区国产在线| 亚洲国产欧美精品| 亚洲精品专区| 久久中文字幕一区| 国产麻豆午夜三级精品| 99亚洲伊人久久精品影院红桃| 性欧美暴力猛交69hd| 欧美日韩在线亚洲一区蜜芽| 国产一区二区三区日韩欧美| 亚洲视频导航| 欧美日韩美女在线| 亚洲精品在线三区| 蜜臀久久99精品久久久久久9| 国产视频在线观看一区二区| 亚洲欧美综合一区| 国产伦精品一区二区三区| 亚洲视频中文字幕| 亚洲欧美偷拍卡通变态| 欧美激情国产高清| 亚洲精品孕妇| 欧美视频中文在线看| 亚洲一区国产|