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

2.3主要相同和不同之处

相同之处,都有open函数完成路径建立,也就是生成一个描述符,以后通过描述符操作设备。不同之处,Windows设备唯一性建立在128位GUID标识上,linux的设备唯一性建立在设备节点的主次设备号上。

3驱动程序具体实现方式及安装对比

3.1Windows驱动程序实现及安装

3.1.1基本实现过程及设备类描述

就实现工具而言,主要是 VC++、DriverStudio和 DDK,DriverStudio用C++语言对DDK进行封装,本文用DriverStudio作为分析依据。由于Windows设备访问过程是从系统调用到I/O管理器,再到驱动程序,所以对应也是系统调用对应IRP功能码,功能码对应设备类成员函数,所以实现的主要部分是编写和IRP功能码相对应的设备类成员函数,比如device::DeviceControl对应IRP_MJ_DEVICE_CONTROL,具体见表2。Windows的设备类通过*.inf文件中的[Version]段中的Class指定,并用ClassGuid唯一地标识该设备类。

3.1.2同步与互斥机制

DriverWorks提供了的内核同步互斥对象类有,KEvent, KSemaphore, KMutex, KTimer, KsystemThread,KSpinLock,可在设备类中声明使用。在用户空间用WaitForSingleObject 或WaitForMulti2pleObjects函数可以等待Event、Mutex 、Semaphore 、Process 、Thread这些同步对象。

3.1.3驱动中的中断响应函数

中断响应函数为设备类的isr成员函数,比如device::isr,延迟调用为设备类的dpc成员函数。

3.1.4安装

在HKEY_LOCAL_MACHINE的SYSTEM\CurrentControlSet\Control\Class目录下,建立一个设备类,控制面板里面的添加硬件启动添加硬件向导,选中相应的*.inf文件开始添加,主要加载*.sys。Windows装载驱动程序的时候,调用DriverEntry(PUNICODE_STRING RegistryPath)函数,DriverEntry只在装载的时候被调用一次,主要作用是把各种函数指针填入驱动程序对象。Windows中驱动程序一般分为功能驱动程序和总线驱动程序,总线探测到设备时,通知PnP管理器生成一个设备的物理对象PDO,然后参照注册表信息查找和PDO相关的过滤器和功能驱动程序,装入驱动程序并调用其AddDevice,具体流程见图3。

3.2Linux驱动程序实现方式及安装

3.2.1基本实现过程及设备类描述

主要实现工具gcc,用gcc编译成所写模块,模块编写主要写模块装载初始化函数,模块卸载函数和open,read,write,close等系统调用相对应的函数,并用struct file_operations数据结构中的对应域指向对应函数的地址。Linux装载驱动程序的时候,调用模块的module_init(init_xx)函数,init_xx函数,调用cdev_add或add_disk函数向系统注册包含各种函数指针的设备数据结构,卸载时调用module_exit(exit_xx)函数。设备描述的建立过程是将struct cdev, struct gendisk嵌入其他设备结构体中,由于cdev, gendisk包含kobject体,通过kobject结构可找到相应的设备结构体,从而管理访问相应的设备。由于kset管理kobject,对kobject归类,从而建立起对设备的分类描述。

3.2.2同步机制

linux内核提供了自旋锁、原子操作、信号量和定时器等同步机制,保证了对临界资源访问的互斥性。自旋锁函数spin_lock函数, spin_unlock函数。原子操作将某些操作的执行不可中断,原子操作又分bitops和atomic_t两类,bitops函数为set_bit, clear_bit。atomic_t用于加减之类的运算,如atomic_add ,atomic_sun等。信号量操作down(&信号量),得到一个资源,进入临界区,up(&信号量),归还一个资源,退出临界区。

3.2.3驱动中的中断响应函数

用request_irp函数申请中断号,并且指定自己写的中断响应函数。延迟过程调用,原先为bottom机制,现用tasklet机制实现底半部处理。

3.2.4安装

linux安装驱动,也就是安装驱动模块,首先获得超级权限,用insmod或modprobe将模块插入内核,也就是完成动态连接。Linux驱动程序分为总线驱动程序和设备模块驱动程序,当总线检测到设备时,通过call_usermodehelper调用/sbin/hotplug向用户空间传递消息从而加载模块,驱动模块生成代表设备的设备数据结构,将这个结构和驱动程序绑定起来,见图3。

3.3主要相同和不同之处

相同之处,驱动模块都可动态装载。从用户编写角度看,都是编写和系统调用相应的设备接口函数,虽然函数名称不一样。同步机制相似,没有大差别。中断过程为了提高响应速度,都采用延迟过程调用。从驱动程序的整体结构来说都是分为总线驱动程序和具体功能驱动程序,符合设备与总线的关系,多数设备都在总线上,总线驱动程序和设备驱动程序的访问流程也很相似,流程见图3。

不同之处,模块结构不一样,由于windows采用128位的GUID唯一标识,安装过程需用*.inf文件,事件响应所用工具有很大不同,Windows使用了PnP管理器,Linux使用了udev工具。Windows除了功能驱动程序,还可加载过滤驱动程序,Linux没有这样机制。

4融合方案

分层过滤思想,多个驱动程序处理同一个IRP功能码,当出现不符合过滤驱动程序要求的请求时,把请求过滤掉,不再把IRP请求包传递给下一层。对于设备inode, Linux把设备当作文件,放在/dev目录。Linux中的系统调用直接调用驱动,没有过滤。见图3,融合两系统特色,形成一套新的驱动框架。新的驱动框架依托Linux,原有设备inode只有一对主次设备号,新的有多对主次设备号,也就是新的设备inode对应多个驱动程序,一个驱动程序还对应一对主次设备号。可以把上层第1对主次设备号,第2对主次设备号看作指向了过滤驱动程序。

新的系统调用的内核实现,变为先访问第1对主次设备号所对应的驱动程序,完成任务后,若允许通过,则传给第2对主次设备号所对应的驱动程序,若不允许通过,则系统调用返回。对于第2对主次设备号,也是这样,若允许通过,则传给第3对主次设备号,不允许则系统调用返回。第3对主次设备作为最底层驱动程序,直接完成处理,不再传递。假如设备节点只有一对,那么直接处理,若有更多对,也是依次处理。通过融合,Linux也具有过滤机制,可增强安全性,隔离硬件差异性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值