windows linux 融合,Windows和Linux的设备驱动框架的对比融合研究

摘要:把驱动框架分为三层,针对各层在Windows和Linux中的实现方法的不同,对Windows和Linux的设备驱动框架进行对比研究。从接口函数,应用程序访问驱动程序的路径,驱动程序具体实现及安装展开对比研究。通过对比,提炼出设备驱动框架的通用性,认清平台的特殊性,区分出实现方法的不同,融合出一套新的分层过滤式设备节点式的驱动框架,进而推广到其它操作系统上,以指导驱动程序的编写。

关键字:Windows,Linux,驱动,对比,融合

The contrast and mix of driver framework of Windows and Linux

Li YiJun

Abstract: Divide the driver framework to three layer, Study every layer’s realization’s difference for Windows and Linux. The three layer is interface, the path from application to system, the driver’s realization. Through the contrast, get the generalization, recognize the difference of platform, distinguish the difference of the driver framework, through mix, form a new driver framework with device inode style and delamination filter style, spread to the other operation system, guide the driver developer to program correctly.

Keyword: Windows, Linux, driver, contrast, mix

文献分类号:TP316 文献识别码:A

引言

从系统分为内核空间和用户空间角度看,驱动一般分为三层(见表1)。层1为接口层,供应用程序访问。层2为中间转换层,负责把上层的接口函数对应到驱动程序中的具体设备函数。层3作为具体驱动程序的底层,编写和统一接口层对应相对应的具体函数。从这三层展开对比研究,国内外对驱动框架对比研究很少,融合更少,主要是各系统有自己特色,有较大的差异性,本文给出了两系统的异同之处,并提出了一种融合方案。

表1层1

上层为统一接口层

层2

中间层

层3

具体驱动程序的底层

1.接口函数对比

1.1Windows接口函数的具体解释

接口函数,是供用户操作,应用程序访问的函数,表2为主要的接口函数。Windows主要特色为I/O管理器,I/O系统提供了设备的抽象描述,是Windows的一个子系统。系统调用先到达I/O管理器,再由I/O管理器将系统调用转化为相对应的IRP请求包发给相应的驱动程序,见图1,接口函数和IRP功能码的对应关系见表2。表2中的接口函数满足了设备描述符的建立,读写,关闭的过程。CreatFile负责打开一个设备,ReadFile和WriteFile负责读写设备,DeviceIoControl负责对设备进行一些控制操作。CloseHandle负责关闭设备。

表2windows系统的访问接口函数

接口函数

调用号

IRP功能码

CreatFile

0x25

IRP_MJ_CREATE

ReadFile

0xb7

IRP_MJ_READ

WriteFile

0x112

IRP_MJ_WRITE

DeviceIoControl

0x42

IRP_MJ_DEVICE_CONTROL

CloseHandle

0x19

IRP_MJ_CLOSE

linux系统的访问接口函数

接口函数

调用号

系统调用

open

5

sys_open

read

3

sys_read

write

4

sys_write

close

6

sys_close

ioctl

54

sys_ioctl

1.2Linux接口函数的具体解释

Linux为单内核系统,表2中的Linux接口函数为主要接口函数,接口函数通过系统调用直接访问设备驱动,见图2。接口函数满足了文件描述符的建立,读写,关闭的过程,open打开设备,read和write读写设备,ioctl对设备进行一些控制操作。 Linux的接口函数形式简单,在内核中能直接找到接口函数相应系统调用函数,名字为在接口函数之前加 sys_字符串,见表2。

1.3主要相同和不同之处

相同之处,CreatFile和open, ReadFile和read, WriteFile和write, CloseHandle和close, DeviceIoControl和ioctl这几个操作,有类似性。read, write操作都是在用户模式应用程序与核心模式驱动程序之间共享一段内存缓冲区的方法传递数据。不同之处,体现在中间层的实现方法不一样,windows中间层为一个I/O管理器,把系统调用转化为IRP请求包发给经过分层化的驱动程序,几个驱动程序可以处理同一个IRP请求包,而Linux将系统调用直接传递给驱动程序。

2.应用程序访问驱动程序的路径对比

2.1Windows的访问路径

在HKEY_LOCAL_MACHINE的SYSTEM\CurrentControlSet\Control\Class目录下,有设备类的键值,也就是命名设备,一个设备接口被一个128位的GUID唯一标识。应用程序先通过SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces,SetupDiGetInterfaceDeviceDetail等函数,得到ClassGuid相对应设备的符号链接名,Windows用符号链接表示内存的设备对象,如C:符号链接到\Device\HarddiskVolume1,COM1符号链接到\Device\Serial0等。符号链接名作为参数调用CreateFile函数,得到设备句柄hDevice。之后其它接口函数ReadFile, WriteFile, DeviceIoControl等通过hDevice作为参数访问具体驱动的相对应接口函数。

2.2Linux的访问路径

主要特色为设备节点,把设备当作文件看待,一个设备被主次设备号唯一确定,通过访问/dev目录下的设备文件,也就是设备的inode,得到设备类型、设备的主次设备号,从而正确访问设备。open函数获得文件描述符结构及结构号、设备驱动中的具体函数定位。open系统调用sys_open函数,通过sys_open->do_sys_open中的语句fd = get_unused_fd_flags(flags),得到文件描述符结构号。

通过sys_open->do_sys_open->do_flip_open->nameidata_to_filp->__dentry_open到达_dentry_open函数,通过语句f->f_op = fops_get(inode->i_fop);获得驱动操作函数地址。之后其它接口函数read,write,ioctl通过系统调用和fd文件描述符访问驱动程序中的操作函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值