一种基于数字电视的Linux硬件设备驱动系统的制作方法

文档序号:6427868阅读:229来源:国知局
专利名称:一种基于数字电视的Linux硬件设备驱动系统的制作方法
技术领域
本发明涉及数字家庭技术领域,具体涉及一种基于数字电视的Linux硬件设备驱动系统。
背景技术
随着数字电视和Linux的不断发展,数字电视机顶盒采用Linux内核的产品越来越多。Linux内核完全由C语言和汇编语言写成,但是却频繁用到了面向对象的设计思想。 在设备驱动方面,往往为同类的设备设计了一个框架,而框架中的核心层则实现了该设备通用的一些功能。框架在为开发工作带来方便、健壮等优越性的同时,也带来了程序尺寸增大,运行速度降低等缺点,这不符合人们对驱动程序的要求。但随着CPU速度和存储器容量的快速发展,这样的情况正在发生变化。最终用户对驱动程序稳定性和开发者对驱动程序研发速度和质量的需求会成为选择驱动开发工具的首要因素。目前数字电视机机顶盒Linux的设备驱动开发非常繁琐,尽管几乎所有的设备驱动程序在结构上类似,但是要重用这些代码却并非易事。此外,现有的Linux设备驱动是基于过程设计的,容易出现控制流程过于复杂,模块间耦合度高的问题。

发明内容
为解决上述Linux驱动程序开发过程中的问题,本发明以C++为基础,设计了一个可重用的Linux设备驱动系统,可大大提高代码复用度,简化开发过程,并从面向对象的角度给出了一个设备驱动程序的构造视图。本发明提供一种基于数字电视的Linux硬件设备驱动系统,所述系统包括Linux内核单元,用于为驱动程序提供操作系统环境;Linux内核面向对象设计单元,用于为Linux内核提供面向对象语言C++支持;驱动框架设计单元,用于为Linux内核提供面向对象的驱动设计框架;驱动开发单元,用于为开发人员按照驱动框架进行填充,完成驱动开发。所述Linux内核单元中的处理流程包括提供修改Linux内核,使用面向对象语言C++与Linux内核兼容。使用Linux内核函数重载C++中的new和delete方法,保持面向对象语言在Linux 内核的特性;驱动程序生命周期行为设计,实现驱动程序的装载和卸载操作;驱动程序实体行为设计,在内部封装和系统交互的细节。所述系统使用extern C 关键字修饰 int init_module (void)和 void cleanup, module (void)装载/隹P载函数;对位于module, h中的kernel_version变量用violate关键字修饰,强制C++保有该变量;将Linux的内核头文件通过#include指令包裹在一个头文件中,并在这个头文件引用前利用#define指令转义C++关键字,引用完毕后,再使用 #undef重置C++关键字。
所述系统重新定义KDriver抽象类,实现驱动程序装载以及驱动程序卸载。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。图1是本发明实施例中的基于数字电视的Linux硬件设备驱动系统架构图;图2是本发明实施例中的基于数字电视的Linux硬件设备驱动系统流程图;图3是本发明实施例中的面向对象语言C++与Linux内核兼容流程图;图4是本发明实施例中的面向对象语言C++在Linux内核中语言特性保持流程图;图5是本发明实施例中的驱动程序生命周期行为设计流程图;图6是本发明实施例中的驱动程序实体行为设计流程图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。本发明实施例提供一种基于数字电视的Linux硬件设备驱动系统,能够为Linux 驱动开发提供面向对象的可重用驱动设计方法,以下分别进行详细说明。如图1所示,本发明实施例中的驱动系统主要包括以下单元=Linux内核单元、 Linux内核面向对象设计单元、驱动框架设计单元、驱动开发单元。所述Linux内核单元为驱动程序提供操作系统环境。所述Linux内核面向对象设计单元为Linux内核提供面向对象语言C++支持。所述驱动框架设计单元为Linux内核提供面向对象的驱动设计框架。所述驱动开发单元,开发人员按照驱动框架进行填充,完成驱动开发。基于本发明实施例中的驱动系统,这里的实现方案包括如下步骤1 修改Linux内核,使用面向对象语言C++与Linux内核兼容。步骤2 使用Linux内核函数重载C++中的new和delete方法,保持面向对象语言在Linux内核的特性。步骤3 驱动程序生命周期行为设计,利用图3所示的驱动框架结构实现驱动程序的装载和卸载操作。步骤4 驱动程序实体行为设计,在内部封装和系统交互的细节。Kdriver, KDevice及其子类被定义为抽象类,类中除了声明满足Linux设备驱动规范的接口外,同时封装了系统请求分发等规程。Etream代表了字符设备驱动,KBlock表示块设备驱动。KDispatchObject及其子类封装了系统内核对象,如互斥同步、内核定时器等。STL for kernel完成了 C++标准模板库,在内核中可以使用如set,vector等高级容器和相应算法。此外还包括了部分IO接口标准。框架中,IO接口、STL、内核对象部分属于简单封装,目的在于提供一个面向对象的外观,可供开发人员直接使用。这部分的类不具备主动活动的能力,受KDriver及KDevice驱动进行工作。从开发者角度看,一个驱动程序由一个KDriver的子类和KDevice的子类构成。开发者为完成驱动程序所需的工作就是在MyDevice类中将继承自父类的虚函数重写,增加和设备操作实际相关的代码。图3为面向对象语言C++与Linux内核兼容流程图,Linux —直采用C作为内核开发语言,为了保持和内核的无缝结合,驱动程序也用C编码,尽管C++可用于内核编程,但由于驱动和普通应用的差异,以及内核缺乏对C++运行库的支持使得并不能直接利用C++构造驱动程序,故需要解决C++与Linux内核的兼容性问题。步骤11 使用 extern C 关键字修饰 int init_module (void)和 void cleanup, module (void)装载/卸载函数。步骤12 对位于module, h中的kernel_version变量用violate关键字修饰,强制C++保有该变量。步骤13 将Linux的内核头文件通过#include指令包裹在一个头文件中,并在这个头文件引用前利用#define指令转义C++关键字,引用完毕后,再使用#undef重置C++
关键字。图4为面向对象语言C++在Linux内核中语言特性保持流程图由g++编译器产生的C++对象的内存布局在操作系统内核和用户态一致,基于此, C++语言的封装性和继承性在内核模式下得以保存。但是,多态性必须依赖于C++对象动态创建和销毁的能力,在内核模式下,没有用户态程序的堆区域,没有C++运行库的支持,必须自己维护一个处于内核模式下的“堆区域”和分配策略。解决这一问题的唯一途径就是重载 operator new 及其 operator delete。步骤21 重载operator new。使用内核函数kmalloc获取存储空间,此函数使用了内核存储分配器Slab的普通高速缓存。步骤22 在已获得的内存空间里进行对象的初始化工作。即调用对象的构造函数。步骤23 重载operator delete。使用内核函数kfree作为全局的销毁符,释放已用内存空间。图5为驱动程序生命周期行为设计流程图,Linux设备驱动程序框架将系统繁琐的细节向开发人员屏蔽,让他们专注设备功能部分,如read,write等方法的实现。框架通过对象间关系和某些巧妙设计的代码完成这项屏蔽工作。使用传统方法开发Linux设备驱动时,开发者总会定义好装载/卸载函数后,然后在装载函数中进行设备注册,再开始初始化设备。这是个公式化的行为,框架应该将这个操作序列封装在自身内部,然后通过一个定义良好的函数允许开发者进行一些自定义的初始化工作。对开发者而言,不再考虑装载和设备注册等过程,此函数成为驱动程序的生命起点。步骤31 定义KDriver抽象类,类中声明满足Linux设备驱动规范的接口并封装了系统请求分发等规程,其中KDriver类包含Driver_Load驱动加载方法。步骤32 驱动程序装载。需要框架正确产生一个对它而言类型未知的对象实例在装载函数内,框架调用KDriver的静态函数Driver_L0ad,由后者产生KDriver子类的实例, 再通过虚函数init进行子类的初始化。其中Driver_L0ad函数参考设计模式中的工厂模式,利用宏DECLARE_DRIVER(class)为一个特定的类指定创建工厂。驱动程序实体通过语句 DECLARE_DRIVER(MyDriver)的展开,生成函数 create_Driver_instance (),该函数返回一个指向MyDriver实体的指针。步骤33 驱动程序卸载。卸载点函数被系统调用时,框架通过持有的MyDriver实体指针调用虚函数iminit进行清除工作。图6为驱动程序实体行为设计流程图,以传统方式进行驱动程序开发,必须对设备驱动的每个接口函数和系统交流的细节信息非常熟悉,例如在open接口中增加引用计数,并且将驱动程序的状态变量保存到接口要求的filp- > private_data。框架应该在内部封装和系统交互的细节,给出开发者友好的接口用于进行设备特定的处理。设备注册时, Linux要求设备必须为系统提过的file_0perati0ns结构绑定设备操作函数。框架将自身的静态成员函数diSpatCh_XXX族填充该结构,成为系统调用的代理响应函数,下面以open 系统调用为例。步骤41 当用户通过系统调用open打开设备操作时,diSpatCh_0pen被首先调用, 该函数完成和系统内核交互的必要工作。步骤42 调用设备实际的open方法,以一个简单的接口面向开发者。步骤43 :diSpatCh_0pen通过内部方法endopen将设备的open结果转为系统内核希望的方式返回给系统。需要说明的是,上述装置和系统内的各单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁盘或光盘等。以上对本发明实施例所提供的一种嵌入式Linux网络加速的方法,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1.一种基于数字电视的Linux硬件设备驱动系统,其特征在于,所述系统包括Linux内核单元,用于为驱动程序提供操作系统环境;Linux内核面向对象设计单元,用于为Linux内核提供面向对象语言C++支持;驱动框架设计单元,用于为Linux内核提供面向对象的驱动设计框架;驱动开发单元,用于为开发人员按照驱动框架进行填充,完成驱动开发。
2.如权利要求1所述的基于数字电视的Linux硬件设备驱动系统,其特征在于,所述 Linux内核单元中的处理流程包括提供修改Linux内核,使用面向对象语言C++与Linux内核兼容。使用Linux内核函数重载C++中的new和delete方法,保持面向对象语言在Linux内核的特性;驱动程序生命周期行为设计,实现驱动程序的装载和卸载操作;驱动程序实体行为设计,在内部封装和系统交互的细节。
3.如权利要求1所述的基于数字电视的Linux硬件设备驱动系统,其特征在于,所述系统使用 extern C关键字修饰 int init_module (void)禾口 void cleanup_module (void)装载 /卸载函数;对位于module, h中的kernel_version变量用violate关键字修饰,强制C++ 保有该变量;将Linux的内核头文件通过iiinclude指令包裹在一个头文件中,并在这个头文件引用前利用#define指令转义C++关键字,引用完毕后,再使用#undef重置C++关键字。
4.如权利要求1所述的基于数字电视的Linux硬件设备驱动系统,其特征在于,所述系统重新定义KDriver抽象类,实现驱动程序装载以及驱动程序卸载。
全文摘要
本发明公开了一种基于数字电视的Linux硬件设备驱动系统,所述系统包括Linux内核单元,用于为驱动程序提供操作系统环境;Linux内核面向对象设计单元,用于为Linux内核提供面向对象语言C++支持;驱动框架设计单元,用于为Linux内核提供面向对象的驱动设计框架;驱动开发单元,用于为开发人员按照驱动框架进行填充,完成驱动开发。本发明技术方案设计了一个可重用的Linux设备驱动系统,可大大提高代码复用度,简化开发过程。
文档编号G06F9/44GK102253834SQ20111018656
公开日2011年11月23日 申请日期2011年7月5日 优先权日2011年7月5日
发明者孟思明, 张洁, 黄旭阳 申请人:中山大学, 广东星海数字家庭产业技术研究院有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1