《DB43_T 2260-2021 信息技术应用创新工程建设规范 第9部分:驱动开发通用技术要求.docx》由会员分享,可在线阅读,更多相关《DB43_T 2260-2021 信息技术应用创新工程建设规范 第9部分:驱动开发通用技术要求.docx(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ICS01.140.20CCSL7043湖南省地方标准DB43/T22602021信息技术应用创新工程建设规范第9部分:驱动开发通用技术要求EngineeringspecificationfortheApplicationInnovationProjectofInformationTechnologyPart9:Generaltechnicalrequirementsofdriverdeveloping2021-12-29发布2022-03-29实施湖南省市场监督管理局发布DB43/T22602021目次前言引言1范围12规范性引用文件13术语和定义14缩略语25核内驱动总体要求25.1编程要
2、求25.2设备驱动模型35.3文件组织形式35.4驱动程序实现35.5第三方技术使用46核内驱动具体要求56.1字符设备驱动程序56.2块设备驱动程序66.3平台设备驱动程序76.4网络设备驱动程序96.5显示帧缓存设备驱动程序106.6驱动程序的DKMS包制作126.7驱动程序的调试验证137常用外设开发要求137.1打印机驱动开发137.2扫描仪驱动开发147.3手写液晶屏驱动开发15附录A(资料性)设备驱动分类16附录B(资料性)驱动程序实现函数示例17附录C(资料性)驱动程序可调用的内核函数接口19附录D(规范性)驱动程序相关的结构体21附录E(资料性)DKMS技术说明及示例23附录F
3、(资料性)第三方内核模块打包26附录G(资料性)驱动程序的调试验证方法32附录H(资料性)打印机驱动库配置文件示例36IDB43/T22602021引言湖南省为深入贯彻国家网络强国战略,全面落实中央有关文件精神,部署开展湖南省信息技术应用创新工程建设,保障全省各级党政机关关键信息基础设施信息安全和信息系统安全可靠运行。针对自主可控产品体系初具规模,但相关产品和工程实施标准规范还很缺乏的现状,为了规范工程建设,加速工程进度,扩大建设结果,同时有力提升自主可控产业发展水平,确保信息安全,由湖南省国家密码管理局作为业务主管单位、湖南省工业和信息化厅作为技术归口单位,由中国人民解放军国防科技大学、中国
4、电子信息产业集团有限公司等单位与湖南省合作制定了信息技术应用创新工程建设规范地方标准。信息技术应用创新工程建设规范主要由自主可控核心产品、典型应用、工程管理等方面的规范组成,重点解决应用创新工程建设当中产品选型、应用开发、工程实施等基础环节的实际问题,可为应用创新工程的用户使用单位、集成建设单位和相关产品研制单位,在产品和应用规范化、软硬件兼容适配、工程实施标准等方面提供一般性指引。信息技术应用创新工程建设规范未来将根据自主可控产业和应用创新工程的发展变化进行相应的必要调整和补充。VDB43/T22602021VIDB43/T22602021信息技术应用创新工程建设规范第9部分:驱动开发通用技
5、术要求1范围本文件提出了国产操作系统驱动程序开发的编程要求、设备驱动模型、文件组织形式、驱动程序实现、第三方技术使用等总体要求,并针对字符设备、块设备、平台设备、网络设备、显示帧缓存设备的驱动程序框架和开发提出具体要求。本文件适用于国产操作系统上第三方驱动程序的开发,也为第三方驱动程序的调试验证提供指导。2规范性引用文件下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文件,仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T152721994程序设计语言C3术语和定义下列术语和定义适用于本文件。3.1驱动程序
6、driver驱动程序是硬件厂商根据操作系统编写的配置文件,操作系统通过驱动来与控制设备和进行通信。3.2设备device是计算机系统中输入、输出设备(包括外存储器)的统称。设备对数据和信息起着传输、转送和存储的作用。3.3总线bus是计算机各种功能部件之间传送信息的公共通信干线。3.4设备驱动模型devicedrivermodel设备驱动模型是操作系统内核为了管理硬件上的设备和对应的驱动程序所制定的一套软件体系。3.5平台总线platformbus平台总线是操作系统内核定义的一种虚拟总线,操作系统内核通过平台总线来管理芯片内部集成设备。3.6平台设备驱动模型platformdevicedriv
7、ermodel1DB43/T22602021平台设备驱动模型,即采用平台总线的方式对驱动程序和设备进行管理的设备驱动模型。3.7字符设备characterdevice字符设备是不可寻址的,仅提供数据的流式访问的设备。3.8块设备blockdevice块设备是以块为单位的、可以寻址的设备。块设备通常支持重定位操作,实现对数据的随机访问。3.9网络设备networkdevice网络设备通过网络适配器和特定的网络协议来完成网络访问的设备。3.10版本魔术信息vermagicinformation版本魔术信息是驱动程序内存储的、用来描述操作系统内核版本号以及基础内核配置的字符串。3.11导出符号exp
8、ortsymbol导出符号是操作系统内核模块导出的、可供其他模块中的函数使用的全局变量或者函数。3.12GNU编译器套件GNUCompilerCollectionGNU编译器套件是由GNU开发的编程语言编译器,它包括C、C+、Objective-C、Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc+,libgcj等。)3.13OPPS信息OPPSInformation操作系统内核发生严重错误时所提示的信息,包括错误发生时的各个常用寄存器的值,调用的堆栈,以及出错的可能原因。4缩略语下列缩略语适用于本文件:ACPI:高级配置和电源管理接口(AdvancedC
9、onfigurationandPowerManagementInterface)CPU:中央处理器(CentralProcessingUnit)DKMS:动态内核模块支持(DynamicKernelModuleSupport)GNU:开源标准(GNUsNotUnix)GPL:GNU通用公共许可证(GNUGeneralPublicLicense)I/O:输入/输出(Input/Output)NAPI:网络数据处理API(NewAPI)PMU:性能监视单元(PerformanceMonitoringUnit)5核内驱动总体要求5.1编程要求驱动程序代码应符合GB/T15272-1994和Linux
10、内核编程的相关要求,并采用系统内核提供的代码2DB43/T22602021检查脚本来检查驱动程序代码的合规性。为了保证内核升级时其内部调用符号的可用性,驱动程序代码分为内核框架层和核心代码逻辑层,其中内核框架层实现与内核对接的部分,而核心代码逻辑层实现驱动模块的核心功能,编写时应符合以下原则:a)不使用内核的API接口和数据结构;b)不使用内核的框架代码;c)不进行内核版本的判断处理;d)不使用宏进行同架构内CPU的判断处理;e)二进制文件只包含需要保护的代码。5.2设备驱动模型应基于设备驱动模型来进行驱动程序开发,设备驱动模型分类参见附录A,设备和驱动程序均应挂载到总线上,并通过总线来实现对
11、驱动程序和设备的管理。5.3文件组织形式应采用独立目录存放驱动程序的代码文件,驱动程序目录:a)应包含Makefile驱动程序构建文件,用于驱动程序的自动化编译;b)应使用.c源码文件来保存驱动程序实现,若驱动程序的功能复杂,通过多个源码文件来分类存放驱动程序实现;c)应使用.h头文件来声明驱动程序中的函数、数据结构和变量,应安装内核提供的linux/init.h、linux/module.h和linux/kernel.h头文件,当需要调用内核功能时,驱动应使用上述头文件中提供的函数接口来请求内核功能;d)应使用Kconfig配置文件来描述驱动程序源码文件相关的内核配置菜单;e)宜使用Read
12、me说明文档来介绍驱动程序的功能和使用方法。5.4驱动程序实现5.4.1入口函数驱动程序开发应定义和实现驱动程序的入口函数,驱动程序的入口函数应满足以下要求:a)应使用_init初始化修饰符来修饰入口函数;b)应完成驱动程序的注册和加载操作;c)应调用内核提供的驱动程序总线注册函数来完成驱动程序的注册;d)应通过具体的返回值来表示驱动程序是否加载成功,加载失败的返回值宜定义为负值,不同的负值对应不同的错误原因;e)应通过内核提供的module_init()模块初始化函数来声明驱动程序的入口函数。驱动程序入口函数示例见附录B.1。5.4.2出口函数驱动程序开发应定义和实现驱动程序的出口函数,驱动
13、程序的出口函数应满足以下要求:a)应使用_exit退出修饰符来修饰出口函数;b)应完成驱动的卸载操作;c)应打印卸载相关信息,无需通过返回值来注明驱动程序的卸载是否成功;d)应通过内核提供的module_exit()模块退出函数来声明驱动程序的出口函数。3DB43/T22602021驱动程序出口函数示例见附录B.2。5.4.3信息声明驱动程序的加载代码中应包含驱动程序的信息声明,包括“模块许可协议”、版本”、“作者”以及“模块描述”等信息,信息声明示例见附录B.3。5.4.4remove卸载函数驱动程序应实现remove卸载函数,在remove卸载函数中实现对驱动程序申请的设备、内存以及sys
14、文件系统节点等资源的释放。卸载程序中的资源释放示例见附录B.4。若驱动程序中注册了回调函数,则remove卸载函数中应包含注销回调函数的操作。5.4.5核心数据结构的可扩展性应通过以下方式来实现驱动程序核心数据的可扩展性:a)在数据结构中添加reserved保留字段;b)在数据结构中添加表示私有数据的指针,扩展时只需要修改该指针所指向的数据结构,而无需修改核心数据结构。核心数据结构的可扩展性实现示例见附录B.5。5.4.6probe探测函数驱动程序应实现probe探测函数,用于完成设备驱动程序注册的最后收尾工作。在probe探测函数中进行硬件资源的获取、内存结构的映射以及设备的创建等操作时,应
15、通过内核提供的内核操作函数接口进行,涉及的内核操作函数接口见附录C。5.4.7用户空间内存访问若驱动程序需访问用户空间内存,应在访问前先使用access_ok检验函数来检查用户空间内存指针的有效性。5.4.8调试统计变量驱动程序开发时应添加必要的调试统计变量,以便于对驱动程序的调试测试。调试统计变量宜实现分级开关,以提供各种粒度的调试测试选项。5.4.9导出符号规范驱动程序应使用内核提供的EXPORT_SYMBOL_GPL宏或EXPORT_SYMBOL宏来导出符号。EXPORT_SYMBOL_GPL宏导出的符号适用于包含GPL许可的模块,EXPORT_SYMBOL宏导出的符号适用于任何模块。示
16、例:驱动导出符号的两种方式EXPORT_SYMBOL(func1);EXPORT_SYMBOL_GPL(func2);5.5第三方技术使用驱动程序开发若涉及对第三方技术的使用,应在驱动程序正式开发前对所涉及的第三方技术进行效率、兼容性、稳定性等方面的测试,确保第三方技术的使用不会对驱动程序的功能、性能造成不良影响。4DB43/T226020216核内驱动具体要求6.1字符设备驱动程序6.1.1驱动程序框架字符设备驱动程序框架见图1。图1字符设备驱动程序框架字符设备驱动包括以下部分:a)设备文件操作函数接口:字符设备驱动通过file_operation结构体函数集向用户空间提供设备文件操作函数接
17、口。file_operation结构体中的函数集用于实现驱动与/dev下的字符设备节点联通,当用户空间的应用程序通过调用文件操作函数open(打开)、write(写)、read(读)、close(关闭)对/dev目录下字符设备节点进行操作时,会通过file_operation结构体中的对应函数来通知驱动实现对字符设备的对应操作。b)内核空间的字符设备驱动程序。驱动程序直接与字符设备硬件打交道,负责实现设备注册、设备操作等硬件操作功能。6.1.2开发要求6.1.2.1函数接口为实现系统/dev下的字符设备节点与驱动程序的联通,字符设备驱动程序应提供并实现与llseek、read、write、op
18、en、close等文件操作函数接口所对应的函数实现,并通过file_operations文件操作结构体将文件操作函数与驱动程序内的函数实现相关联。file_operations文件操作结构体格式应符合附录D.1要求。6.1.2.2驱动程序注册字符设备驱动程序应基于平台驱动模型注册,包含以下内容:5DB43/T22602021a)应提前准备好驱动程序对应的主设备号,主设备号应使用内核已注册的主设备号之外的数值;b)应使用平台驱动结构platform_driver封装驱动程序信息;c)应使用平台驱动程序注册函数platform_driver_register(drv)将驱动程序注册到平台总线的驱动
19、程序链表中。6.1.2.3字符设备注册字符设备的注册应包含如下内容:a)预生成一个尚未被申请使用的设备号;b)预生成设备号的主设备号为对应的驱动程序的主设备号,从设备号应从0开始,宜根据驱动程序所匹配的设备数量按序取值,最大取值不超过1048575;c)应使用静态申请方式申请设备号;d)应对cdev结构体进行初始化,并将实现的file_operations函数结构体与cdev关联;e)针对注册的字符设备,应使用内核提供的函数组创建对应sys文件系统节点,且需对返回值做错误处理,若有多个从设备,应创建class类。6.1.2.4驱动匹配字符设备驱动程序开发应同时通过设备树和ACPI两种方式来封装
20、设备信息,并将封装后的信息分别添加到“驱动-设备”匹配队列中。6.2块设备驱动程序6.2.1驱动程序框架块设备驱动程序框架分为三个层次,见图2。图2块设备驱动程序框架a)通用块层:为各种类型的块设备建立一个统一的模型,接受上层发出的数据读写请求,并最终发出I/O请求。通用块层隐藏了底层硬件块设备的特性,为块设备提供了一个通用的抽象视图;6DB43/T22602021b)输入输出调度层:接收通用块层发出的I/O请求,缓存请求并合并相邻的请求,根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的I/O请求;c)块设备驱动层:处理集体I/O请求,处理过程根据块设备类型的不同而有所不同。块
21、设备驱动程序的一般处理流程应为:上层调用通用块层提供的接口提交I/O请求,这些请求首先被放入输入输出调度层的I/O调度队列,经过合并和排序,最终将转换后的I/O请求派发到具体块设备驱动准备的等待队列,由块设备驱动进一步处理。6.2.2开发要求6.2.2.1函数接口块设备驱动程序的函数接口应符合以下要求:a)虚拟块设备的驱动程序可以不提供probe探测函数接口;b)若块设备驱动程序中需要对I/O请求进行特殊处理,则应提供并实现I/O处理函数;示例:I/O处理函数接口staticblk_qc_txxx_make_request(structrequest_queue*q,structbio*bio
22、);c)块设备驱动程序应实现I/O中断请求对应的中断处理函数接口,虚拟块设备的驱动程序可以不实现该函数接口;示例:中断处理函数接口staticirqreturn_tgdrom_command_interrupt(intirq,void*dev_id);d)块设备驱动程序应提供并实现ioctl、open、close等基本块设备操作的设备操作函数接口。示例:设备操作函数接口int(*ioctl)(structblock_device*,fmode_t,unsigned,unsignedlong);/*Ioctl接口*/int(*open)(structblock_device*,fmode_t);
23、/*Open接口*/void(*release)(structgendisk*,fmode_t);/*Close接口*/6.2.2.2驱动程序加载块设备驱动程序的加载主要包括以下内容:a)应使用alloc_disk()块设备分配函数分配gendisk通用块设备结构体;b)可以通过内核提供的register_blkdev()块设备注册函数注册设备;c)若需要I/O调度,应使用请求队列进行数据传输;d)应初始化gendisk通用块设备结构体,并对结构体的成员赋初值;e)应使用add_disk()设备添加函数激活该块设备。6.2.2.3驱动程序卸载块设备驱动程序的卸载主要包括以下内容:a)应使用de
24、l_gendisk()设备删除函数删除块设备,并使用put_disk()函数删除对块设备的引用;b)应使用blk_clean_queue()块设备队列清除函数清除请求队列,并释放请求队列所占用的资源;c)若在模块加载函数中使用了register_blkdev()块设备注册函数注册设备,则应调用unregister_blkdev()块设备注销函数注销设备并释放对设备的引用。6.3平台设备驱动程序6.3.1驱动程序框架平台设备驱动程序可分为平台控制器驱动和平台设备驱动两个部分,驱动框架见图3。7DB43/T22602021图3平台设备驱动程序子系统框架6.3.2开发要求6.3.2.1函数接口6.3
25、.2.1.1对外接口平台设备驱动程序提供给应用层的接口应使用标准接口,提供的接口应有说明以及用例。提供的对外接口应采用dev节点方式或sysfs节点方式。6.3.2.1.2电源管理接口平台设备驱动程序应提供设备的暂停、恢复流程和电源管理接口,以确保在系统休眠或待机时可以保存设备自身的寄存器的状态以及其他必要的上下文信息,以及确保系统恢复后设备能恢复到休眠或待机之前的状态。6.3.2.2驱动及设备注册平台设备驱动程序应满足总线设备驱动的平台设备驱动模型,设备应注册在总线上平台控制器驱动应注册成master主设备,控制器下设备驱动应注册成slave从设备,并使用master主设备提供的接口来完成收
26、发功能。驱动程序和设备注册时,应使用系统内核提供的接口完成注册,包括:a)总线注册控制器驱动的接口;b)平台控制器设备驱动注册成总线master主设备的接口;c)控制器下设备驱动注册成总线slave从设备的接口;d)slave从设备使用master主设备xfer的接口。6.3.2.3设备资源的描述和获取应使用标准的设备描述接口来描述和获取设备资源信息,包括物理地址中断号端口等其他可以描8DB43/T22602021述的信息。6.3.2.4驱动程序加载标准的驱动程序加载应包括以下内容:a)使用设备树或者acpitable匹配的加载方法;b)使用标准的总线设备函数接口模型;c)驱动程序应提供设备树
27、和acpitable匹配节点的方法。6.4网络设备驱动程序6.4.1驱动程序框架网络设备驱动程序框架分为网络协议接口层、网络设备接口层、提供实际功能的网络驱动接口层以及设备媒介层四层,见图4。图4网络设备驱动程序框架a)网络协议接口层:向网络层协议提供统一的数据包收发接口,使得上层协议独立于具体的设备;b)网络设备接口层:向网络协议接口层提供的用于描述具体网络设备属性和操作的net_device结构体,该结构体是设备驱动功能层各函数的容器;c)网络驱动接口层:实现网络设备接口层net_device结构体中所声明的成员函数,驱使网络设备硬件完成相应动作的程序;d)设备媒介层是完成数据包发送和接收
28、的物理实体,包括网络适配器和具体的传输媒介,根据设备驱动功能层中的函数在物理上驱动网络适配器等。6.4.2开发要求6.4.2.1函数接口网络设备驱动程序开发应根据net_device网络设备结构体中声明的成员函数实现设备驱动功能层的相关函数接口,并将net_device网络设备结构体注册到系统内核中。网络设备驱动程序接口应包含初始化接口,发送接口和接收接口。9DB43/T226020216.4.2.2网络设备管理6.4.2.2.1管理接口网络设备驱动程序开发应使用内核提供的接口来进行网络设备的管理,网络设备的管理应包含以下内容:a)分配及初始化网络设备net_device;b)以太网的初始化;
29、c)注册/注销网络设备net_device;d)开始/停止发送队列。6.4.2.2.2数据结构网络设备驱动程序开发应使用内核提供的结构体来描述网络设备及设备操作,应包括以下结构体:a)sk_buff结构体是网络驱动程序框架中信息的载体,是网络分层模型中对数据进行层层打包以及层层解包的载体;b)net_device网络设备结构体用来描述一个网络设备,是设备接口层的核心,也是编写网络驱动程序的核心对象;c)net_device_ops网络设备操作结构体定义了网络设备的操作方法集,其格式应符合附录D.2要求。6.4.2.3网络设备的中断处理网络设备的中断处理方式分为传统中断方式和NAPI处理方式两种
30、,在进行网络设备中断处理时,应根据实际业务特点和需要,按这两种方式之一进行中断处理。6.5显示帧缓存设备驱动程序6.5.1驱动程序框架显示帧缓存设备驱动程序框架见图5。图5显示帧缓存设备驱动程序框架10DB43/T22602021显示帧缓存设备驱动程序分为通用层和设备层两层:通用层代码为内核通用实现,在通用代码中会提供mmap、read、open、ioctl等通用函数接口,用户可以直接调用这些接口;设备层代码由驱动程序实现,应提供设备操作函数接口来实现对显卡设备的操作。6.5.2开发要求6.5.2.1函数接口显示帧缓存设备驱动程序应提供并实现显示帧缓存设备的操作函数接口,以供内核实现对显示帧缓
31、存设备的操作。应实现的显示帧缓存设备操作集结构体及应提供的设备操作函数接口格式应符合附录D.3。6.5.2.2驱动程序注册应通过以下两种方式进行驱动程序注册:a)PCI设备的驱动程序应通过pci_register_driverPCI设备驱动程序注册函数注册。b)非PCI设备的驱动程序应通过platform_driver_register平台设备驱动程序注册函数注册。6.5.2.3驱动程序加载显示帧缓存设备驱动程序在加载时,应允许通过模块参数控制其加载过程。在驱动开发时,可用的模块参数应使用MODULE_PARM_DESC宏来进行声明,并通过module_param_named函数来进行参数传递
32、。6.5.2.4probe探测函数显示帧缓存设备驱动程序的probe探测函数应包含以下操作:a)定义所需结构体指针;b)获取中断号,根据硬件手册规范,申请中断资源request_irq;c)获取映射I/O端口/内存资源:先调用request_mem_region函数取得I/O端口/内存资源,然后通过ioremap函数将I/O端口/内存资源映射到虚拟地址空间;d)初始化fb_info帧缓存信息结构体;e)申请并映射显存资源:PCI设备使用显存应通过pci_resource_start函数来申请显存;非PCI设备使用DMA内存应通过dma_alloc_writecombine函数来申请DMA内存,并根据平台特性决定是否启用cache;f)硬件寄存器初始化;g)调用fb_c