DB43/T 2260-2021 信息技术应用创新工程建设规范第 9 部分:驱动开发通用技术要求

DB43/T 2260-2021 Information Technology Application Innovation Engineering Construction Specification Part 9: Generic Technology Requirements for Driver Development

湖南省地方标准 简体中文 废止 页数:44页 | 格式:PDF

基本信息

标准号
DB43/T 2260-2021
标准类型
湖南省地方标准
标准状态
废止
中国标准分类号(CCS)
国际标准分类号(ICS)
发布日期
2021-12-29
实施日期
2022-03-29
发布单位/组织
湖南省市场监督管理局
归口单位
-
适用范围
-

研制信息

起草单位:
起草人:
出版信息:
页数:44页 | 字数:- | 开本: -

内容描述

ICS01.140.20

CCSL70

43

湖南省地方标准

DB43/T2260—2021

信息技术应用创新工程建设规范

第9部分:驱动开发通用技术要求

EngineeringspecificationfortheApplication

InnovationProjectofInformationTechnology

Part9:Generaltechnicalrequirementsofdriverdeveloping

2021-12-29发布2022-03-29实施

湖南省市场监督管理局发布

DB43/T2260—2021

目次

前言························································································································Ⅲ

引言························································································································Ⅴ

1范围·····················································································································1

2规范性引用文件······································································································1

3术语和定义············································································································1

4缩略语··················································································································2

5核内驱动总体要求···································································································2

5.1编程要求·········································································································2

5.2设备驱动模型···································································································3

5.3文件组织形式···································································································3

5.4驱动程序实现···································································································3

5.5第三方技术使用································································································4

6核内驱动具体要求···································································································5

6.1字符设备驱动程序·····························································································5

6.2块设备驱动程序································································································6

6.3平台设备驱动程序·····························································································7

6.4网络设备驱动程序·····························································································9

6.5显示帧缓存设备驱动程序··················································································10

6.6驱动程序的DKMS包制作···················································································12

6.7驱动程序的调试验证························································································13

7常用外设开发要求·································································································13

7.1打印机驱动开发······························································································13

7.2扫描仪驱动开发······························································································14

7.3手写液晶屏驱动开发························································································15

附录A(资料性)设备驱动分类·················································································16

附录B(资料性)驱动程序实现函数示例·····································································17

附录C(资料性)驱动程序可调用的内核函数接口·························································19

附录D(规范性)驱动程序相关的结构体·····································································21

附录E(资料性)DKMS技术说明及示例·······································································23

附录F(资料性)第三方内核模块打包········································································26

附录G(资料性)驱动程序的调试验证方法··································································32

附录H(资料性)打印机驱动库配置文件示例·······························································36

I

DB43/T2260—2021

II

DB43/T2260—2021

前言

本文件按照GB/T1.1—2020《标准化工作导则第1部分:标准化文件的结构和起草规则》的规

定起草。

请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。

《信息技术应用创新工程建设规范》分为以下几个部分:

——第1部分:台式微型计算机通用技术要求;

——第2部分:便携式微型计算机通用技术要求;

——第3部分:服务器通用技术要求;

——第4部分:操作系统通用技术要求;

——第5部分:操作系统硬件兼容性通用技术要求;

——第6部分:操作系统软件兼容性通用技术要求;

——第7部分:办公套件通用技术要求;

——第8部分:电子公文通用技术要求;

——第9部分:驱动开发通用技术要求;

——第10部分:应用开发通用技术要求;

——第11部分:迁移适配通用技术要求;

——第12部分:国产化信息系统建设质量管理规范;

——第13部分:国产化信息系统运行维护规范;

——第14部分:国产化信息系统建设验收规范;

——第15部分:云计算通用技术要求。

本部分为第9部分。

本部分由湖南省国家密码管理局提出。

本部分由湖南省工业和信息化厅归口。

本部分起草单位:银河麒麟软件(长沙)有限公司、中国人民解放军国防科技大学、飞腾信息技术有

限公司、湖南湘江鲲鹏信息科技有限责任公司、湖南中软信息系统有限公司、湖南长城科技信息有限公

司、湖南国科微电子股份有限公司、长沙景嘉微电子股份有限公司、鹏城实验室。

本部分主要起草人:张铎、吴庆波、孙立明、刘云、王琦、刘正元、王勇军、李唯实、王晓川、马

俊、齐璇、蔡威、张月、吕超、董昱、曹泽文、付志鹏。

III

DB43/T2260—2021

IV

DB43/T2260—2021

引言

湖南省为深入贯彻国家网络强国战略,全面落实中央有关文件精神,部署开展湖南省信息技术应用

创新工程建设,保障全省各级党政机关关键信息基础设施信息安全和信息系统安全可靠运行。针对自主

可控产品体系初具规模,但相关产品和工程实施标准规范还很缺乏的现状,为了规范工程建设,加速工

程进度,扩大建设结果,同时有力提升自主可控产业发展水平,确保信息安全,由湖南省国家密码管理

局作为业务主管单位、湖南省工业和信息化厅作为技术归口单位,由中国人民解放军国防科技大学、中

国电子信息产业集团有限公司等单位与湖南省合作制定了《信息技术应用创新工程建设规范》地方标准。

《信息技术应用创新工程建设规范》主要由自主可控核心产品、典型应用、工程管理等方面的规范

组成,重点解决应用创新工程建设当中产品选型、应用开发、工程实施等基础环节的实际问题,可为应

用创新工程的用户使用单位、集成建设单位和相关产品研制单位,在产品和应用规范化、软硬件兼容适

配、工程实施标准等方面提供一般性指引。

《信息技术应用创新工程建设规范》未来将根据自主可控产业和应用创新工程的发展变化进行相应

的必要调整和补充。

V

DB43/T2260—2021

VI

DB43/T2260—2021

信息技术应用创新工程建设规范

第9部分:驱动开发通用技术要求

1范围

本文件提出了国产操作系统驱动程序开发的编程要求、设备驱动模型、文件组织形式、驱动程序实

现、第三方技术使用等总体要求,并针对字符设备、块设备、平台设备、网络设备、显示帧缓存设备的

驱动程序框架和开发提出具体要求。

本文件适用于国产操作系统上第三方驱动程序的开发,也为第三方驱动程序的调试验证提供指导。

2规范性引用文件

下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文件,

仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于本

文件。

GB/T15272—1994程序设计语言C

3术语和定义

下列术语和定义适用于本文件。

3.1

驱动程序driver

驱动程序是硬件厂商根据操作系统编写的配置文件,操作系统通过驱动来与控制设备和进行通信。

3.2

设备device

是计算机系统中输入、输出设备(包括外存储器)的统称。设备对数据和信息起着传输、转送和存

储的作用。

3.3

总线bus

是计算机各种功能部件之间传送信息的公共通信干线。

3.4

设备驱动模型devicedrivermodel

设备驱动模型是操作系统内核为了管理硬件上的设备和对应的驱动程序所制定的一套软件体系。

3.5

平台总线platformbus

平台总线是操作系统内核定义的一种虚拟总线,操作系统内核通过平台总线来管理芯片内部集成设备。

3.6

平台设备驱动模型platformdevicedrivermodel

1

DB43/T2260—2021

平台设备驱动模型,即采用平台总线的方式对驱动程序和设备进行管理的设备驱动模型。

3.7

字符设备characterdevice

字符设备是不可寻址的,仅提供数据的流式访问的设备。

3.8

块设备blockdevice

块设备是以块为单位的、可以寻址的设备。块设备通常支持重定位操作,实现对数据的随机访问。

3.9

网络设备networkdevice

网络设备通过网络适配器和特定的网络协议来完成网络访问的设备。

3.10

版本魔术信息vermagicinformation

版本魔术信息是驱动程序内存储的、用来描述操作系统内核版本号以及基础内核配置的字符串。

3.11

导出符号exportsymbol

导出符号是操作系统内核模块导出的、可供其他模块中的函数使用的全局变量或者函数。

3.12

GNU编译器套件GNUCompilerCollection

GNU编译器套件是由GNU开发的编程语言编译器,它包括C、C++、Objective-C、Fortran、Java、

Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)

3.13

OPPS信息OPPSInformation

操作系统内核发生严重错误时所提示的信息,包括错误发生时的各个常用寄存器的值,调用的堆栈,

以及出错的可能原因。

4缩略语

下列缩略语适用于本文件:

ACPI:高级配置和电源管理接口(AdvancedConfigurationandPowerManagementInterface)

CPU:中央处理器(CentralProcessingUnit)

DKMS:动态内核模块支持(DynamicKernelModuleSupport)

GNU:开源标准(GNU’sNotUnix)

GPL:GNU通用公共许可证(GNUGeneralPublicLicense)

I/O:输入/输出(Input/Output)

NAPI:网络数据处理API(NewAPI)

PMU:性能监视单元(PerformanceMonitoringUnit)

5核内驱动总体要求

5.1编程要求

驱动程序代码应符合GB/T15272-1994和Linux内核编程的相关要求,并采用系统内核提供的代码

2

DB43/T2260—2021

检查脚本来检查驱动程序代码的合规性。

为了保证内核升级时其内部调用符号的可用性,驱动程序代码分为内核框架层和核心代码逻辑层,

其中内核框架层实现与内核对接的部分,而核心代码逻辑层实现驱动模块的核心功能,编写时应符合以

下原则:

a)不使用内核的API接口和数据结构;

b)不使用内核的框架代码;

c)不进行内核版本的判断处理;

d)不使用宏进行同架构内CPU的判断处理;

e)二进制文件只包含需要保护的代码。

5.2设备驱动模型

应基于设备驱动模型来进行驱动程序开发,设备驱动模型分类参见附录A,设备和驱动程序均应挂

载到总线上,并通过总线来实现对驱动程序和设备的管理。

5.3文件组织形式

应采用独立目录存放驱动程序的代码文件,驱动程序目录:

a)应包含Makefile驱动程序构建文件,用于驱动程序的自动化编译;

b)应使用.c源码文件来保存驱动程序实现,若驱动程序的功能复杂,通过多个源码文件来分类

存放驱动程序实现;

c)应使用.h头文件来声明驱动程序中的函数、数据结构和变量,应安装内核提供的linux/init.h、

linux/module.h和linux/kernel.h头文件,当需要调用内核功能时,驱动应使用上述头文件

中提供的函数接口来请求内核功能;

d)应使用Kconfig配置文件来描述驱动程序源码文件相关的内核配置菜单;

e)宜使用Readme说明文档来介绍驱动程序的功能和使用方法。

5.4驱动程序实现

5.4.1入口函数

驱动程序开发应定义和实现驱动程序的入口函数,驱动程序的入口函数应满足以下要求:

a)应使用__init初始化修饰符来修饰入口函数;

b)应完成驱动程序的注册和加载操作;

c)应调用内核提供的驱动程序总线注册函数来完成驱动程序的注册;

d)应通过具体的返回值来表示驱动程序是否加载成功,加载失败的返回值宜定义为负值,不同的

负值对应不同的错误原因;

e)应通过内核提供的module_init()模块初始化函数来声明驱动程序的入口函数。

驱动程序入口函数示例见附录B.1。

5.4.2出口函数

驱动程序开发应定义和实现驱动程序的出口函数,驱动程序的出口函数应满足以下要求:

a)应使用__exit退出修饰符来修饰出口函数;

b)应完成驱动的卸载操作;

c)应打印卸载相关信息,无需通过返回值来注明驱动程序的卸载是否成功;

d)应通过内核提供的module_exit()模块退出函数来声明驱动程序的出口函数。

3

DB43/T2260—2021

驱动程序出口函数示例见附录B.2。

5.4.3信息声明

驱动程序的加载代码中应包含驱动程序的信息声明,包括“模块许可协议”、“版本”、“作者”以及

“模块描述”等信息,信息声明示例见附录B.3。

5.4.4remove卸载函数

驱动程序应实现remove卸载函数,在remove卸载函数中实现对驱动程序申请的设备、内存以及

sys文件系统节点等资源的释放。卸载程序中的资源释放示例见附录B.4。

若驱动程序中注册了回调函数,则remove卸载函数中应包含注销回调函数的操作。

5.4.5核心数据结构的可扩展性

应通过以下方式来实现驱动程序核心数据的可扩展性:

a)在数据结构中添加reserved保留字段;

b)在数据结构中添加表示私有数据的指针,扩展时只需要修改该指针所指向的数据结构,而

无需修改核心数据结构。核心数据结构的可扩展性实现示例见附录B.5。

5.4.6probe探测函数

驱动程序应实现probe探测函数,用于完成设备驱动程序注册的最后收尾工作。

在probe探测函数中进行硬件资源的获取、内存结构的映射以及设备的创建等操作时,应通过内核

提供的内核操作函数接口进行,涉及的内核操作函数接口见附录C。

5.4.7用户空间内存访问

若驱动程序需访问用户空间内存,应在访问前先使用access_ok检验函数来检查用户空间内存指针

的有效性。

5.4.8调试统计变量

驱动程序开发时应添加必要的调试统计变量,以便于对驱动程序的调试测试。

调试统计变量宜实现分级开关,以提供各种粒度的调试测试选项。

5.4.9导出符号规范

驱动程序应使用内核提供的EXPORT_SYMBOL_GPL宏或EXPORT_SYMBOL宏来导出符号。

EXPORT_SYMBOL_GPL宏导出的符号适用于包含GPL许可的模块,EXPORT_SYMBOL宏导出的符号适用于任

何模块。

示例:驱动导出符号的两种方式

EXPORT_SYMBOL(func1);

EXPORT_SYMBOL_GPL(func2);

5.5第三方技术使用

驱动程序开发若涉及对第三方技术的使用,应在驱动程序正式开发前对所涉及的第三方技术进行效

率、兼容性、稳定性等方面的测试,确保第三方技术的使用不会对驱动程序的功能、性能造成不良影响。

4

DB43/T2260—2021

6核内驱动具体要求

6.1字符设备驱动程序

6.1.1驱动程序框架

字符设备驱动程序框架见图1。

图1字符设备驱动程序框架

字符设备驱动包括以下部分:

a)设备文件操作函数接口:字符设备驱动通过file_operation结构体函数集向用户空间提供设

备文件操作函数接口。file_operation结构体中的函数集用于实现驱动与/dev下的字符设备

节点联通,当用户空间的应用程序通过调用文件操作函数open(打开)、write(写)、read(读)、

close(关闭)对/dev目录下字符设备节点进行操作时,会通过file_operation结构体中的

对应函数来通知驱动实现对字符设备的对应操作。

b)内核空间的字符设备驱动程序。驱动程序直接与字符设备硬件打交道,负责实现设备注册、设

备操作等硬件操作功能。

6.1.2开发要求

函数接口

为实现系统/dev下的字符设备节点与驱动程序的联通,字符设备驱动程序应提供并实现与llseek、

read、write、open、close等文件操作函数接口所对应的函数实现,并通过file_operations文件操

作结构体将文件操作函数与驱动程序内的函数实现相关联。

file_operations文件操作结构体格式应符合附录D.1要求。

驱动程序注册

字符设备驱动程序应基于平台驱动模型注册,包含以下内容:

5

DB43/T2260—2021

a)应提前准备好驱动程序对应的主设备号,主设备号应使用内核已注册的主设备号之外的数值;

b)应使用平台驱动结构platform_driver封装驱动程序信息;

c)应使用平台驱动程序注册函数platform_driver_register(drv)将驱动程序注册到平台总线的

驱动程序链表中。

字符设备注册

字符设备的注册应包含如下内容:

a)预生成一个尚未被申请使用的设备号;

b)预生成设备号的主设备号为对应的驱动程序的主设备号,从设备号应从0开始,宜根据驱动程

序所匹配的设备数量按序取值,最大取值不超过1048575;

c)应使用静态申请方式申请设备号;

d)应对cdev结构体进行初始化,并将实现的file_operations函数结构体与cdev关联;

e)针对注册的字符设备,应使用内核提供的函数组创建对应sys文件系统节点,且需对返回值做

错误处理,若有多个从设备,应创建class类。

驱动匹配

字符设备驱动程序开发应同时通过设备树和ACPI两种方式来封装设备信息,并将封装后的信息分

别添加到“驱动-设备”匹配队列中。

6.2块设备驱动程序

6.2.1驱动程序框架

块设备驱动程序框架分为三个层次,见图2。

图2块设备驱动程序框架

a)通用块层:为各种类型的块设备建立一个统一的模型,接受上层发出的数据读写请求,并最终

发出I/O请求。通用块层隐藏了底层硬件块设备的特性,为块设备提供了一个通用的抽象视图;

6

DB43/T2260—2021

b)输入输出调度层:接收通用块层发出的I/O请求,缓存请求并合并相邻的请求,根据设置好

的调度算法,回调驱动层提供的请求处理函数,以处理具体的I/O请求;

c)块设备驱动层:处理集体I/O请求,处理过程根据块设备类型的不同而有所不同。

块设备驱动程序的一般处理流程应为:上层调用通用块层提供的接口提交I/O请求,这些请求首先

被放入输入输出调度层的I/O调度队列,经过合并和排序,最终将转换后的I/O请求派发到具体块设备

驱动准备的等待队列,由块设备驱动进一步处理。

6.2.2开发要求

函数接口

块设备驱动程序的函数接口应符合以下要求:

a)虚拟块设备的驱动程序可以不提供probe探测函数接口;

b)若块设备驱动程序中需要对I/O请求进行特殊处理,则应提供并实现I/O处理函数;

示例:I/O处理函数接口

staticblk_qc_txxx_make_request(structrequest_queue*q,structbio*bio);

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);/*Open接口*/

void(*release)(structgendisk*,fmode_t);/*Close接口*/

驱动程序加载

块设备驱动程序的加载主要包括以下内容:

a)应使用alloc_disk()块设备分配函数分配gendisk通用块设备结构体;

b)可以通过内核提供的register_blkdev()块设备注册函数注册设备;

c)若需要I/O调度,应使用请求队列进行数据传输;

d)应初始化gendisk通用块设备结构体,并对结构体的成员赋初值;

e)应使用add_disk()设备添加函数激活该块设备。

驱动程序卸载

块设备驱动程序的卸载主要包括以下内容:

a)应使用del_gendisk()设备删除函数删除块设备,并使用put_disk()函数删除对块设备的引用;

b)应使用blk_clean_queue()块设备队列清除函数清除请求队列,并释放请求队列所占用的资源;

c)若在模块加载函数中使用了register_blkdev()块设备注册函数注册设备,则应调用unregister_

blkdev()块设备注销函数注销设备并释放对设备的引用。

6.3平台设备驱动程序

6.3.1驱动程序框架

平台设备驱动程序可分为平台控制器驱动和平台设备驱动两个部分,驱动框架见图3。

7

DB43/T2260—2021

图3平台设备驱动程序子系统框架

6.3.2开发要求

函数接口

.1对外接口

平台设备驱动程序提供给应用层的接口应使用标准接口,提供的接口应有说明以及用例。

提供的对外接口应采用dev节点方式或sysfs节点方式。

.2电源管理接口

平台设备驱动程序应提供设备的暂停、恢复流程和电源管理接口,以确保在系统休眠或待机时可以

保存设备自身的寄存器的状态以及其他必要的上下文信息,以及确保系统恢复后设备能恢复到休眠或待

机之前的状态。

驱动及设备注册

平台设备驱动程序应满足总线\设备\驱动的平台设备驱动模型,设备应注册在总线上.平台控制器

驱动应注册成master主设备,控制器下设备驱动应注册成slave从设备,并使用master主设备提供的

接口来完成收发功能。

驱动程序和设备注册时,应使用系统内核提供的接口完成注册,包括:

a)总线注册控制器驱动的接口;

b)平台控制器设备驱动注册成总线master主设备的接口;

c)控制器下设备驱动注册成总线slave从设备的接口;

d)slave从设备使用master主设备xfer的接口。

设备资源的描述和获取

应使用标准的设备描述接口来描述和获取设备资源信息,包括物理地址\中断号\端口等其他可以描

8

DB43/T2260—2021

述的信息。

驱动程序加载

标准的驱动程序加载应包括以下内容:

a)使用设备树或者acpitable匹配的加载方法;

b)使用标准的总线设备函数接口模型;

c)驱动程序应提供设备树和acpitable匹配节点的方法。

6.4网络设备驱动程序

6.4.1驱动程序框架

网络设备驱动程序框架分为网络协议接口层、网络设备接口层、提供实际功能的网络驱动接口层以

及设备媒介层四层,见图4。

图4网络设备驱动程序框架

a)网络协议接口层:向网络层协议提供统一的数据包收发接口,使得上层协议独立于具体的设备;

b)网络设备接口层:向网络协议接口层提供的用于描述具体网络设备属性和操作的net_device

结构体,该结构体是设备驱动功能层各函数的容器;

c)网络驱动接口层:实现网络设备接口层net_device结构体中所声明的成员函数,驱使网络设

备硬件完成相应动作的程序;

d)设备媒介层是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介,根据设

备驱动功能层中的函数在物理上驱动网络适配器等。

6.4.2开发要求

函数接口

网络设备驱动程序开发应根据net_device网络设备结构体中声明的成员函数实现设备驱动功能层

的相关函数接口,并将net_device网络设备结构体注册到系统内核中。

网络设备驱动程序接口应包含初始化接口,发送接口和接收接口。

9

DB43/T2260—2021

网络设备管理

.1管理接口

网络设备驱动程序开发应使用内核提供的接口来进行网络设备的管理,网络设备的管理应包含以下内容:

a)分配及初始化网络设备net_device;

b)以太网的初始化;

c)注册/注销网络设备net_device;

d)开始/停止发送队列。

.2数据结构

网络设备驱动程序开发应使用内核提供的结构体来描述网络设备及设备操作,应包括以下结构体:

a)sk_buff结构体是网络驱动程序框架中信息的载体,是网络分层模型中对数据进行层层打包

以及层层解包的载体;

b)net_device网络设备结构体用来描述一个网络设备,是设备接口层的核心,也是编写网络驱

动程序的核心对象;

c)net_device_ops网络设备操作结构体定义了网络设备的操作方法集,其格式应符合附录D.2

要求。

网络设备的中断处理

网络设备的中断处理方式分为传统中断方式和NAPI处理方式两种,在进行网络设备中断处理时,

应根据实际业务特点和需要,按这两种方式之一进行中断处理。

6.5显示帧缓存设备驱动程序

6.5.1驱动程序框架

显示帧缓存设备驱动程序框架见图5。

图5显示帧缓存设备驱动程序框架

10

DB43/T2260—2021

显示帧缓存设备驱动程序分为通用层和设备层两层:通用层代码为内核通用实现,在通用代码中会

提供mmap、read、open、ioctl等通用函数接口,用户可以直接调用这些接口;设备层代码由驱动程序

实现,应提供设备操作函数接口来实现对显卡设备的操作。

6.5.2开发要求

函数接口

显示帧缓存设备驱动程序应提供并实现显示帧缓存设备的操作函数接口,以供内核实现对显示帧缓

存设备的操作。应实现的显示帧缓存设备操作集结构体及应提供的设备操作函数接口格式应符合附录

D.3。

驱动程序注册

应通过以下两种方式进行驱动程序注册:

a)PCI设备的驱动程序应通过pci_register_driverPCI设备驱动程序注册函数注册。

b)非PCI设备的驱动程序应通过platform_driver_register平台设备驱动程序注册函数注册。

驱动程序加载

显示帧缓存设备驱动程序在加载时,应允许通过模块参数控制其加载过程。

在驱动开发时,可用的模块参数应使用MODULE_PARM_DESC宏来进行声明,并通过

mo

定制服务

    相似标准推荐

    更多>