




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
15册合订本——第1部分:台式微型计算机通用技术要求;——第2部分:便携式微型计算机通用技术要求;——第3部分:服务器通用技术要求;——第4部分:操作系统通用技术要求;567891011——第12部分:国产化信息系统建设质量管理规范;1314——第15部分:云计算通用技术要求。 信息技术应用创新工程建设规范第9部分:驱动开发通用技术要求目 次前言 Ⅲ引言 Ⅴ围 1范引文件 1语定义 1略语 2内动体求 2编要求 2设驱模型 3文组形式 3驱程实现 3第方术用 4内动体求 5字设驱程序 5块备动序 6平设驱程序 7网设驱程序 9显帧存备程序 10驱程的DKMS制作 12驱程的试证 13用设发求 13打机动发 13扫仪动发 14手液屏动发 15附录A(料)设驱动类 16附录B(料)驱程序现数例 17附录C(料)驱程序调的核数口 19附录D(范)驱程序关结体 21附录E(料)DKMS技术明示例 23附录F(料)第方内模打包 26附录G(料)驱程序调验方法 32附录H(料)打机驱库置件例 36I前 言GB/T1.1—20201请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。《信息技术应用创新工程建设规范》分为以下几个部分:——第1部分:台式微型计算机通用技术要求;——第2部分:便携式微型计算机通用技术要求;——第3部分:服务器通用技术要求;——第4部分:操作系统通用技术要求;567891011——第12部分:国产化信息系统建设质量管理规范;1314——第15部分:云计算通用技术要求。本部分为第9部分。IIIPAGEPAGE11PAGEPAGE10信息技术应用创新工程建设规范9本文件适用于国产操作系统上第三方驱动程序的开发,也为第三方驱动程序的调试验证提供指导。(GB/T15272—1994程序设计语言C下列术语和定义适用于本文件。3.1驱动程序driver驱动程序是硬件厂商根据操作系统编写的配置文件,操作系统通过驱动来与控制设备和进行通信。3.2设备device是计算机系统中输入、输出设备(包括外存储器)的统称。设备对数据和信息起着传输、转送和存储的作用。3.3总线bus是计算机各种功能部件之间传送信息的公共通信干线。3.4设备驱动模型devicedrivermodel设备驱动模型是操作系统内核为了管理硬件上的设备和对应的驱动程序所制定的一套软件体系。3.5平台总线platformbus3.6平台设备驱动模型platformdevicedrivermodel平台设备驱动模型,即采用平台总线的方式对驱动程序和设备进行管理的设备驱动模型。3.7字符设备characterdevice字符设备是不可寻址的,仅提供数据的流式访问的设备。3.8块设备blockdevice块设备是以块为单位的、可以寻址的设备。块设备通常支持重定位操作,实现对数据的随机访问。3.9网络设备networkdevice网络设备通过网络适配器和特定的网络协议来完成网络访问的设备。3.10版本魔术信息vermagicinformation版本魔术信息是驱动程序内存储的、用来描述操作系统内核版本号以及基础内核配置的字符串。3.11导出符号exportsymbol导出符号是操作系统内核模块导出的、可供其他模块中的函数使用的全局变量或者函数。3.12GNU编译器套件GNUCompilerCollectionGNUGNUCCObjective-CFortranJava、AdaGolibstdc++,libgcj)3.13OPPS信息OPPSInformation下列缩略语适用于本文件:ACPI:高级配置和电源管理接口(AdvancedConfigurationandPowerManagementInterface)CPU:中央处理器(CentralProcessingUnit)DKMS:动态内核模块支持(DynamicKernelModuleSupport)GNU:开源标准(GNU’sNotUnix)GPL:GNU通用公共许可证(GNUGeneralPublicLicense)I/O:输入/输出(Input/Output)NAPI:网络数据处理API(NewAPI)PMU:性能监视单元(PerformanceMonitoringUnit)GB/T15272-1994Linux检查脚本来检查驱动程序代码的合规性。a)不使用内核的API接口和数据结构;b)不使用内核的框架代码;CPUe)应采用独立目录存放驱动程序的代码文件,驱动程序目录:Makefileclinux/init.h、linux/module.hlinux/kernel.hKconfigReadme驱动程序开发应定义和实现驱动程序的入口函数,驱动程序的入口函数应满足以下要求:a)应使用init初始化修饰符来修饰入口函数;应通过内核提供的module_initB.1。驱动程序开发应定义和实现驱动程序的出口函数,驱动程序的出口函数应满足以下要求:a)应使用exit退出修饰符来修饰出口函数;应通过内核提供的module_exit驱动程序出口函数示例见附录B.2。B.3。removeremoveremoveB.4。若驱动程序中注册了回调函数,则remove卸载函数中应包含注销回调函数的操作。应通过以下方式来实现驱动程序核心数据的可扩展性:a)在数据结构中添加reserved保留字段;b)在数据结构中添加表示私有数据的指针,扩展时只需要修改该指针所指向的数据结构,而无需修改核心数据结构。核心数据结构的可扩展性实现示例见附录B.5。probe驱动程序应实现probe探测函数,用于完成设备驱动程序注册的最后收尾工作。probe。access_ok驱动程序开发时应添加必要的调试统计变量,以便于对驱动程序的调试测试。调试统计变量宜实现分级开关,以提供各种粒度的调试测试选项。驱动程序应使用内核提供的EXPORT_SYMBOL_GPL宏或EXPORT_SYMBOL宏来导出符号。EXPORT_SYMBOL_GPL宏导出的符号适用于包含GPL许可的模块,EXPORT_SYMBOL宏导出的符号适用于任何模块。示例:驱动导出符号的两种方式EXPORT_SYMBOL(func1);EXPORT_SYMBOL_GPL(func2);EXPORT_SYMBOL(func1);EXPORT_SYMBOL_GPL(func2);1。图1字符设备驱动程序框架字符设备驱动包括以下部分:file_operationfile_operation/dev写、close(对/devfile_operation/devllseek、readwrite、open、closefile_operationsfile_operations文件操作结构体格式应符合附录D.1要求。字符设备驱动程序应基于平台驱动模型注册,包含以下内容:a)应提前准备好驱动程序对应的主设备号,主设备号应使用内核已注册的主设备号之外的数值;b)应使用平台驱动结构platform_driver封装驱动程序信息;c)platform_driver_register(drv字符设备的注册应包含如下内容:01048575;cdevfile_operationscdevsysclassACPI块设备驱动程序框架分为三个层次,见图2。图2块设备驱动程序框架I/OI/OI/OI/OI/OI/OI/O块设备驱动程序的函数接口应符合以下要求:probeI/OI/O示例:I/O处理函数接口staticblk_qc_txxx_make_request(structrequest_queue*q,structbio*bio);staticblk_qc_txxx_make_request(structrequest_queue*q,structbio*bio);I/O示例:中断处理函数接口staticirqreturn_tgdrom_command_interrupt(intirq,void*dev_id);staticirqreturn_tgdrom_command_interrupt(intirq,void*dev_id);ioctl、openclose示例:设备操作函数接口int(*ioctl)(structblock_device*,fmode_t,unsigned,unsignedlong);int(*ioctl)(structblock_device*,fmode_t,unsigned,unsignedlong);/*Ioctl接口*/int(*open)(structblock_device*,fmode_t); /*Open*/void(*release)(structgendisk*,fmode_t); /*Close*/块设备驱动程序的加载主要包括以下内容:a)alloc_diskgendiskregister_blkdev(I/Od)gendiskadd_disk(块设备驱动程序的卸载主要包括以下内容:del_gendisk应使用blkdev()块设备注销函数注销设备并释放对设备的引用。平台设备驱动程序可分为平台控制器驱动和平台设备驱动两个部分,驱动框架见图3。图3平台设备驱动程序子系统框架平台设备驱动程序提供给应用层的接口应使用标准接口,提供的接口应有说明以及用例。提供的对外接口应采用dev节点方式或sysfs节点方式。设备masterslavemaster驱动程序和设备注册时,应使用系统内核提供的接口完成注册,包括:a)总线注册控制器驱动的接口;masterslaveslavemasterxfer应使用标准的设备描述接口来描述和获取设备资源信息,包括物理地址\中断号\端口等其他可以描述的信息。标准的驱动程序加载应包括以下内容:a)acpitablec)驱动程序应提供设备树和acpitable匹配节点的方法。4。图4网络设备驱动程序框架a)net_device结构体,该结构体是设备驱动功能层各函数的容器;net_devicenet_devicenet_device网络设备驱动程序接口应包含初始化接口,发送接口和接收接口。net_device;注销网络设备d)网络设备驱动程序开发应使用内核提供的结构体来描述网络设备及设备操作,应包括以下结构体:a)sk_buff结构体是网络驱动程序框架中信息的载体,是网络分层模型中对数据进行层层打包以及层层解包的载体;net_devicenet_device_opsD.2要求。NAPI显示帧缓存设备驱动程序框架见图5。图5显示帧缓存设备驱动程序框架mmapreadopenioctl应通过以下两种方式进行驱动程序注册:PCIpci_register_driverPCIPCIplatform_driver_register显示帧缓存设备驱动程序在加载时,应允许通过模块参数控制其加载过程。在驱动开发时,可用的模块参数应使用MODULE_PARM_DESC宏来进行声明,并通过module_param_named函数来进行参数传递。probeproberequest_irq;I/O/request_mem_regionI/O/ioremapI/O/fb_infopci_resource_startPCIDMAdma_alloc_writecombineDMAcache;fb_check_varvarframebufferi)创建硬件相关sys系统文件、节点等。removeremoveframebufferb)关闭硬件设备;c)解除显存映射;d)释放显存、中断、释放fb_info结构体内存以及I/O端口/内存资源。DKMSDKMSDKMSb)第三方驱动程序的核心代码可以闭源,但应保证生成的二进制模块的兼容性;c)宜通过包创建工具自动生成编译DKMS软件包所需的控制和配置文件;d)根据是否闭源,打包后的DKMS包应遵循如下命名规则:开源模块命名为:原始模块名-dkms_版本号_CPU架构.软件包格式;闭源模块命名为:原始模块名-dkms-closed_版本号_CPU架构.软件包格式。readl/writel/printkAPICPU应使用如下方法进行核心源码的二进制封装:oxxdoo.hexoko.oxxd.o.hexomakeko.oobjsDKMSDKMSE。DKMSsrc/Makefiled)应通过“dpkg-buildpackage-sa”命令来进行驱动程序DKMS包的编译。printkOOPSFTraceperf。1。表1打印机开发环境组件序号组件名称组件描述组件参考版本号1libcups2-dev通用UNIX打印系统cups开发库2.2.22libcupsimage2-dev通用UNIX打印系统cups图像开发库2.2.23libqt4-devQt4开发文件,用于打印驱动UI可视化交互开发4.8.74libcupsfilters-dev用于打印驱动软件开发,包含使用libcupsfilters开发驱动程序的头文件1.13.45qt4-qmake用于打印驱动软件Qt4编译4.8.76libusb-1.0.0-dev用于打印驱动与USB设备通信开发1.0.207libjpeg-dev用于打印驱动对图片进行压缩和解压8c-28libnotify4用于在操作系统下提示打印机状态信息0.7.6-29autoconf用于对开源模块源码生成自动配置编译文件2.69-610gcc/g++用于打印驱动程序源代码GNUC/C++编译4:5.3.111qt5-qmake用于打印驱动软件Qt5编译5.6.12。表2打印机运行环境组件序号组件名称组件描述组件参考版本号1CUPS打印服务系统,打印驱动运行在该系统上2.2.22Qt4为使用Qt开发的程序提供运行时环境4.8.73Qt5为使用Qt开发的程序提供运行时环境5.6.14system-config-printer提供打印机设备管理、任务管理等功能1.5.7表2打印机运行环境组件(续)序号组件名称组件描述组件参考版本号5libjpeg提供图片压缩和解压功能8c-26dbus打印驱动程序可通过该库使用D-Bus进程间通信功能1.10.6配置文件应遵循以下要求:/etc/kylin-printer/.confprinter-xxx.conf;/usr/lib/kylin-printer/下建立以厂商名命名的目录,将其驱动库放置于其中。具体的配置格式实例见附录H。。表3扫描仪开发环境组件序号组件名称组件描述组件参考版本号1libsane-dev用于扫描仪驱动开发1.0.25+201505282libusb-1.0.0-dev用于扫描仪驱动与USB设备通信开发1.0.203libjpeg-dev用于扫描仪驱动对图片进行压缩和解压8c-24autoconf用于对开源模块源码生成自动配置编译文件2.69-65gcc/g++用于扫描仪驱动程序源代码编译4:5.3.16git用于扫描仪驱动源代码库管理1:2.7.47pkg-config用于获得系统库/模块的所有编译相关的信息,供扫描仪驱动开发参考和引用0.29.1驱动,减少扫描仪驱动在不同操作系统版本上多次适配。扫描仪运行环境组件列表见表4。表4扫描仪运行环境组件序号组件名称组件描述组件版本号1libsane通用扫描仪接口1.0.25+201505282libsane-common通用扫描仪接口1.0.25+201505283libusb-1.0.0用于扫描仪驱动与USB设备通信开发1.0.20。表5手写液晶屏开发环境组件序号组件名称组件描述组件参考版本号1libqt4-devQt4用于手写液晶屏驱动软件开发4.8.72qt4-qmakeQt4用于手写液晶屏驱动软件编译4.8.73libusb-1.0.0-dev用于手写液晶屏驱动与USB设备通信开发1.0.204autoconf用于对开源模块源码生成自动配置编译文件2.69-65gcc/g++用于手写液晶屏驱动程序源代码编译4:5.3.16git用于手写液晶屏驱动源代码库管理1:2.7.47pkg-config用于获得系统库/模块的所有编译相关的信息,供打印驱动开发参考和引用0.29.18openssl用于手写液晶屏驱动软件开发1.0.2g-19libqt5-devQt5用于手写液晶屏驱动软件编译5.6.110qt5-qmakeQt5用于手写液晶屏驱动软件编译5.6.16。表6手写液晶屏运行环境组件序号组件名称组件描述组件参考版本号1Qt4Qt4提供手写液晶屏设备管理、任务管理等功能4.8.72Qt5Qt5提供手写液晶屏设备管理、任务管理等功能5.6.1附录A()表A.1规定了设备驱动程序的类型和对应的常见设备。表A.1设备驱动分类设备驱动类型对应的常见设备字符设备驱动鼠标、键盘、触摸屏、摄像头、LED设备、声卡、打印机、IIC、SPI等块设备驱动硬盘、磁盘、U盘、SD卡等平台设备驱动I2C、IIS、RTC、看门狗等网络设备驱动有线网卡、无线网卡、Bridge等显示帧缓存设备驱动显存抽象后的一种设备附录B(资料性)驱动程序实现函数示例1驱动程序的入口函数的示例如下:staticintstaticintinitfunc_init(void){printk(“hellomodule!\n”);********编写驱动程序需要实现的基础功能*****pci_register_driver(&driver);//在pci总线上注册驱动return0;//0:加载成功!非0:加载失败!}module_init(func_init);//声明入口函数2驱动程序的出口函数的示例如下:staticvoidstaticvoidexitfunc_exit(void){***********关闭驱动程序初始化时占用的资源***********printk(“byebye%s!\n”,“module”);}module_exit(func_exit);//声明出口函数3驱动程序的信息声明的示例如下:MODULE_LICENSE("GPL");MODULE_VERSION("版本");//可选MODULE_AUTHOR("作者");//可选MODULE_LICENSE("GPL");MODULE_VERSION("版本");//可选MODULE_AUTHOR("作者");//可选MODULE_DESCRIPTION("对模块的描述");//可选4驱动卸载函数中的资源释放的示例如下:/*内存资源的释放*//*内存资源的释放*/for(i=0;i<MEMDEV_NR_DEVS;i++)kfree(mem_devp[i].data);kfree(mem_devp);cdev_del(&cdev); //注销字符设备unregister_chrdev_region(MKDEV(mem_major,0),MEMDEV_NR_DEVS);//释放设备号/*删除sys文件系统对应的字符设备节点*/for(i=0;i<MEMDEV_NR_DEVS;i++)device_destroy(class_memdev,MKDEV(mem_major,i));class_destroy(class_memdev);5实现核心数据结构的可扩展性的示例如下:structsimple{structsimple{***********核心数据***********/*指向私有数据的指针*//*扩展时只需要修改该指针所指向的数据结构,而无需修改核心数据结构*/void*private_data;}附录C(资料性)驱动程序可调用的内核函数接口表C.1规定了驱动程序可调用的内核函数接口。表C.1驱动程序中可调用的内核函数接口内核函数接口函数说明MKDEV(ma,mi)intregister_chrdev_region(dev_tfrom,unsignedcount,constchar*name);设备号申请函数voidcdev_init(structcdev*cdev,conststructfile_operations*fops);cdev结构初始化函数intcdev_add(structcdev*p,dev_tdev,unsignedcount);将cdev加入cdev设备组class_create(owner,name)注册sys设备类structdevice*device_create(structclass*class,structdevice*parent,dev_tdevt,void*drvdata,constchar*fmt,...);注册sys设备(组)staticinlinebooldevice_property_read_bool(structdevice*dev,constchar*propname);staticinlineintdevice_property_read_u8(structdevice*dev,constchar*propname,u8*val);staticinlineintdevice_property_read_u16(structdevice*dev,constchar*propname,u16*val);staticinlineintdevice_property_read_u32(structdevice*dev,constchar*propname,u32*val);staticinlineintdevice_property_read_u64(structdevice*dev,constchar*propname,u64*val);从ACPIDSDT表或设备树中获取设备属性voidiomem*devm_ioremap(structdevice*dev,resource_size_toffset,resource_size_tsize);voidiomem*devm_ioremap_nocache(structdevice*dev,resource_size_toffset,resource_size_tsize);voidiomem*devm_ioremap_wc(structdevice*dev,resource_size_toffset,resource_size_tsize);获取iomem资源voiddevm_iounmap(structdevice*dev,voidiomem*addr);voiddevm_ioremap_release(structdevice*dev,void*res);释放iomem资源structresource*platform_get_resource(structplatform_device*,unsignedint,unsignedint);硬件地址资源的获取intplatform_get_irq(structplatform_device*dev,unsignedintnum);硬件中断资源的获取voidiomem*devm_ioremap_resource(structdevice*dev,structresource*res);ioremap(addr,size);iounmap(voidiomem*);地址资源映射函数staticinlinestructclk*devm_clk_get(structdevice*dev,constchar*id);staticinlinestructclk*clk_get(structdevice*dev,constchar*id);时钟资源获取staticinlineintclk_prepare_enable(structclk*clk);时钟使能staticinlinevoidclk_disable_unprepare(structclk*clk);时钟失效staticinlineunsignedlongclk_get_rate(structclk*clk);获取时钟频率staticinlineintclk_set_rate(structclk*clk,unsignedlongrate);设置时钟频率表C.1驱动程序中可调用的内核函数接口(续)内核函数接口函数说明staticinlinelongmust_checkPTR_ERR(forceconstvoid*ptr);staticinlineboolmust_checkIS_ERR(forceconstvoid*ptr);错误处理相关structnet_device*alloc_etherdev(intsizeof_priv);structnet_device*alloc_netdev(intsizeof_priv,constchar*name,unsignedcharname_assign_type,void(*setup)(structnet_device*));分配及初始化net_device对象voidfree_netdev(structnet_device*dev);释放net_device对象voidether_setup(structnet_device*dev);以太网的初始化intregister_netdev(structnet_device*dev);注册net_device的接口voidunregister_netdev(structnet_device*dev);注销net_device的接口voidnetif_start_queue(structnet_device*dev);开启网络发送队列voidnetif_stop_queue(structnet_device*dev);停止网络发送队列附录D(规范性)驱动程序相关的结构体字符设备驱动程序中的文件操作结构体的格式如下:/*文件操作结构体,声明了文件操作函数接口与驱动内的函数实现的关联,xx为对应驱动名称。*/staticconststructfile_operationsft_xx_fops={/*文件操作结构体,声明了文件操作函数接口与驱动内的函数实现的关联,xx为对应驱动名称。*/staticconststructfile_operationsft_xx_fops={.owner=THIS_MODULE,.llseek=ft_xx_llseek,.read=ft_xx_read,.write=ft_xx_write,.open=ft_xx_open,.release=ft_xx_release,.mmap=ft_xx_mmap,};网络设备驱动程序中的网络设备操作结构体的格式如下:structnet_device_ops{structnet_device_ops{int(*ndo_init)(structnet_device*dev);void*ndo_uninit)(structnet_device*dev);/*I/OIRQ、DMAint(*ndo_open)(structnet_device*dev);/*停止网络接口设备,与open()函数的作用相反*/int(*ndo_stop)(structnet_device*dev);/*启动数据包的发送*/netdev_tx_t(*ndo_start_xmit)(structsk_buff*skb,structnet_device*dev);void(*ndo_change_rx_flags)(structnet_device*dev,intflags);void(*ndo_set_rx_mode)(structnet_device*dev);/*设置设备的MAC地址*/int(*ndo_set_mac_address)(structnet_device*dev,void*addr);int(*ndo_validate_addr)(structnet_device*dev);/*进行设备特定的I/O控制*/int(*ndo_do_ioctl)(structnet_device*dev,structifreq*ifr,intcmd);/*配置接口,也可用于改变设备的I/O地址和中断号*/int(*ndo_set_config)(structnet_device*dev,structifmap*map);int(*ndo_change_mtu)(structnet_device*dev,intnew_mtu);int(*ndo_neigh_setup)(structnet_device*dev,structneigh_parms*);/*超时时重新启动数据包发送过程或重新启动硬件等措施来恢复网络设备到正常状态*/void(*ndo_tx_timeout)(structnet_device*dev);};显示帧缓存设备驱动程序中的显示帧缓存设备操作集结构体的格式如下:/*显示帧缓存设备操作结构体,xx为对应驱动名称*/staticstructfb_opsxxx_ops={/*显示帧缓存设备操作结构体,xx为对应驱动名称*/staticstructfb_opsxxx_ops={.owner =THIS_MODULE,.fb_check_var =s3c2410fb_check_var,.fb_set_par =s3c2410fb_set_par,.fb_blank =s3c2410fb_blank,.fb_setcolreg =s3c2410fb_setcolreg,.fb_fillrect =cfb_fillrect,.fb_copyarea =cfb_copyarea,.fb_imageblit =cfb_imageblit,};在各个接口函数中,显示帧缓存设备驱动程序应实现如下功能:a)fb_check_var函数varxresyresBPPR、GBb)fb_set_parvar->bits_per_pixelc)fb_pan_display、y、yd)fb_setcolreginfo->fix.visualblank/g)fb_copyareah)fb_imageblit附录E(资料性)DKMS技术说明及示例安装DKMS使用如下命令安装:[kylin@Kylin~]$sudoapt-getinstalldkms[kylin@Kylin~]$sudoapt-getinstalldkms注意:DKMS需要内核头文件。如果对应内核的头文件不存在,DKMS无法动态编译模块。<module>-<module-version1.“/ur/s/cp21x-1DKMSPACKAGE_NAME="cp210x"PACKAGE_VERSION="1.0"CLEAN="makeclean"MAKE[0]="makeallKVERSION=$kernelver"BUILT_MODULE_NAME[0]="cp210x"DEST_MODULE_LOCATION[0]="/updates"AUTOINSTALL="yes"DKMSDKMS.o、MakefilePACKAGE_NAME="cp210x"PACKAGE_VERSION="1.0"CLEAN="makeclean"MAKE[0]="makeallKVERSION=$kernelver"BUILT_MODULE_NAME[0]="cp210x"DEST_MODULE_LOCATION[0]="/updates"AUTOINSTALL="yes"Makefile文件如下:obj-m:=cp210x.oKVERSION:=$(shelluname-r)all:obj-m:=cp210x.oKVERSION:=$(shelluname-r)all:$(MAKE)-C/lib/modules/$(KVERSION)/buildM=$(PWD)modulesclean:$(MAKE)-C/lib/modules/$(KVERSION)/buildM=$(PWD)cleanDKMS具备DKMS的配置文件后,开始添加DKMS模块。DKMS模块的添加流程参见图E.1。卸载已添加状态仅源码目录状态已建立状态已安装状态添加 建立已添加状态仅源码目录状态已建立状态已安装状态移除E.1DKMS使用如下命令查看DKMS的状态:[kylin@Kylin~]#dkmsstatus[kylin@Kylin~]#dkmsstatus添加cp210x模块,使用如下命令:[kylin@Kylin~]#dkmsaddcp210x/1.0[kylin@Kylin~]#dkmsaddcp210x/1.0[kylin@Kylin~]#格式:dkmsadd<module>/<module-version>也可以使用如下方式:[kylin@Kylin~]#dkmsadd-mcp210x-v1.0[kylin@Kylin~]#dkmsadd-mcp210x-v1.0[kylin@Kylin~]#格式:dkmsadd-m<module>-v<module-version>然后查看状态,得到以下输出:[kylin@Kylin~]#dkmsstatuscp210x,1.0:added[kylin@Kylin~]#dkmsstatuscp210x,1.0:added此时cp210x模块处于added状态。编译cp210x模块,使用如下命令:[kylin@Kylin~]#dkmsbuildcp210x/1.0[kylin@Kylin~]#dkmsbuildcp210x/1.0[kylin@Kylin~]#格式:dkmsbuild<module>/<module-version>也可以使用如下方式:[kylin@Kylin~]#dkmsbuild-mcp210x-v1.0[kylin@Kylin~]#dkmsbuild-mcp210x-v1.0[kylin@Kylin~]#格式:dkmsbuild-m<module>-v<module-version>然后查看状态,得到以下输出:[kylin@Kylin~]#dkmsstatus[kylin@Kylin~]#dkmsstatuscp210x,1.0,4.4.13-20161212.kylin.5.server,aarch64:built此时cp210x模块处于built状态。安装cp210x模块,使用如下命令:[kylin@Kylin~]#dkmsinstallcp210x/1.0[kylin@Kylin~]#dkmsinstallcp210x/1.0[kylin@Kylin~]#格式:dkmsinstall<module>/<module-version>也可以使用如下方式:[kylin@Kylin~]#dkmsinstall-mcp210x-v1.0[kylin@Kylin~]#dkmsinstall-mcp210x-v1.0[kylin@Kylin~]#格式:dkmsinstall-m<module>-v<module-version>然后查看状态,得到以下输出:[kylin@Kylin~]#dkmsstatus[kylin@Kylin~]#dkmsstatuscp210x,1.0,4.4.13-20161212.kylin.5.server,aarch64:installed此时cp210x模块处于installed状态。如果需要卸载第三方模块,使用如下命令:[kylin@Kylin~]#dkmsuninstallcp210x/1.0[kylin@Kylin~]#dkmsuninstallcp210x/1.0[kylin@Kylin~]#格式:dkmsuninstall<module>/<module-version>也可以使用如下方式:[kylin@Kylin~]#dkmsuninstall-mcp210x-v1.0[kylin@Kylin~]#dkmsuninstall-mcp210x-v1.0[kylin@Kylin~]#格式:dkmsuninstall-m<module>-v<module-version>然后查看状态,得到以下输出:[kylin@Kylin~]#dkmsstatus[kylin@Kylin~]#dkmsstatuscp210x,1.0,4.4.13-20161212.kylin.5.server,aarch64:built此时cp210x模块处于built状态。如果需要卸载第三方模块,使用如下命令:[kylin@Kylin~]#dkmsremovecp210x/1.0–all[kylin@Kylin~]#dkmsremovecp210x/1.0–all[kylin@Kylin~]#格式:dkmsremove<module>/<module-version>--all也可以使用如下方式:[kylin@Kylin~]#dkmsremove-mcp210x-v1.0–all[kylin@Kylin~]#dkmsremove-mcp210x-v1.0–all[kylin@Kylin~]#格式:dkmsremove-m<module>-v<module-version>--all-k<kernel-version>然后查看状态:[kylin@Kylin~]#dkmsstatus[kylin@Kylin~]#dkmsstatus得到不包含cp210x模块的输出。如果系统中没有模块,则输出为空。如果需要系统在更新内核后能够自动编译模块,那么操作如下:ln-sf/usr/lib/dkms/dkms_autoinstaller/etc/init.d/dkms_autoinstallersystemctldaemon-reloadln-sf/usr/lib/dkms/dkms_autoinstaller/etc/init.d/dkms_autoinstallersystemctldaemon-reloadsystemctlenabledkms_autoinstaller注意:自动更新模块需要有与内核匹配的头文件。建议在内核安装后进行以下操作,预先将所有第三方模块编译完成。forKernelin`ls/lib/modules/`dodkmsautoinstall-k$KernelforKernelin`ls/lib/modules/`dodkmsautoinstall-k$Kerneldone附录F(资料性)第三方内核模块打包第三方内核模块使用DKMS技术加载到内核中。制作第三方内核模块需要使用DKMS包制作工具,生成制作软件包所需要的文件。第三方内核模块包根据是否开源分为两类:dkms_am6——闭源模块:版权比较敏感,只能提供二进制文件,适应性一般,原始模块命名为“包名-dkmscloed_a6cp210x.ko1.0DKMScp210x-dkms.ko。/lib/modules/注意:使用kylin-dkms-creator工具生成编包目录,会根据输入参数自动追加dkms和closed。第三方内核模块包的制作步骤如下:——使用kylin-dkms-creator创建编包目录;——复制源码或源码编译出的.o文件至编包目录中;——修改src/Makefile文件;——使用打包工具对编包目录进行打包。kylin-dkms-creator安装kylin-dkms-creator工具:[kylin@Kylin~]$sudoapt-getinstallkylin-dkms-creator[kylin@Kylin~]$sudoapt-getinstallkylin-dkms-creator使用方式:[kylin@Kylin~]$kylin-dkms-creator--helpUsageofkylin-dkms-creator:[kylin@Kylin~]$kylin-dkms-creator--helpUsageofkylin-dkms-creator:-bAutomaticallyloadmoduleatboot-cClosedsource-dstringBuildPackageDir(default"./build-dkms-package")-estringDeveloperemail(default"\hDeveloper@")-iNeedremakeinitrd-mstringModulename(required)-nstring-nstringDevelopername(default"Developer")-ostringNeeded.ofilesto.ko-vstringModuleversion(default"1.0")参数解释:-b开机自动加载模块;-c源码是否为闭源。若为闭源,则需要加入该选项;-d指定生成的源码包路径;-e指定开发者的邮箱;-iinitrd;-m指定原始模块的名称,必填项;-n指定开发者姓名;-o指定编译模块需要的o-o“a.dkms.o.kmsc.odkm-v指定模块的版本号。注意:使用kylin-dkms-creator工具生成编包目录,会根据输入参数自动追加dkms和closed。模块原始名版本号生成的包名安装到系统中的模块名开源cp210x.ko1.0cp210x-dkms_1.0_arm64cp210x-dkms.ko闭源cp210x.ko1.0cp210x-dkms-closed_1.0_arm64cp210x-dkms-closed.ko使用cp210x驱动作为示例,完整的参数如下:[kylin@Kylin~]$kylin-dkms-creator-mcp210x-v1.0-b-i-c-o“cp210x.o.dkms”-ndevelopers[kylin@Kylin~]$kylin-dkms-creator-mcp210x-v1.0-b-i-c-o“cp210x.o.dkms”-ndevelopers-e\hdevelopers@-d/home/developers/my-dkms/输出:Everythingisdone.Everythingisdone.Packagedirectoryis"/home/developers/my-dkms/cp210x-dkms-closed-1.0".也可简化为:[kylin@Kylin~]$kylin-dkms-creator-mcp210x[kylin@Kylin~]$kylin-dkms-creator-mcp210x输出:Everythingisdone.Everythingisdone.Packagedirectoryis"/tmp/build-dkms-package/cp210x-dkms-1.0".1前提例如cp210x模块。该模块有一个源文件:cp210x.c,编译时使用的Makefile文件如下:ifneq($(KERNELRELEASE),)ifneq($(KERNELRELEASE),)obj-m:=cp210x.oelseKDIR?=/lib/modules/$(shelluname-r)/buildPWD:=$(shellpwd)modules:modules:$(MAKE)-C$(KDIR)M=$(PWD)modulesall:modulesclean:rm-rf*.o*.ko*.depend*.mod.o*.mod.cModule.*modules.*.*.cmd.tmp_versionsendif根据以上信息,通过kylin-dkms-creator工具制作使用dkms技术的软件包。使用kylin-dkms-creator工具生成编包目录:[kylin@Kylin~]$kylin-dkms-creator-mcp210x-v1.0-i-ndevelopers-e[kylin@Kylin~]$kylin-dkms-creator-mcp210x-v1.0-i-ndevelopers-e\hdevelopers@-d/home/developers/my-dkms/输出:Everythingisdone.Everythingisdone.Packagedirectoryis"/home/developers/my-dkms/cp210x-dkms-1.0".将cp210x.c文件复制到编包目录下的src目录下:[kylin@Kylin~]$cpcp210x.c/home/developers/my-dkms/cp210x-dkms-1.0/src[kylin@Kylin~]$cpcp210x.c/home/developers/my-dkms/cp210x-dkms-1.0/srcMakefile需要修改Makefile的“cp210x-dkms-objs”字段,改为cp210x.o。obj-m:=cp210x-dkms.ocp210x-dkms-objs:=cp210x.oifneq($(KERNELRELEASE),)obj-m:=cp210x-dkms.ocp210x-dkms-objs:=cp210x.oifneq($(KERNELRELEASE),)KERNELDIR?=/lib/modules/$(KERNELRELEASE)/buildelseKERNELDIR?=/lib/modules/$(shelluname-r)/buildendifPWD:=$(shellpwd).PHONY:allall:cleanmodules#install.PHONY:modulesmodules:$(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)modules.PHONY:cleanclean:$(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)clean#.PHONY:install#install:# $(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)modules_install编包返回编包目录,执行编包命令:[kylin@Kylin~]$cd/home/developers/my-dkms/cp210x-dkms-1.0/[kylin@Kylin~]$dpkg-buildpackage-sa[kylin@Kylin~]$cd/home/developers/my-dkms/cp210x-dkms-1.0/[kylin@Kylin~]$dpkg-buildpackage-sa编译完成后,第三方模块的dkms包位于编包目录的上一级目录中,名为:cp210x-dkms_1.0_arm64.***(-dkms__。2前提例如cp210x模块。该模块有一个源文件:cp210x.c,编译时使用的Makefile格式如下:ifneq($(KERNELRELEASE),)ifneq($(KERNELRELEASE),)obj-m:=cp210x.oelseKDIR?=/lib/modules/$(uname-r)/buildPWD:=$(shellpwd)modules:$(MAKE)-C$(KDIR)M=$(PWD)modulesall:modulesclean:rm-rf*.o*.ko*.depend*.mod.o*.mod.cModule.*modules.*.*.cmd.tmp_versionsendif手动编译后,生成了以下文件:cp210x.mod.ccp210x.mod.ccp210x.oModule.symverscp210x.ko cp210x.mod.omodules.order在这些文件中,系统只需要不涉密的.o文件:cp210x.o。使用kylin-dkms-creator工具生成编包目录:[kylin@Kylin~]$kylin-dkms-creator-mcp210x-v1.0-c-ocp210x.o.dkms-ndevelopers-e[kylin@Kylin~]$kylin-dkms-creator-mcp210x-v1.0-c-ocp210x.o.dkms-ndevelopers-e\hdevelopers@-d/home/developers/my-dkms/输出:Everythingisdone.Everythingisdone.Packagedirectoryis"/home/developers/my-dkms/cp210x-dkms-closed-1.0".添加.o将cp210x.o文件复制到编包目录下的src目录里面,重命名为.o.dkms:[kylin@Kylin~]$cpcp210x.o/home/developers/my-dkms/cp210x-dkms-closed-1.0/src/cp210x.o.dkms[kylin@Kylin~]$cpcp210x.o/home/developers/my-dkms/cp210x-dkms-closed-1.0/src/cp210x.o.dkmsMakefileMakefilecp210x-dkms-closed-objs-o.o.dk完整Makefile如下:obj-m:=cp210x-dkms-closed.oobj-m:=cp210x-dkms-closed.ocp210x-dkms-closed-objs:=cp210x.o.dkmsifneq($(KERNELRELEASE),)KERNELDIR?=/lib/modules/$(KERNELRELEASE)/buildelseKERNELDIR?=/lib/modules/$(shelluname-r)/buildEndifPWD:=$(shellpwd)PWD:=$(shellpwd).PHONY:allall:cleanmodules#install.PHONY:modulesmodules:$(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)modules.PHONY:cleanclean:$(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)clean#.PHONY:install#install:# $(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)modules_install编包返回编包目录,执行编包命令:[kylin@Kylin~]$cd/home/developers/my-dkms/cp210x-dkms-closed-1.0/[kylin@Kylin~]$dpkg-buildpackage-sa[kylin@Kylin~]$cd/home/developers/my-dkms/cp210x-dkms-closed-1.0/[kylin@Kylin~]$dpkg-buildpackage-sa编译完成后,第三方模块的dkms包位于编包目录的上一级目录中,名为:cp210dk-cose_1.arm64**-dkmscloed_。3.osrc.o.dkms。注意:多二进制文件需要在-o参数中指定,例如:需要的二进制:a.ob.oc.o需要的二进制:a.ob.oc.o-o参数为:-o"a.o.dkmsb.o.dkmsc.o.dkms"引号为英文半角引号。可人工检查src/Makefile的第二行字段,是否与需要的.o.dkms文件一致。4Makefile需要特殊处理的内核模块,在编译时不能直接使用示例1、2、3中的Makefile。ifneq($(KERNELRELEASE),)obj-m:=B.oelseKERNELDIR?=/lib/modules/$(shelluname-r)/build/PWD :=$(shellpwd)modules:$(MAKE)-C$(KERNELDIR)M=$(PWD)KBUILD_EXTRA_SYMBOLS=./Module.symversmodulesclean:rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versionsmodules.orderendifBABAifneq($(KERNELRELEASE),)obj-m:=B.oelseKERNELDIR?=/lib/modules/$(shelluname-r)/build/PWD :=$(shellpwd)modules:$(MAKE)-C$(KERNELDIR)M=$(PWD)KBUILD_EXTRA_SYMBOLS=./Module.symversmodulesclean:rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versionsmodules.orderendifMakefileACRCdkms——在编包目录的src目录下新建一个文件夹,名为:extra_symbols;——将A模块的Module.symvers文件复制到新建的extra_symbols目录中;obj-m:=B-dkms.oB-dkms-objs:=B.oifneq($(KERNELRELEASE),)KERNELDIR?=/lib/modules/$(KERNELRELEASE)/buildelseKERNELDIR?=/lib/modules/$(shelluname-r)/buildendifPWD:=$(shellpwd).PHONY:allall:cleanmodules#install.PHONY:modulesmodules:$(MAKE)-Cobj-m:=B-dkms.oB-dkms-objs:=B.oifneq($(KERNELRELEASE),)KERNELDIR?=/lib/modules/$(KERNELRELEASE)/buildelseKERNELDIR?=/lib/modules/$(shelluname-r)/buildendifPWD:=$(shellpwd).PHONY:allall:cleanmodules#install.PHONY:modulesmodules:$(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)KBUILD_EXTRA_SYMBOLS=$(PWD)/extra_symbols/Module.symversmodules.PHONY:cleanclean:$(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)clean#.PHONY:install#install:# $(MAKE)-C$(KERNELDIR)SUBDIRS=$(PWD)modules_installMakefileMakefilekylin-dkms-creatorextra_symbolsModule.symversModule.symvers——重命名A模块的Module.symvers文件为A.symvers,并复制到src目录中;akeileKBUIL_EXRA_YMBL“$PWD/A.ymv附录G(资料性)驱动程序的调试验证方法printkprintf(KERN_ALERT“HelloWorld\n”);利用printkCprintfprintf(KERN_ALERT“HelloWorld\n”);内核一共定义了8种打印级别宏:#defineKERN_EMERG#defineKERN_EMERG"<0>"#defineKERN_ALERT"<1>"#defineKERN_CRIT"<2>"#defineKERN_ERR"<3>"#defineKERN_WARNING"<4>"#defineKERN_NOTICE"<5>"#defineKERN_INFO"<6>"#defineKERN_DEBUG"<7>"#cat/proc/sys/kernel/printk6 4 1 7printk#cat/proc/sys/kernel/printk6 4 1 7第一个664printk41177。为了简化代码,内核同样提供简化系列函数:#definepr_emerg(fmt,...)#definepr_emerg(fmt,...)\printk(KERN_EMERGpr_fmt(fmt),##VA_ARGS)#definepr_alert(fmt,...)\printk(KERN_ALERTpr_fmt(fmt),##VA_ARGS)#definepr_crit(fmt,...)\printk(KERN_CRITpr_fmt(fmt),##VA_ARGS)#definepr_err(fmt,...)\printk(KERN_ERRpr_fmt(fmt),##VA_ARGS)#definepr_warning(fmt,...)\printk(KERN_WARNINGpr_fmt(fmt),##VA_ARGS)#definepr_notice(fmt,...)\printk(KERN_NOTICEpr_fmt(fmt),##VA_ARGS)#definepr_info(fmt,...)\printk(KERN_INFOpr_fmt(fmt),##VA_ARGS)#definepr_cont(fmt,...)\printk(KERN_CONTfmt,##VA_AR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030农药塑料瓶市场市场现状供需分析及投资评估规划分析研究报告
- 2025-2030兽药及生物制品行业发展分析及投资价值研究咨询报告
- 2025-2030全球及中国联网汽车服务行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国智能款待系统行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国德拉斯行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国城域以太网行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国二氧化硅纳米颗粒行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球与中国酸菜行业市场深度调研及竞争格局与市场规模研究报告
- 2025-2030健身器械行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030保温午餐行业市场现状供需分析及投资评估规划分析研究报告
- 沉井施工合同模板
- 急性冠脉综合征患者健康教育
- 信用修复申请书模板
- HG-T 2006-2022 热固性和热塑性粉末涂料
- DZ∕T 0383-2021 固体矿产勘查三维地质建模技术要求(正式版)
- 2024年全国初中数学竞赛试题含答案
- 血管瘤的治疗课件
- 2024年《宪法》知识竞赛必背100题题库带解析及参考答案(考试直接用)
- MOOC 电子线路分析基础-西安电子科技大学 中国大学慕课答案
- 《急性缺血性卒中血管内治疗中国指南2023》解读
- 老人孤独的护理措施
评论
0/150
提交评论