CN102253834A - 一种基于数字电视的Linux硬件设备驱动系统 - Google Patents

一种基于数字电视的Linux硬件设备驱动系统 Download PDF

Info

Publication number
CN102253834A
CN102253834A CN2011101865664A CN201110186566A CN102253834A CN 102253834 A CN102253834 A CN 102253834A CN 2011101865664 A CN2011101865664 A CN 2011101865664A CN 201110186566 A CN201110186566 A CN 201110186566A CN 102253834 A CN102253834 A CN 102253834A
Authority
CN
China
Prior art keywords
linux
kernel
driver
linux kernel
unit
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN2011101865664A
Other languages
English (en)
Inventor
黄旭阳
张洁
孟思明
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
GUANGDONG XINGHAI DIGITAL HOME INDUSTRY TECHNOLOGY RESEARCH INSTITUTE Co Ltd
Sun Yat Sen University
Original Assignee
GUANGDONG XINGHAI DIGITAL HOME INDUSTRY TECHNOLOGY RESEARCH INSTITUTE Co Ltd
Sun Yat Sen University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by GUANGDONG XINGHAI DIGITAL HOME INDUSTRY TECHNOLOGY RESEARCH INSTITUTE Co Ltd, Sun Yat Sen University filed Critical GUANGDONG XINGHAI DIGITAL HOME INDUSTRY TECHNOLOGY RESEARCH INSTITUTE Co Ltd
Priority to CN2011101865664A priority Critical patent/CN102253834A/zh
Publication of CN102253834A publication Critical patent/CN102253834A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于数字电视的Linux硬件设备驱动系统,所述系统包括:Linux内核单元,用于为驱动程序提供操作系统环境;Linux内核面向对象设计单元,用于为Linux内核提供面向对象语言C++支持;驱动框架设计单元,用于为Linux内核提供面向对象的驱动设计框架;驱动开发单元,用于为开发人员按照驱动框架进行填充,完成驱动开发。本发明技术方案设计了一个可重用的Linux设备驱动系统,可大大提高代码复用度,简化开发过程。

Description

一种基于数字电视的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)装载/卸载函数;对位于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设备驱动规范的接口外,同时封装了系统请求分发等规程。KStream代表了字符设备驱动,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及其operatordelete。
步骤21:重载operator new。使用内核函数kmalloc获取存储空间,此函数使用了内核存储分配器Slab的普通高速缓存。
步骤22:在已获得的内存空间里进行对象的初始化工作。即调用对象的构造函数。
步骤23:重载operator delete。使用内核函数kfree作为全局的销毁符,释放已用内存空间。
图5为驱动程序生命周期行为设计流程图,Linux设备驱动程序框架将系统繁琐的细节向开发人员屏蔽,让他们专注设备功能部分,如read,write等方法的实现。框架通过对象间关系和某些巧妙设计的代码完成这项屏蔽工作。使用传统方法开发Linux设备驱动时,开发者总会定义好装载/卸载函数后,然后在装载函数中进行设备注册,再开始初始化设备。这是个公式化的行为,框架应该将这个操作序列封装在自身内部,然后通过一个定义良好的函数允许开发者进行一些自定义的初始化工作。对开发者而言,不再考虑装载和设备注册等过程,此函数成为驱动程序的生命起点。
步骤31:定义KDriver抽象类,类中声明满足Linux设备驱动规范的接口并封装了系统请求分发等规程,其中KDriver类包含Driver_Load驱动加载方法。
步骤32:驱动程序装载。需要框架正确产生一个对它而言类型未知的对象实例在装载函数内,框架调用KDriver的静态函数Driver_Load,由后者产生KDriver子类的实例,再通过虚函数init进行子类的初始化。其中Driver_Load函数参考设计模式中的工厂模式,利用宏DECLARE_DRIVER(class)为一个特定的类指定创建工厂。驱动程序实体通过语句DECLARE_DRIVER(MyDriver)的展开,生成函数create_Driver_instance(),该函数返回一个指向MyDriver实体的指针。
步骤33:驱动程序卸载。卸载点函数被系统调用时,框架通过持有的MyDriver实体指针调用虚函数uninit进行清除工作。
图6为驱动程序实体行为设计流程图,以传统方式进行驱动程序开发,必须对设备驱动的每个接口函数和系统交流的细节信息非常熟悉,例如在open接口中增加引用计数,并且将驱动程序的状态变量保存到接口要求的filp->private_data。框架应该在内部封装和系统交互的细节,给出开发者友好的接口用于进行设备特定的处理。设备注册时,Linux要求设备必须为系统提过的file_operations结构绑定设备操作函数。框架将自身的静态成员函数dispatch_xxx族填充该结构,成为系统调用的代理响应函数,下面以open系统调用为例。
步骤41:当用户通过系统调用open打开设备操作时,dispatch_open被首先调用,该函数完成和系统内核交互的必要工作。
步骤42:调用设备实际的open方法,以一个简单的接口面向开发者。
步骤43:dispatch_open通过内部方法endopen将设备的open结果转为系统内核希望的方式返回给系统。
需要说明的是,上述装置和系统内的各单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁盘或光盘等。
以上对本发明实施例所提供的一种嵌入式Linux网络加速的方法,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (4)

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的内核头文件通过#include指令包裹在一个头文件中,并在这个头文件引用前利用#define指令转义C++关键字,引用完毕后,再使用#undef重置C++关键字。
4.如权利要求1所述的基于数字电视的Linux硬件设备驱动系统,其特征在于,所述系统重新定义KDriver抽象类,实现驱动程序装载以及驱动程序卸载。
CN2011101865664A 2011-07-05 2011-07-05 一种基于数字电视的Linux硬件设备驱动系统 Pending CN102253834A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2011101865664A CN102253834A (zh) 2011-07-05 2011-07-05 一种基于数字电视的Linux硬件设备驱动系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2011101865664A CN102253834A (zh) 2011-07-05 2011-07-05 一种基于数字电视的Linux硬件设备驱动系统

Publications (1)

Publication Number Publication Date
CN102253834A true CN102253834A (zh) 2011-11-23

Family

ID=44981114

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2011101865664A Pending CN102253834A (zh) 2011-07-05 2011-07-05 一种基于数字电视的Linux硬件设备驱动系统

Country Status (1)

Country Link
CN (1) CN102253834A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108008945A (zh) * 2017-12-13 2018-05-08 天津津航计算技术研究所 一种linux系统下pci设备驱动开发方法
CN112988144A (zh) * 2019-12-02 2021-06-18 北京华航无线电测量研究所 通用嵌入式事件驱动软件开发框架及使用方法
CN113268275A (zh) * 2021-07-19 2021-08-17 成都菁蓉联创科技有限公司 一种基于微内核的硬件设备驱动系统及其驱动方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040181778A1 (en) * 2003-03-03 2004-09-16 Tibazarwa Augustine K. System and method for a requirement-centric extensible multilingual instruction language for computer programming
CN1815440A (zh) * 2005-01-31 2006-08-09 微软公司 用于数字设备菜单编辑器的方法和系统

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040181778A1 (en) * 2003-03-03 2004-09-16 Tibazarwa Augustine K. System and method for a requirement-centric extensible multilingual instruction language for computer programming
CN1815440A (zh) * 2005-01-31 2006-08-09 微软公司 用于数字设备菜单编辑器的方法和系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
袁丽慧等: "可重用Linux设备驱动程序框架", 《计算机工程》 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108008945A (zh) * 2017-12-13 2018-05-08 天津津航计算技术研究所 一种linux系统下pci设备驱动开发方法
CN112988144A (zh) * 2019-12-02 2021-06-18 北京华航无线电测量研究所 通用嵌入式事件驱动软件开发框架及使用方法
CN112988144B (zh) * 2019-12-02 2023-09-12 北京华航无线电测量研究所 通用嵌入式事件驱动软件开发框架及使用方法
CN113268275A (zh) * 2021-07-19 2021-08-17 成都菁蓉联创科技有限公司 一种基于微内核的硬件设备驱动系统及其驱动方法
CN113268275B (zh) * 2021-07-19 2021-09-28 成都菁蓉联创科技有限公司 一种基于微内核的硬件设备驱动系统及其驱动方法

Similar Documents

Publication Publication Date Title
US10146522B1 (en) Live code updates
US7281248B2 (en) Virtualized and realized user interface controls
KR101581796B1 (ko) 컴퓨팅 플랫폼의 이종 프로세서들 간의 공유 가상 메모리에서의 가상 함수들의 공유
US7421716B1 (en) System and method for providing composite applications
CN109299587A (zh) 基于go语言的算法保护方法、装置、设备及存储介质
CN106462414A (zh) 特化类的依赖性驱动的共同特化
CN107656759B (zh) 一种用于用户界面的渲染方法和装置
JP2018517986A (ja) 階層的サブルーチン情報を含む中間コードからのオブジェクトコードの生成
CN107450897B (zh) 图形引擎的跨平台移植方法和装置
CN105378689A (zh) 统一可扩展固件接口(uefi)驱动器和协议
CN109598107A (zh) 一种基于应用安装包文件的代码转换方法及装置
WO2019085811A1 (zh) 一种实现驱动的系统及方法
US20220222584A1 (en) Heterogeneous compute-based artificial intelligence model partitioning
CN109426513A (zh) 一种视图组件的处理方法及设备
CN111610966A (zh) 程序的运行方法、装置和计算设备
CN102253834A (zh) 一种基于数字电视的Linux硬件设备驱动系统
CN108037924A (zh) glibc和bionic的驱动自适配系统及方法
US20080271007A1 (en) System and method for managed tuxedo wrapper for .net applications
CN112306539A (zh) 一种单片机应用层开发方法、系统、终端及介质
US8341606B2 (en) Method of invoking inlined method and java virtual machine using the method
JP2005507103A (ja) Javaヒープを実現するフレームワーク
CN111459573A (zh) 一种智能合约执行环境的启动方法以及装置
KR20100110710A (ko) 동적 라이브러리를 갖는 인터페이스를 간단히 하는 방법, 시스템 및 컴퓨터 프로그램 제품
US8743116B1 (en) Shader network
WO2021093442A1 (zh) 一种边缘辅助部署第三方应用到微控制器方法及系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C12 Rejection of a patent application after its publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20111123