CN103593189A - 一种嵌入式Linux下用户态驱动程序的实现方法 - Google Patents

一种嵌入式Linux下用户态驱动程序的实现方法 Download PDF

Info

Publication number
CN103593189A
CN103593189A CN201310565007.3A CN201310565007A CN103593189A CN 103593189 A CN103593189 A CN 103593189A CN 201310565007 A CN201310565007 A CN 201310565007A CN 103593189 A CN103593189 A CN 103593189A
Authority
CN
China
Prior art keywords
driver
state
user
kernel
linux
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
CN201310565007.3A
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.)
Kunming University of Science and Technology
Original Assignee
Kunming University of Science and Technology
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 Kunming University of Science and Technology filed Critical Kunming University of Science and Technology
Priority to CN201310565007.3A priority Critical patent/CN103593189A/zh
Publication of CN103593189A publication Critical patent/CN103593189A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明涉及一种嵌入式Linux下用户态驱动程序的实现方法,属于嵌入式操作系统技术领域。本发明具体步骤为将传统的内核态驱动程序依据性能相关与否以及优先级,分离为运行于内核态的k-driver和运行于用户态的u-driver两个组件;在内核态建立动态可加载内核模块k-mod;在用户态建立动态链接库u-lib。本发明用户态编程工具,允许程序员在编写驱动程序时使用通用成熟的编程工具如代码调试器,提高了编码质量;较好的性能,相比与传统的内核态设备驱动程序有着相似的性能,例如相似的吞吐量、延迟和CPU开销;故障隔离,用户层组件发生的故障不会影响到内核,即不会影响到整个系统的安全运行;兼容性,与现有的嵌入式Linux系统兼容,提供一样的接口。

Description

一种嵌入式Linux下用户态驱动程序的实现方法
技术领域
本发明涉及一种嵌入式Linux下用户态驱动程序的实现方法,尤其是嵌入式Linux系统下的驱动程序的加固,具体地说是在保证性能以及与现有系统兼容的前提下在嵌入式Linux系统中实现用户态驱动程序的方法,属于嵌入式操作系统技术领域。
背景技术
随着计算机技术与通信技术的迅猛发展,嵌入式系统已经渗透到人们生活的各个方面,在工业控制、航天军工、医疗卫生、消费电子等领域,嵌入式系统都有着广泛的应用。而在各大嵌入式操作系统中,Linux以其开放源代码、较好的网络性能、精简高效的内核、较高的可定制性、支持多种体系结构等特性,广泛地应用于嵌入式领域。
在嵌入式领域,可靠性被提高到了最重要的位置。而操作系统中,驱动程序是影响系统可靠性的最大隐患。来自微软公司的报告显示,89%导致windows XP系统崩溃的源头来自驱动程序。一项针对Linux内核的研究也显示驱动程序出现BUG的几率比内核中其它部分的代码高出2-7倍。
在嵌入式Linux系统中,为了兼顾性能和I/O指令的特权操作要求,传统的驱动程序是运行在内核态,拥有内核的所有权限,一旦驱动程序出现BUG,将会导致整个系统崩溃。在提高系统可靠性方面,目前已有的研究,都专注于通过把有错误的设备驱动程序与内核隔离。然而,这些研究都忽略了驱动程序可靠性问题中最重要的一个方面:在内核态编程要比在用户态编程要困难得多,由于难以调试,因此也更容易出现未知的bug,导致系统可靠性下降。将驱动程序移出内核被认为是这一问题很好的解决方案之一。
目前已有的用户态驱动解决方案,主要存在两个问题。第一,由于现有的驱动/内核接口的限制,用户态驱动程序执行时需要频繁地在用户态以及内核态切换并移动大量数据,这导致了明显的性能低下,难以满足实际系统的需求。第二,要实现用户态驱动程序的高性能,就需要完全重写现有的驱动程序,这就导致每一个这样的系统中的驱动程序都是单独实现,无法实现通用,更无法与现有的系统相兼容。
发明内容
本发明要解决的技术问题是提供一种在嵌入式Linux系统中实现用户态驱动程序的方法,用以解决现有用户态驱动解决方案中存在的性能低下以及与现有系统的兼容性问题。
本发明的技术方案是:
一种嵌入式Linux下用户态驱动程序的实现方法: 
首先,分离传统的内核态驱动程序。将传统的内核态驱动程序依据性能相关与否以及优先级,分离为运行于内核态的k-driver和运行于用户态的u-driver两个部分。
所述的k-driver,包括性能相关的热点代码和数据通道,例如输入/输出、中断处理函数、一些高优先级函数(软中断、tasklet和工作队列)等。k-driver以Linux的可加载动态模块(Loadable Kernel Module )的方式运行于内核态,以保证高性能。
所述的u-driver,包括驱动程序中一些与性能无关的非关键操作以及一些优先级较低的代码,例如设备初始化、设备配置、设备控制、错误处理等。u-driver以一个普通进程的形式运行于用户态,以保证充分的故障隔离。
所述的u-driver,通过对/dev/mem的访问,使用mmap()系统调用将设备寄存器或端口映射到用户空间。这样,u-driver就可以在用户态直接访问硬件的寄存器或输入输出端口。
其次,当一个传统的内核态驱动程序被转换为一个k-driver和一个u-driver,这两个组件需要通信和共享数据。提供这一服务的是运行于内核态的k-mod以及运行于用户态的u-lib。
所述的k-mod,注册为一个设备驱动程序并实现了字符设备接口用来与u-lib通信。它实现的功能包括与u-driver进行通信、追踪k-driver与u-driver间共享的数据结构等。
所述的u-lib,被实现为一个链接到u-driver的多线程库,它面向u-driver的接口与k-mod面向内核的接口类似。它实现的功能包括请求k-driver提供服务、执行来自k-mod的函数调用请求等。
所述的k-mod和u-lib共同提供了k-driver和u-driver之间的通信,使得k-driver可以调用u-driver中的函数,u-driver同样能够调用k-driver中的函数。它们还跟踪k-driver和u-driver两个模块的共享变量或全局数据,任何一方对数据的改变都要通知另一方,保证两者数据的同步。
当系统启动时,系统加载k-driver和k-mod模块,随后启动用户态的u-driver和u-lib,u-lib中的一个主要线程通过ioctl()系统调用将u-driver注册到k-mod。u-lib调用k-mod模块的ioctl,等待请求,当k-driver向上调用时,ioctl返回并把请求传送给用户层。这样,k-driver和u-driver通过k-mod以及u-lib的配合,即可实现传统内核态驱动程序的功能。
本发明的有益效果是:
(1)用户态编程工具,允许程序员在编写驱动程序时使用通用成熟的编程工具如代码调试器,提高了编码质量;
(2)较好的性能,相比与传统的内核态设备驱动程序有着相似的性能,例如相似的吞吐量、延迟和CPU开销;
(3)故障隔离,用户层组件发生的故障不会影响到内核,即不会影响到整个系统的安全运行;
(4)兼容性,与现有的嵌入式Linux系统兼容,提供一样的接口。
附图说明
图1为本发明提供的一种用户态驱动程序的实现方法的框架结构图;
图2为本发明提供的一种用户态驱动程序的实现方法的执行流程图;  
图3为本发明实施例中所述用户态驱动程序的通信流程图;
图4为本发明实施例中所述用户态驱动程序的数据拷贝流程图。
具体实施方式
下面结合附图和具体实施方式,对本发明作进一步说明。这里以在DM9000网卡上实现本发明所述的用户态驱动程序作为实施例,来具体说明本发明的实现方法。所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。
实施例1:首先,按照发明内容中所描述的驱动架构,将DM9000网卡内核态驱动程序分离为两个部分:k-driver和u-driver。如图1所示,图1为本发明提供的一种用户态驱动程序的实现方法的框架结构图,其中实线是性能攸关代码路径,虚线是性能无关代码路径。k-driver以Linux的可加载动态模块(Loadable Kernel Module )的方式实现,包括了DM9000网卡驱动中的数据处理核心功能代码,如接受数据包、数据包拷贝、中断处理等。u-driver以普通用户态程序的方式实现,包括了DM9000网卡驱动中的一些非热点代码,如设备初始化、设备配置、错误处理等,这部分代码可以安全地从内核态移出,并且对性能影响甚微。
其次,确定DM9000网卡用户态驱动的I/O访问方式。需要在用户态的u-driver能够直接访问DM9000的寄存器或I/O端口。在传统的X86架构处理器平台,存在着两个相关的系统调用:iopl()和ioperm(),通过这两个系统调用即可允许调用进程获得访问设备对应的I/O端口或寄存器的权限。但在嵌入式系统常用的ARM平台,不存在这两个系统调用,但是,可以将设备的寄存器或端口映射到某段物理内存空间上。/dev/mem是物理内存的全映像,可以用来访问物理内存,那么只需将DM9000网卡的寄存器或内存映射到物理地址空间,根据映射的地址,使用mmap()系统调用,u-driver可以直接访问和操作DM9000网卡的寄存器。
第三,确定MD9000网卡用户态驱动的通信方案。如图3所示,图3为本实施例所采用的通信方案流程图,其中实线为数据路径,虚线为控制路径。k-driver和u-driver必须协同工作才能完成传统的内核态驱动的功能。内核态和用户态的运行库提供了这一服务。运行于内核态的k-mod注册为一个设备驱动程序并实现了字符设备接口。运行于用户态的u-lib实现为一个链接到k-driver的多线程库。本实施例采用ioctl()系统调用机制,实现k-mod和u-lib之间的通信。
k-driver调用u-driver中的函数时,通过调用k-mod来传送请求给u-driver,u-driver预分配一个缓冲区来接收数据,缓冲区的大小设置为u-driver与k-driver能传输的数据的上限,接下来,k-mod激活在内核中等待的主线程,复制数据到u-driver地址空间中的缓冲区,并通知u-lib调用u-driver中正确的函数。收到来自k-driver的请求之后,u-lib发送请求给一个工作线程,并回复内核等待接下来的请求。
u-driver也可以向下调用,不论是调用k-driver中的函数还是内核中的其它函数,都可以通过ioctl()系统调用来实现,k-mod中的一个ioctl管理器收到请求并调用合适的内核函数。u-driver向下调用的的请求主要有以下几种:(1)VIRT2PHY,计算u-driver模块中虚拟地址对应的物理地址;(2)UP_INFO,向内核空间提交当前用户态驱动进程信息;(3)DMA_PHY,获取k-driver中DMA缓冲区的物理地址;(4)OPEN、CLOSE等系统调用。
第四,确定MD9000网卡用户态驱动的DMA缓冲区分配方案。如图4所示,图4为本发明实施例中所采用的DMA缓冲区分配方案的数据拷贝流程图,其中实线是本实施例方案的数据拷贝路径,虚线是传统内核态驱动程序的数据拷贝路径。为减少数据拷贝次数,u-driver要能够直接访问DMA缓冲区的内容,即实现用户态的DMA缓冲区。这可以通过Linux内核的设备文件/dev/mem和mmap()系统调用来实现。通过open()系统调用打开/dev/mem文件,接着,把k-driver申请的内存的物理地址传送到用户空间,最后通过mmap()将这段物理内存映射到当前进程的地址空间。其中,分配共享内存的关键代码如下:
kaddr = kmalloc(size);
phy_addr = addr – PAGE_OFFSET;
fd = open(“/dev/mem”, O_RDWR);
uaddr = mmap(phy_addr, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
最后,确定MD9000网卡用户态驱动的中断通知机制。将硬件产生的中断通知给用户程序,这里通过将中断映射到文件描述符来实现这一功能。在Linux系统的/proc文件系统下,每一个中断都对应一个目录,目录下包含一些属性文件。通过在中断号对应的目录下增加一个新的属性文件,用来标识是否产生了该中断号对应的中断。当u-driver对该文件执行read()操作时,内核在对应的信号量上执行down()操作,阻塞该read()操作直到中断的产生。硬件产生中断时,首先在内核中断处理函数中屏蔽该中断,然后增加中断映射的文件描述符中的计数,最后在对应的信号量上执行up()操作,使之前阻塞的read()操作返回,返回值为文件描述符中的中断计数,如果返回值大于0,说明产生了硬件中断,则转而去执行u-driver中定义的中断处理函数。
综上所述,即将传统的DM9000内核态驱动程序改写成为新的用户态驱动程序。由于数据处理的关键代码都留在内核态,移到用户态的代码都是对性能影响甚微的非关键代码,这样就将用户态驱动程序对性能的影响降到了最小,完全能够满足实际需求。由于运行于用户态的部分即使出现故障也不会影响到整个系统,只需简单地杀掉进程再重新启动即可,在本实施例中,约70%的代码都可以从内核态移至用户态,大大减少了留在内核态运行的代码量,而用户态的部分也可以使用成熟的软件工程工具来进行编程,提高了代码质量,因此大大提高了系统的稳定性。同时,实现过程中使用到的接口和系统调用都是现有Linux系统中的标准接口,与现有系统完全兼容,应用范围广泛。
上面结合附图对本发明的具体实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。

Claims (6)

1.一种嵌入式Linux下用户态驱动程序的实现方法,其特征在于包括以下步骤:
步骤一,将传统的内核态驱动程序依据性能相关与否以及优先级,分离为运行于内核态的k-driver和运行于用户态的u-driver两个组件;
步骤二,在内核态建立动态可加载内核模块k-mod;
步骤三,在用户态建立动态链接库u-lib。
2.根据权利要求1所述的嵌入式Linux下用户态驱动程序的实现方法,其特征在于:所述步骤一中的k-driver,包括性能相关的热点代码和数据通道,以Linux的可加载动态模块的方式运行于内核态。
3.根据权利要求1所述的嵌入式Linux下用户态驱动程序的实现方法,其特征在于:所述步骤一中的u-driver,包括驱动程序中与性能无关的非关键操作以及优先级较低的代码,以一个普通进程的形式运行于用户态。
4.根据权利要求1所述的嵌入式Linux下用户态驱动程序的实现方法,其特征在于:所述步骤二中的k-mod,注册为一个设备驱动程序并实现了字符设备接口用来与u-lib通信;它实现的功能包括与u-driver进行通信、追踪k-driver与u-driver间共享的数据结构。
5.根据权利要求1所述的嵌入式Linux下用户态驱动程序的实现方法,其特征在于:所述步骤二中的u-lib,实现为一个链接到u-driver的多线程库,具有的功能包括请求k-driver提供服务、执行来自k-mod的函数调用请求。
6.根据权利要求1所述的嵌入式Linux下用户态驱动程序的实现方法,其特征在于:所述步骤二的k-mod和步骤三的u-lib,共同提供了k-driver和u-driver之间的通信,使得k-driver可以调用u-driver中的函数,u-driver同样能够调用k-driver中的函数,k-mod和u-lib相互配合跟踪k-driver和u-driver两个模块的共享变量和全局数据,任何一方对数据的改变都要通知另一方,保证两者数据的同步。
CN201310565007.3A 2013-11-14 2013-11-14 一种嵌入式Linux下用户态驱动程序的实现方法 Pending CN103593189A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310565007.3A CN103593189A (zh) 2013-11-14 2013-11-14 一种嵌入式Linux下用户态驱动程序的实现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310565007.3A CN103593189A (zh) 2013-11-14 2013-11-14 一种嵌入式Linux下用户态驱动程序的实现方法

Publications (1)

Publication Number Publication Date
CN103593189A true CN103593189A (zh) 2014-02-19

Family

ID=50083349

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310565007.3A Pending CN103593189A (zh) 2013-11-14 2013-11-14 一种嵌入式Linux下用户态驱动程序的实现方法

Country Status (1)

Country Link
CN (1) CN103593189A (zh)

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104123194A (zh) * 2014-07-16 2014-10-29 上海斐讯数据通信技术有限公司 内核态与用户态的通信结构及通信方法
CN104391717A (zh) * 2014-11-18 2015-03-04 南京大学 一种调试时代码动态更新方法
CN105159696A (zh) * 2015-07-09 2015-12-16 北京君正集成电路股份有限公司 一种独立于Linux内核的硬件驱动实现方法及装置
CN106775487A (zh) * 2016-12-27 2017-05-31 郑州云海信息技术有限公司 一种多路径存储故障的处理方法和装置
CN106844078A (zh) * 2016-12-27 2017-06-13 郑州云海信息技术有限公司 一种pcie故障的处理方法和装置
CN106959870A (zh) * 2017-02-20 2017-07-18 北京数字联盟网络科技有限公司 Nginx动态模块加载方法和装置
CN108873667A (zh) * 2018-07-13 2018-11-23 昆明理工大学 一种基于Linux系统下的时间测量系统及其方法
CN109379634A (zh) * 2018-09-17 2019-02-22 四川长虹电器股份有限公司 一种基于设备驱动智能电视获取tvinfo的方法
CN109688058A (zh) * 2018-12-19 2019-04-26 迈普通信技术股份有限公司 报文处理方法、装置及网络设备
CN109753347A (zh) * 2017-11-06 2019-05-14 阿里巴巴集团控股有限公司 一种实现驱动的系统及方法
CN110622164A (zh) * 2017-04-30 2019-12-27 微软技术许可有限责任公司 驱动程序代码子集在单独保护域中的执行
CN111371723A (zh) * 2018-12-07 2020-07-03 网宿科技股份有限公司 一种在dpdk框架下实现pptp vpn网络隔离的方法和装置
CN111857729A (zh) * 2020-07-23 2020-10-30 深圳忆联信息系统有限公司 网卡驱动编译方法、装置、计算机设备及存储介质
CN113360431A (zh) * 2021-06-21 2021-09-07 南京中消安全技术有限公司 一种在Linux操作系统用户空间下控制GPIO端口的方法和设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
董占杰等: "嵌入式Linux网卡用户态驱动设计", 《信息技术》 *

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104123194A (zh) * 2014-07-16 2014-10-29 上海斐讯数据通信技术有限公司 内核态与用户态的通信结构及通信方法
CN104391717A (zh) * 2014-11-18 2015-03-04 南京大学 一种调试时代码动态更新方法
CN104391717B (zh) * 2014-11-18 2017-09-12 南京大学 一种调试时代码动态更新方法
CN105159696A (zh) * 2015-07-09 2015-12-16 北京君正集成电路股份有限公司 一种独立于Linux内核的硬件驱动实现方法及装置
CN106775487A (zh) * 2016-12-27 2017-05-31 郑州云海信息技术有限公司 一种多路径存储故障的处理方法和装置
CN106844078A (zh) * 2016-12-27 2017-06-13 郑州云海信息技术有限公司 一种pcie故障的处理方法和装置
CN106959870B (zh) * 2017-02-20 2020-09-29 北京数字联盟网络科技有限公司 Nginx动态模块加载方法和装置
CN106959870A (zh) * 2017-02-20 2017-07-18 北京数字联盟网络科技有限公司 Nginx动态模块加载方法和装置
CN110622164A (zh) * 2017-04-30 2019-12-27 微软技术许可有限责任公司 驱动程序代码子集在单独保护域中的执行
CN109753347B (zh) * 2017-11-06 2023-03-21 阿里巴巴集团控股有限公司 一种实现驱动的系统及方法
CN109753347A (zh) * 2017-11-06 2019-05-14 阿里巴巴集团控股有限公司 一种实现驱动的系统及方法
CN108873667A (zh) * 2018-07-13 2018-11-23 昆明理工大学 一种基于Linux系统下的时间测量系统及其方法
CN109379634A (zh) * 2018-09-17 2019-02-22 四川长虹电器股份有限公司 一种基于设备驱动智能电视获取tvinfo的方法
CN111371723A (zh) * 2018-12-07 2020-07-03 网宿科技股份有限公司 一种在dpdk框架下实现pptp vpn网络隔离的方法和装置
CN111371723B (zh) * 2018-12-07 2022-06-17 网宿科技股份有限公司 一种在dpdk框架下实现pptp vpn网络隔离的方法和装置
CN109688058B (zh) * 2018-12-19 2021-03-02 迈普通信技术股份有限公司 报文处理方法、装置及网络设备
CN109688058A (zh) * 2018-12-19 2019-04-26 迈普通信技术股份有限公司 报文处理方法、装置及网络设备
CN111857729A (zh) * 2020-07-23 2020-10-30 深圳忆联信息系统有限公司 网卡驱动编译方法、装置、计算机设备及存储介质
CN113360431A (zh) * 2021-06-21 2021-09-07 南京中消安全技术有限公司 一种在Linux操作系统用户空间下控制GPIO端口的方法和设备

Similar Documents

Publication Publication Date Title
CN103593189A (zh) 一种嵌入式Linux下用户态驱动程序的实现方法
US11321452B2 (en) Execution environment virtualization method and apparatus and virtual execution environment access method and apparatus
US9619308B2 (en) Executing a kernel device driver as a user space process
TWI375913B (en) Delivering interrupts directly to a virtual processor
US10255088B2 (en) Modification of write-protected memory using code patching
US20170109197A1 (en) Architecture and method for managing interrupts in a virtualized environment
US10176007B2 (en) Guest code emulation by virtual machine function
EP1861778B1 (en) Data processing system
US7647416B2 (en) Full hardware based TCP/IP traffic offload engine(TOE) device and the method thereof
US9128893B2 (en) Remote direct memory access socket aggregation
US7877091B2 (en) Method and system for executing a container managed application on a processing device
Ren et al. Shared-memory optimizations for inter-virtual-machine communication
CN104205050A (zh) 访问远程机器上的设备
CN107368379B (zh) 面向EVP的跨Guest OS进程间通信方法及系统
CN112671760A (zh) 基于Socket的客户端跨平台网络通信方法及其相关设备
US9003094B2 (en) Optimistic interrupt affinity for devices
US20130054861A1 (en) Pessimistic interrupt affinity for devices
KR20230084300A (ko) 칩 시스템, 가상 인터럽트 처리 방법 및 대응하는 장치
EP3436947B1 (en) Secure driver platform
CN113806006A (zh) 一种异构指令集架构下异常或中断的处理方法、装置
US9069741B2 (en) Emulating level triggered interrupts of physical devices assigned to virtual machine
CN100409150C (zh) 一种提高hid设备通讯速度的方法
CN103678163A (zh) 数据流的切换方法、装置及系统
Chang et al. Virtualization technology for TCP/IP offload engine
CN101819524B (zh) Rfid阅读器的访问方法及其接口驱动设备

Legal Events

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

Application publication date: 20140219