CN103942149A - 用户态程序与内核交互报文的方法及系统 - Google Patents
用户态程序与内核交互报文的方法及系统 Download PDFInfo
- Publication number
- CN103942149A CN103942149A CN201410118936.4A CN201410118936A CN103942149A CN 103942149 A CN103942149 A CN 103942149A CN 201410118936 A CN201410118936 A CN 201410118936A CN 103942149 A CN103942149 A CN 103942149A
- Authority
- CN
- China
- Prior art keywords
- internal memory
- kernel
- user
- numerical value
- size
- 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.)
- Granted
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种用户态程序与内核交互报文的方法及系统,涉及操作系统技术领域,本发明通过设置内核和用户态程序共享的内存,当内核有报文发送给用户态程序时,仅需改变内存的数值,用户态程序在初始化过程中映射了该内存,因此可以读到该数值,用户态程序通过简单的读取该数值来判断是否有报文,如果有报文再去收取报文,避免了不停的系统调用,同时避免了大量的无效操作,提高了整个系统的性能。
Description
技术领域
本发明涉及操作系统技术领域,特别涉及一种用户态程序与内核交互报文的方法及系统。
背景技术
各种基于操作系统(例如:linux)开发的用户态程序,都不可避免的会和内核有报文交互,用户态程序可能是要内核将网络报文发送出去,也可能是要把报文交给内核进入协议栈。
现有技术方法中的用户态程序和内核之间的交互方法为:通过在用户态创建一个线程,该线程不停的通过系统调用来获取内核发送过来的数据,当内核有数据发给用户态程序时,该系统调用执行成功,当没有数据发给用户态程序时,该系统调用执行失败,但由于是通过线程不停的系统调用来获取内核发送过来的数据,在操作系统正常的运行状态下,大部分时间内核不会给用户态程序发送报文,而大量系统调用使整个系统的性能大幅下降。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是:如何提高系统的性能。
(二)技术方案
为解决上述技术问题,本发明提供了一种用户态程序与内核交互报文的方法,所述方法包括以下步骤:
S1:内核申请一块物理地址连续的内存,并将所述内存设置为与用户态程序共享;
S2:当所述内核向所述用户态程序发送报文时,则改变所述内存中所存储的数值;
S3:所述用户态程序读取所述内存中所存储的数值,并判断所述内存中所存储的数值是否被改变,若所述数值被改变,则认定为所述内核向所述用户态程序发送了报文,并进行报文接收。
其中,步骤S1包括:
S101:内核申请一块物理地址连续的内存,并将申请到内存的虚拟地址转换成物理地址;
S102:用户态程序获取所述内存的物理地址和大小,并将所述内存的物理地址通过mmap接口及所述内存大小转换为用户态程序能访问的虚拟地址;
S103:内核通过全局指针g_pkernel来指向所述内存,用户态程序通过全局指针g_pusr来指向所述内存,以实现内核与用户态程序共享所述内存。
其中,步骤S2中,所述内核通过下式改变所述内存中所存储的数值,
(*(size_t*)g_pkernel)+=1,
其中,*(size_t*)g_pkernel为size_t*类型的全局指针g_pkernel所指向的内存中的数值,+=1为自加1运算。
其中,步骤S3中,所述用户态程序通过比较var和*(size_t*)g_pusr来判断所述内存中所存储的数值是否被改变,当var和*(size_t*)g_pusr不相等时,则认定为所述内核向所述用户态程序发送了报文,var+=1,并进行报文接收;
其中,var为初值为0的变量,*(size_t*)g_pusr为size_t*类型的全局指针g_pusr所指向的内存中的数值。
其中,所述内核为linux操作系统的内核。
本发明还公开了一种用户态程序与内核交互报文的系统,所述系统包括:内核和用户态程序,
所述内核,用于申请一块物理地址连续的内存,并将所述内存设置为与用户态程序共享;
所述内核,进一步用于向所述用户态程序发送报文时,改变所述内存中所存储的数值;
所述用户态程序,用于读取所述内存中所存储的数值,并判断所述内存中所存储的数值是否被改变,若所述数值被改变,则认定为所述内核向所述用户态程序发送了报文,并进行报文接收。
其中,所述内核,进一步用于申请一块物理地址连续的内存,并将申请到内存的虚拟地址转换成物理地址;
所述用户态程序,进一步用于获取所述内存的物理地址和大小,并将所述内存的物理地址通过mmap接口及所述内存大小转换为用户态程序能访问的虚拟地址;
所述内核,进一步用于通过全局指针g_pkernel来指向所述内存,用户态程序通过全局指针g_pusr来指向所述内存,以实现内核与用户态程序共享所述内存。
其中,所述内核通过下式改变所述内存中所存储的数值,
(*(size_t*)g_pkernel)+=1,
其中,*(size_t*)g_pkernel为size_t*类型的全局指针g_pkernel所指向的内存中的数值,+=1为自加1运算。
其中,所述用户态程序通过比较var和*(size_t*)g_pusr来判断所述内存中所存储的数值是否被改变,当var和*(size_t*)g_pusr不相等时,则认定为所述内核向所述用户态程序发送了报文,var+=1,并进行报文接收;
其中,var为初值为0的变量,*(size_t*)g_pusr为size_t*类型的全局指针g_pusr所指向的内存中的数值。
其中,所述内核为linux操作系统的内核。
(三)有益效果
本发明通过设置内核和用户态程序共享的内存,当内核有报文发送给用户态程序时,仅需改变内存的数值,用户态程序在初始化过程中映射了该内存,因此可以读到该数值,用户态程序通过简单的读取该数值来判断是否有报文,如果有报文再去收取报文,避免了不停的系统调用,同时避免了大量的无效操作,提高了整个系统的性能。
附图说明
图1是本发明一种实施方式的用户态程序与内核交互报文的方法流程图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
图1是本发明一种实施方式的用户态程序与内核交互报文的方法流程图;参照图1,所述方法包括以下步骤:
S1:内核申请一块物理地址连续的内存,并将所述内存设置为与用户态程序共享;
S2:当所述内核向所述用户态程序发送报文时,则改变所述内存中所存储的数值;
S3:所述用户态程序读取所述内存中所存储的数值,并判断所述内存中所存储的数值是否被改变,若所述数值被改变,则认定为所述内核向所述用户态程序发送了报文,并进行报文接收。
为了方便访问内存,优选地,步骤S1包括:
S101:内核申请一块物理地址连续的内存,并将申请到内存的虚拟地址转换成物理地址;
S102:用户态程序获取(可在用户态程序初始化时,通过系统调用等方法来获取)所述内存的物理地址kernel_vir和大小,并将所述内存的物理地址通过mmap接口及所述内存大小转换为用户态程序能访问的虚拟地址phyaddr;
S103:内核通过全局指针g_pkernel来指向所述内存,用户态程序通过全局指针g_pusr来指向所述内存,以实现内核与用户态程序共享所述内存。
为便于改变内存中存储的数值,优选地,步骤S2中,所述内核通过下式改变所述内存中所存储的数值,
(*(size_t*)g_pkernel)+=1,
其中,*(size_t*)g_pkernel为size_t*类型的全局指针g_pkernel所指向的内存中的数值,+=1为自加1运算。
为便于确认内核是否向用户态程序发送了报文,优选地,步骤S3中,所述用户态程序通过比较var和*(size_t*)g_pusr来判断所述内存中所存储的数值是否被改变,当var和*(size_t*)g_pusr不相等时,则认定为所述内核向所述用户态程序发送了报文,var+=1,并进行报文接收;
其中,var为初值为0的变量,*(size_t*)g_pusr为size_t*类型的全局指针g_pusr所指向的内存中的数值(由于内核和用户态程序共享所述内存,故而当内核对内存中存储的数值进行改变后,则用户态程序读取到的所述内存中所存储的数值也发生了相应改变);size_t是在标准C库中定义的,在32位系统中时,其为unsigned int,是4字节的(即32位);在64位系统中时,其为long unsigned int,是8字节的(即64位),利用该类型可以增强程序的可移植性。
在具体判断所述内存中所存储的数值是否被改变时,可由用户态程序在初始化时,创建一个线程,该线程里面有如下指令:
static size_t var=0;声明一个静态变量var
if(var==*(size_t*)g_pusr)说明内核没有向用户态程序发送报文
else说明var和*(size_t*)g_pusr不相等了,表明内核向用户态程序发送了报文,此时用户态程序可以通过系统调用等方法去收取报文,然后设置var+=1,说明用户态程序已经收到了一个报文,下次线程轮训时,如果var和*(size_t*)g_pusr相等,说明已经没有报文了,如果不相等说明还有报文。
上述指令,当内核有报文发送给用户态程序时,将内存数值仅需做加1的改写,用户态程序在初始化过程中映射了该内存,因此可以读到该数值,线程每次轮训时通过简单的读取该数值来判断是否有报文,如果有报文再通过系统调用去收取报文,避免了不停的系统调用,避免了大量的无效操作,提高了整个系统的性能。
优选地,所述内核为linux操作系统的内核。
本发明还公开了一种用户态程序与内核交互报文的系统,所述系统包括:内核和用户态程序,
所述内核,用于申请一块物理地址连续的内存,并将所述内存设置为与用户态程序共享;
所述内核,进一步用于向所述用户态程序发送报文时,改变所述内存中所存储的数值;
所述用户态程序,用于读取所述内存中所存储的数值,并判断所述内存中所存储的数值是否被改变,若所述数值被改变,则认定为所述内核向所述用户态程序发送了报文,并进行报文接收。
优选地,所述内核,进一步用于申请一块物理地址连续的内存,并将申请到内存的虚拟地址转换成物理地址;
所述用户态程序,进一步用于获取所述内存的物理地址和大小,并将所述内存的物理地址通过mmap接口及所述内存大小转换为用户态程序能访问的虚拟地址;
所述内核,进一步用于通过全局指针g_pkernel来指向所述内存,用户态程序通过全局指针g_pusr来指向所述内存,以实现内核与用户态程序共享所述内存。
优选地,所述内核通过下式改变所述内存中所存储的数值,
(*(size_t*)g_pkernel)+=1,
其中,*(size_t*)g_pkernel为size_t*类型的全局指针g_pkernel所指向的内存中的数值,+=1为自加1运算。
优选地,所述用户态程序通过比较var和*(size_t*)g_pusr来判断所述内存中所存储的数值是否被改变,当var和*(size_t*)g_pusr不相等时,则认定为所述内核向所述用户态程序发送了报文,var+=1,并进行报文接收;
其中,var为初值为0的变量,*(size_t*)g_pusr为size_t*类型的全局指针g_pusr所指向的内存中的数值。
优选地,所述内核为linux操作系统的内核。
以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。
Claims (10)
1.一种用户态程序与内核交互报文的方法,其特征在于,所述方法包括以下步骤:
S1:内核申请一块物理地址连续的内存,并将所述内存设置为与用户态程序共享;
S2:当所述内核向所述用户态程序发送报文时,则改变所述内存中所存储的数值;
S3:所述用户态程序读取所述内存中所存储的数值,并判断所述内存中所存储的数值是否被改变,若所述数值被改变,则认定为所述内核向所述用户态程序发送了报文,并进行报文接收。
2.如权利要求1所述的方法,其特征在于,步骤S1包括:
S101:内核申请一块物理地址连续的内存,并将申请到内存的虚拟地址转换成物理地址;
S102:用户态程序获取所述内存的物理地址和大小,并将所述内存的物理地址通过mmap接口及所述内存大小转换为用户态程序能访问的虚拟地址;
S103:内核通过全局指针g_pkernel来指向所述内存,用户态程序通过全局指针g_pusr来指向所述内存,以实现内核与用户态程序共享所述内存。
3.如权利要求2所述的方法,其特征在于,步骤S2中,所述内核通过下式改变所述内存中所存储的数值,
(*(size_t*)g_pkernel)+=1,
其中,*(size_t*)g_pkernel为size_t*类型的全局指针g_pkernel所指向的内存中的数值,+=1为自加1运算。
4.如权利要求3所述的方法,其特征在于,步骤S3中,所述用户态程序通过比较var和*(size_t*)g_pusr来判断所述内存中所存储的数值是否被改变,当var和*(size_t*)g_pusr不相等时,则认定为所述内核向所述用户态程序发送了报文,var+=1,并进行报文接收;
其中,var为初值为0的变量,*(size_t*)g_pusr为size_t*类型的全局指针g_pusr所指向的内存中的数值。
5.如权利要求1~4中任一项所述的方法,其特征在于,所述内核为linux操作系统的内核。
6.一种用户态程序与内核交互报文的系统,其特征在于,所述系统包括:内核和用户态程序,
所述内核,用于申请一块物理地址连续的内存,并将所述内存设置为与用户态程序共享;
所述内核,进一步用于向所述用户态程序发送报文时,改变所述内存中所存储的数值;
所述用户态程序,用于读取所述内存中所存储的数值,并判断所述内存中所存储的数值是否被改变,若所述数值被改变,则认定为所述内核向所述用户态程序发送了报文,并进行报文接收。
7.如权利要求6所述的系统,其特征在于,所述内核,进一步用于申请一块物理地址连续的内存,并将申请到内存的虚拟地址转换成物理地址;
所述用户态程序,进一步用于获取所述内存的物理地址和大小,并将所述内存的物理地址通过mmap接口及所述内存大小转换为用户态程序能访问的虚拟地址;
所述内核,进一步用于通过全局指针g_pkernel来指向所述内存,用户态程序通过全局指针g_pusr来指向所述内存,以实现内核与用户态程序共享所述内存。
8.如权利要求7所述的系统,其特征在于,所述内核通过下式改变所述内存中所存储的数值,
(*(size_t*)g_pkernel)+=1,
其中,*(size_t*)g_pkernel为size_t*类型的全局指针g_pkernel所指向的内存中的数值,+=1为自加1运算。
9.如权利要求8所述的系统,其特征在于,所述用户态程序通过比较var和*(size_t*)g_pusr来判断所述内存中所存储的数值是否被改变,当var和*(size_t*)g_pusr不相等时,则认定为所述内核向所述用户态程序发送了报文,var+=1,并进行报文接收;
其中,var为初值为0的变量,*(size_t*)g_pusr为size_t*类型的全局指针g_pusr所指向的内存中的数值。
10.如权利要求6~9中任一项所述的系统,其特征在于,所述内核为linux操作系统的内核。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410118936.4A CN103942149B (zh) | 2014-03-27 | 2014-03-27 | 用户态程序与内核交互报文的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410118936.4A CN103942149B (zh) | 2014-03-27 | 2014-03-27 | 用户态程序与内核交互报文的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103942149A true CN103942149A (zh) | 2014-07-23 |
CN103942149B CN103942149B (zh) | 2017-11-03 |
Family
ID=51189822
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410118936.4A Active CN103942149B (zh) | 2014-03-27 | 2014-03-27 | 用户态程序与内核交互报文的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103942149B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105468400A (zh) * | 2015-08-03 | 2016-04-06 | 汉柏科技有限公司 | 一种基于linux用户态调用定时器的方法及系统 |
CN107193673A (zh) * | 2017-06-28 | 2017-09-22 | 锐捷网络股份有限公司 | 一种报文处理方法及设备 |
CN107733837A (zh) * | 2016-08-11 | 2018-02-23 | 杭州迪普科技股份有限公司 | 基于应用层网络异常报文的异常检测方法及装置 |
CN108062253A (zh) * | 2017-12-11 | 2018-05-22 | 北京奇虎科技有限公司 | 一种内核态与用户态的通信方法、装置及终端 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060242270A1 (en) * | 2005-04-21 | 2006-10-26 | Microsoft Corporation | Isolation of user-mode device drivers |
CN101150485A (zh) * | 2007-11-15 | 2008-03-26 | 曙光信息产业(北京)有限公司 | 一种零拷贝缓冲区队列网络数据发送的管理方法 |
CN101707564A (zh) * | 2009-12-04 | 2010-05-12 | 曙光信息产业(北京)有限公司 | 用于零拷贝缓冲区队列网络数据发送和接收的处理方法和装置 |
CN101917350A (zh) * | 2010-09-13 | 2010-12-15 | 南京中兴特种软件有限责任公司 | 一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法 |
US20110154364A1 (en) * | 2009-12-22 | 2011-06-23 | International Business Machines Corporation | Security system to protect system services based on user defined policies |
CN102402487A (zh) * | 2011-11-15 | 2012-04-04 | 北京天融信科技有限公司 | 一种零拷贝接收报文的方法和系统 |
-
2014
- 2014-03-27 CN CN201410118936.4A patent/CN103942149B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060242270A1 (en) * | 2005-04-21 | 2006-10-26 | Microsoft Corporation | Isolation of user-mode device drivers |
CN101150485A (zh) * | 2007-11-15 | 2008-03-26 | 曙光信息产业(北京)有限公司 | 一种零拷贝缓冲区队列网络数据发送的管理方法 |
CN101707564A (zh) * | 2009-12-04 | 2010-05-12 | 曙光信息产业(北京)有限公司 | 用于零拷贝缓冲区队列网络数据发送和接收的处理方法和装置 |
US20110154364A1 (en) * | 2009-12-22 | 2011-06-23 | International Business Machines Corporation | Security system to protect system services based on user defined policies |
CN101917350A (zh) * | 2010-09-13 | 2010-12-15 | 南京中兴特种软件有限责任公司 | 一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法 |
CN102402487A (zh) * | 2011-11-15 | 2012-04-04 | 北京天融信科技有限公司 | 一种零拷贝接收报文的方法和系统 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105468400A (zh) * | 2015-08-03 | 2016-04-06 | 汉柏科技有限公司 | 一种基于linux用户态调用定时器的方法及系统 |
CN107733837A (zh) * | 2016-08-11 | 2018-02-23 | 杭州迪普科技股份有限公司 | 基于应用层网络异常报文的异常检测方法及装置 |
CN107193673A (zh) * | 2017-06-28 | 2017-09-22 | 锐捷网络股份有限公司 | 一种报文处理方法及设备 |
CN107193673B (zh) * | 2017-06-28 | 2020-05-26 | 锐捷网络股份有限公司 | 一种报文处理方法及设备 |
CN108062253A (zh) * | 2017-12-11 | 2018-05-22 | 北京奇虎科技有限公司 | 一种内核态与用户态的通信方法、装置及终端 |
Also Published As
Publication number | Publication date |
---|---|
CN103942149B (zh) | 2017-11-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105993009B (zh) | 通过非透明桥向PCIe集群中的计算资源传送MSI-X中断的方法和装置 | |
US7752360B2 (en) | Method and system to map virtual PCIe I/O devices and resources to a standard I/O bus | |
US10083131B2 (en) | Generating and/or employing a descriptor associated with a memory translation table | |
US9002970B2 (en) | Remote direct memory access socket aggregation | |
US20200201668A1 (en) | Scalable techniques for data transfer between virtual machines | |
US8813071B2 (en) | Storage reclamation systems and methods | |
CN103942149A (zh) | 用户态程序与内核交互报文的方法及系统 | |
CN105190552A (zh) | 执行多个管理程序的系统和方法 | |
CN104461698A (zh) | 虚拟磁盘动态挂载的方法、管理装置及分布式存储系统 | |
CN104205780B (zh) | 一种存储数据的方法和装置 | |
CN110719345A (zh) | 虚拟机mac地址生成方法、系统、设备及计算机介质 | |
CN104732164A (zh) | 一种提高ssl数据处理速度的装置及其方法 | |
CN108829529A (zh) | 虚拟机内存共享方法、装置、计算机设备及存储介质 | |
CN116860391A (zh) | Gpu算力资源调度方法、装置、设备和介质 | |
CN103329059A (zh) | 用于至少部分地选择至少一个存储器的电路 | |
CN106293967A (zh) | 一种远程注入代码的方法及系统 | |
KR20140073955A (ko) | 메모리 시스템 및 그 구동 방법 | |
CN103379145A (zh) | 信息处理的方法、设备和系统 | |
CN112015552A (zh) | hash环均衡负载方法、装置、电子设备和存储介质 | |
CN108959020B (zh) | 一种计算机cpu利用率的计算方法和装置 | |
CN106502775B (zh) | 一种分时调度dsp算法的方法和系统 | |
CN105550050A (zh) | 硬件通信的方法及装置 | |
CN111651124B (zh) | Ssd映射表多核分区并行重建方法、装置、设备及介质 | |
US9740626B2 (en) | Sharing data structures between processes by semi-invasive hybrid approach | |
US11074200B2 (en) | Use-after-free exploit prevention architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
PP01 | Preservation of patent right | ||
PP01 | Preservation of patent right |
Effective date of registration: 20180528 Granted publication date: 20171103 |