国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Linux > 正文

高手進(jìn)階:Linux系統(tǒng)下驅(qū)動(dòng)程序框架概述

2024-07-26 00:38:00
字體:
供稿:網(wǎng)友
 

一、linux的設(shè)備驅(qū)動(dòng)程序與外界的接口可以分為三個(gè)部分:

1.驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核的接口。通過file_Operations(include/linux/fs.h)數(shù)據(jù)結(jié)構(gòu)來完成的。

2.驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口。這部分利用驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行初始化。

3.驅(qū)動(dòng)程序與設(shè)備的接口。這部分描述了驅(qū)動(dòng)程序如何與設(shè)備進(jìn)行交互,與具體的設(shè)備密切相關(guān)。

二、根據(jù)功能劃分,設(shè)備驅(qū)動(dòng)程序的代碼有以下幾部分:

1.驅(qū)動(dòng)程序的注冊(cè)和注銷。

2.設(shè)備的打開和釋放。

3.設(shè)備的讀寫操作。

4.設(shè)備的控制操作。

5.設(shè)備的中斷和輪詢處理。

三、驅(qū)動(dòng)程序的注冊(cè)和注銷:

設(shè)備驅(qū)動(dòng)程序可以在系統(tǒng)啟動(dòng)的時(shí)候初始化,也可以在需要的時(shí)候動(dòng)態(tài)加載。字符設(shè)備的初始化由chr_dev_init()完成,包括對(duì)內(nèi)存(devfs_register_chrdev(MEM_MAJOR,"mem",&memory_fops)),終端(tty_init()),打印機(jī)(lp_init()),鼠標(biāo)(misc_init())等字符設(shè)備的初始化。

塊設(shè)備初始化由blk_dev_init()完成,這包括對(duì)IDE硬盤(ide_init()),軟盤(floppy_init()),光驅(qū)等塊設(shè)備的初始化。

每個(gè)字符設(shè)備或是塊設(shè)備的初始化都是通過devfs_register_chrdev()或是devfs_register_blkdev()向內(nèi)核注冊(cè)。在關(guān)閉字符設(shè)備或是塊設(shè)備時(shí),還需要通過devfs_unregister_chrdev()或是devfs_unregister_blkdev()從內(nèi)核中注銷設(shè)備。

四、設(shè)備的打開和釋放:

打開設(shè)備是由open()來完成的。例如,打印機(jī)是用lp_open()打開的,而硬盤是用hd_open()打開的。在大部分設(shè)備驅(qū)動(dòng)程序中,open完成如下工作:

1.增加設(shè)備的是用計(jì)數(shù)。

2.檢查設(shè)備的相關(guān)錯(cuò)誤,如設(shè)備尚未準(zhǔn)備好或是類似硬件的問題。

3.檢查是首次打開,則初始化設(shè)備。

4.識(shí)別次設(shè)備號(hào),如有必要?jiǎng)t更新f_op指針。

5.如果需要,分配且設(shè)置要放在filp->PRivate_data里的數(shù)據(jù)結(jié)構(gòu)。

釋放設(shè)備由release()來完成,例如釋放打印機(jī)是用lp_release(),而釋放終端設(shè)備是用tty_release()。釋放設(shè)備的一般步驟包括:

1.釋放在filp->private_data中的open分配的內(nèi)存。

2.如果是最后一次釋放,則關(guān)閉設(shè)備。

3.遞減設(shè)別的使用計(jì)數(shù)。

五、設(shè)備的讀寫操作:

字符設(shè)備使用各自的read()和write()來進(jìn)行數(shù)據(jù)讀寫。例如,對(duì)虛擬終端的讀寫是通過vcs_read()和vcs_write()來進(jìn)行數(shù)據(jù)讀寫的。

塊設(shè)備使用通用的generic_file_read()和generic_file_write()來進(jìn)行數(shù)據(jù)讀寫。這兩個(gè)通用函數(shù)向請(qǐng)求表添加讀寫請(qǐng)求,內(nèi)核可以通過ll_rw_block()優(yōu)化請(qǐng)求順序。由于是對(duì)內(nèi)存緩沖區(qū)而不是設(shè)備進(jìn)行操作的,因而可以加快讀寫請(qǐng)求。如果內(nèi)存緩沖區(qū)內(nèi)沒有要讀入的數(shù)據(jù)或是要將寫請(qǐng)求寫入設(shè)備,那么就要真正的執(zhí)行數(shù)據(jù)傳輸。這是通過數(shù)據(jù)結(jié)構(gòu)request_queue和request_fn()來完成(include/linux/blkdev.h)。

六、設(shè)備的控制操作:

除了讀寫操作,有時(shí)還要控制設(shè)備。這可以通過設(shè)備驅(qū)動(dòng)程序中的ioctl()來完成。例如IDE硬盤的控制可以通過hd_ioctl(),對(duì)光驅(qū)的控制可以通過cdrom_ioctl()。

與讀寫操作不同,ioctl()的用法與具體設(shè)備密切相關(guān)。以軟驅(qū)的floppy_ioctl()為例(drivers/block/floppy.c):

static int fd_ioctl(struct inode *inode,

struct file *filp,

unsigned int cmd,

unsigned long param);

其中,cmd的取值及含義都是與軟驅(qū)有關(guān)的,比如,F(xiàn)DEJECT表示彈出軟盤。

除了ioctl(),設(shè)備驅(qū)動(dòng)程序還可能有其他控制函數(shù),比如llseek()等。

七、設(shè)備的輪詢和中斷處理:

對(duì)于不支持中斷的設(shè)備,讀寫時(shí)需要輪詢?cè)O(shè)備狀態(tài),以及是否需要繼續(xù)進(jìn)行數(shù)據(jù)傳輸。例如,打印機(jī)。如果設(shè)備支持中斷,則可按照中斷方式進(jìn)行。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉环县| 台山市| 嘉定区| 安塞县| 左权县| 五指山市| 新营市| 梁山县| 镇平县| 阳西县| 阿拉善右旗| 和平区| 裕民县| 大新县| 彭州市| 建水县| 巨鹿县| 青田县| 新郑市| 澄迈县| 满城县| 建昌县| 郸城县| 红桥区| 中牟县| 沙湾县| 台东县| 军事| 柯坪县| 渭源县| 洪泽县| 潍坊市| 咸宁市| 宽城| 万盛区| 贡嘎县| 安化县| 五寨县| 犍为县| 连平县| 甘孜县|