CN109753365A - 一种Windows内核大数据高速通信技术 - Google Patents
一种Windows内核大数据高速通信技术 Download PDFInfo
- Publication number
- CN109753365A CN109753365A CN201711092202.3A CN201711092202A CN109753365A CN 109753365 A CN109753365 A CN 109753365A CN 201711092202 A CN201711092202 A CN 201711092202A CN 109753365 A CN109753365 A CN 109753365A
- Authority
- CN
- China
- Prior art keywords
- big data
- speed communication
- kernel
- data high
- address space
- 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
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种Windows内核大数据高速通信技术,该发明针对现有技术中Windows内核缓冲区设备读写,直接方式读写,和其他方式读写的不足,采用Windows内核共享内存的方案,达到Windows内核和应用层大数据高速通信的目的。
Description
技术领域
本发明涉及一种互联网通信技术领域,特别涉及一种Windows内核大数据高速通信技术。
背景技术
千兆网卡抓包审计,需要在Windows内核中进行抓包,然后把内容发给应用层,进行处理,现有的通信方式速度太慢,无法满足千兆网卡抓包的吞吐量,导致经常丢包。所以需要一种大数据高速通信的技术方式,实现千兆网卡的吞吐量数据传输。
发明内容
为克服现有技术的不足,本发明通过驱动程序创建内核事件,分配内存页,并映射这些内存页到指定用户模式进程的地址空间,并且将地址返回给应用程序。应用程序打开事件句柄,并进行监听等待。驱动程序抓包获取数据,写入共享内存中,通过事件通知应用程序直接读取共享内存,进行循环处理。
驱动程序分配内存页并且映射这些页到特定进程的用户虚拟地址空间上。同时也允许驱动对分配内存的类型具有最大的控制能力。在驱动中使用MmAllocatePagesForMdl分配内存页,得到MDL,然后将该MDL所描述的内存映射到用户层地址空间(MmMapLockedPagesSpecifyCache)。得到用户地址空间的起始地址,并通过IOCTL返回给用户层。
驱动无论使用什么标准方法,都是希望分配内存来共享。例如,如果驱动需要一个适当的设备(逻辑)地址作DMA,就像内存块的内核虚拟地址,它能够使用AllocateCommonBuffer来分配内存。如果没有要求特定的内存特性,要被共享的内存大小也是适度的,驱动可以将0填充、非分页物理内存页分配给缓冲区。
本发明本发明技术方案带来的有益效果:
本发明采用Windows内核共享内存的方案,缓冲数据大,处理速度快,可以及时处理处理千兆网卡的抓包信息;同时安全稳定,不容易导致系统不稳定。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为本发明的流程示意图;
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
具体实施方案:
驱动程序分配内存页并且映射这些页到特定进程的用户虚拟地址空间上。同时也允许驱动对分配内存的类型具有最大的控制能力。在驱动中使用MmAllocatePagesForMdl分配内存页,得到MDL,然后将该MDL所描述的内存映射到用户层地址空间(MmMapLockedPagesSpecifyCache)。得到用户地址空间的起始地址,并通过IOCTL返回给用户层。
驱动无论使用什么标准方法,都是希望分配内存来共享。例如,如果驱动需要一个适当的设备(逻辑)地址作DMA,就像内存块的内核虚拟地址,它能够使用AllocateCommonBuffer来分配内存。如果没有要求特定的内存特性,要被共享的内存大小也是适度的,驱动可以将0填充、非分页物理内存页分配给缓冲区。
使用MmAllocatePagesForMDL或者MmAllocatePagesForMdlEx从内存中分配非分页的内存页。这些函数返回一个MDL。驱动使用函数MmGetSystemAddressForMdlSafe映射MDL描述的页到内核虚拟地址空间。从主内存分配页比使用分页内存池或者非分页内存池得到的内存更加安全。
这种方式是内核来分配内存空间,但是是使用MmAllocatePagesForMDL从主内存池中分配,返回得到一个MDL,对于驱动如何使用该共享内存,采用MmGetSystemAddressForMdlSafe得到其内核地址。对于应用层使用该共享内存,采用MmMapLockedPagesSpecifyCache映射到应用层进程地址空间中,返回用户层地址空间的起始地址,将其放在IOCTL中返回给用户应用程序。
借助一个用来描述共享内存的MDL,驱动现在准备映射这些页到用户进程地址空间。这可以使用函数MmMapLockedPagesSpecifyCache来实现。必须在你希望映射Buffer的进程上下文中调用这个函数。
如果是在别的进程上下文中调用,就变成了映射到其他进程上下文中了,需要保证在希望映射Buffer的进程上下文中调用。设定AccessMode参数为UserMode。对MmMapLockedPagesSpecifyCache函数调用返回值是MDL描述内存页映射的用户虚拟地址空间地址。驱动可以将其放在对应IOCTL的缓存中给用户应用程序。
需要有一个方法,在不需要时将分配的内存清除掉。需要调用MmFreePageFromMdl来释放内存页。并且调用IoFreeMdl来释放由MmAllocatePageForMdl(Ex)创建的MDL。你几乎都是在你驱动的IRP_MJ_CLEANUP处理例程(WDM)或者EvtFileCleanup事件处理回调(KMDF中作这个工作)。
核心代码如下:
PVOID CreateAndMapMemory(OUT PMDL*PMemMdl,
OUT PVOID*UserVa)
{
PMDL Mdl;
PVOID UserVAToReturn;
PHYSICAL_ADDRESS LowAddress;
PHYSICAL_ADDRESS HighAddress;
SIZE_TTotalBytes;
//初始化MmAllocatePagesForMdl需要的Physical Address
LowAddress.QuadPart=0;
MAX_MEM(HighAddress.QuardPart);
TotalBytes.QuadPart=PAGE_SIZE;
//分配4K的共享缓冲区
Mdl=MmAllocatePagesForMdl(LowAddress,
HighAddress,
LowAddress,
TotalBytes);
if(!Mdl)
{
Return STATUS_INSUFFICIENT_RESOURCES;
}
//映射共享缓冲区到用户地址空间
UserVAToReturn=MmMapLockedPagesSpecifyCache(Mdl,
UserMode,
MmCached,
NULL,
FALSE,
NormalPagePriority);
if(!UserVAToReturn)
{
MmFreePagesFromMdl(Mdl);
IoFreeMdl(Mdl);
Return STATUS_INSUFFICIENT_RESOURCE;
}
//返回,得到MDL和用户层的虚拟地址
*UserVa=UserVAToReturn;
*PMemMdl=Mdl;
return STATUS_SUCCESS;
}
当然,这种方法也有缺点,调用MmMapLockedPagesSpecifyCache必须在你希望内存页被映射的进程上下文来做。较之使用METHOD_NEITHER的IOCTL方法,该方法表现出不必其更多的灵活性。然而,不像前者,后者只需一个函数(MmMapLockerPagesSpecifyCache)在目标上下文被调用。由于很多OEM设备驱动在设备栈中只有一个且直接基于总线的(也就是在其上没有别的设备,除了总线驱动其下没有别的驱动),这个条件很容易满足。对于那些少量的设备驱动,处于设备栈的深处并且需要和用户模式应用直接共享Buffer的,一个企业级的驱动编写者可能能找到一个安全的地方在请求的进程上下文中调用。
在页面被映射以后,共享内存就可以象使用METHOD_XXX_DIRECT的IOCTL方法一样,能够在任意的进程上下文被存取,也可以在高IRQL上存取(因为共享内存来之非分页内存)。
需要确定的一点就是何时调用MmMapLockedPagesSpecifyCache安全的映射到指定进程的上下文中。还有一点,就是该共享内存处于非分页内存中,所以可以在搞IRQL上存取。
必须保证驱动要提供方法,在任何时候用户进程退出的时候,能够将你映射到用户空间的页面作取消映射的操作。这件事情的失败会导致系统在应用层退出的时候崩溃。我们找到一个简单方法就是无论何时应用层关闭设备句柄,则对这些页面作取消映射操作。由于应用层关闭句柄,出现意外或者其他情况,驱动将收到对应于该应用层打开的设备文件对象的一个IRP_MJ_CLEANUP。你将在CLEANUP使执行这些操作,而不是CLOSE,因为可以保证在请求线程的上下文中得到Cleanup IRP。下面代码可以看见分配资源的释放。
VOID UnMapAndFreeMemory(PMDL PMdl,PVOID UserVa)
{
if(!PMdl)
{return;}
//解除映射
MmUnMapLockerPages(UserVa,PMdl);
//释放MDL锁定的物理页
MmFreePagesFromMdl(PMdl);
//释放MDL
IoFreeMdl(PMdl);
}
无论使用哪种机制,驱动和应用程序将需要支持同步存取共享内存的通用方式,这可以通过很多许多方法来做。可能最简单的机制是共享一个或者多个命名事件。应用和驱动共享事件的最简单方法就是应用层生成事件,然后将事件句柄传递给驱动层。驱动然后从应用层的上下文中Reference事件句柄。如果你使用这种方法,请不要忘记在驱动的Cleanup处理代码中Dereference这个句柄。
在使用命名事件来同步驱动和应用程序共享缓冲区时,一般不要使用驱动程序创建命名事件,然后根据应用程序名称打开的方法。这种方法虽然可以使得驱动激活事件后,所有相关应用程序都能够被唤醒,方便程序的开发,但是他有两个问题:一是命名事件只有在WIN32子系统起来后才能正确创建,这会影响到驱动程序开发。最严重的问题是在驱动中创建的事件其存取权限要求比较高,在WinXP下要求具有Administrator组权限的用户创建的应用程序才能够存取该事件。在Vista系统下由于安全功能的强化,这方面的问题更加严重。因此尽量使用应用程序创建的事件,或者通过其他同步方式。
以上对本发明实施例所提供的一种Windows内核大数据高速通信技术进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (3)
1.一种Windows内核大数据高速通信技术,该发明通过驱动程序创建内核事件,分配内存页,并映射这些内存页到指定用户模式进程的地址空间,并且将地址返回给应用程序;应用程序打开事件句柄,并进行监听等待;驱动程序抓包获取数据,写入共享内存中,通过事件通知应用程序直接读取共享内存,进行循环处理。
2.根据权利要求1所述的一种Windows内核大数据高速通信技术,其特征在于:驱动程序分配内存页并且映射这些页到特定进程的用户虚拟地址空间上;同时也允许驱动对分配内存的类型具有最大的控制能力。
3.根据权利要求1所述的一种Windows内核大数据高速通信技术,其特征在于:在驱动中使用MmAllocatePagesForMdl分配内存页,得到MDL,然后将该MDL所描述的内存映射到用户层地址空间(MmMapLockedPagesSpecifyCache);获得用户地址空间的起始地址,并通过IOCTL返回给用户层。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711092202.3A CN109753365A (zh) | 2017-11-08 | 2017-11-08 | 一种Windows内核大数据高速通信技术 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711092202.3A CN109753365A (zh) | 2017-11-08 | 2017-11-08 | 一种Windows内核大数据高速通信技术 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109753365A true CN109753365A (zh) | 2019-05-14 |
Family
ID=66401951
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711092202.3A Pending CN109753365A (zh) | 2017-11-08 | 2017-11-08 | 一种Windows内核大数据高速通信技术 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109753365A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112306702A (zh) * | 2019-07-26 | 2021-02-02 | 龙芯中科技术股份有限公司 | 数据共享方法、装置、电子设备及储存介质 |
-
2017
- 2017-11-08 CN CN201711092202.3A patent/CN109753365A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112306702A (zh) * | 2019-07-26 | 2021-02-02 | 龙芯中科技术股份有限公司 | 数据共享方法、装置、电子设备及储存介质 |
CN112306702B (zh) * | 2019-07-26 | 2023-07-14 | 龙芯中科技术股份有限公司 | 数据共享方法、装置、电子设备及储存介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10503405B2 (en) | Zero copy memory reclaim using copy-on-write | |
US10489881B2 (en) | Direct memory access for co-processor memory | |
DE602004012106T2 (de) | Multikanal-DMA mit gemeinsamem FIFO-Puffer | |
US8874802B2 (en) | System and method for reducing communication overhead between network interface controllers and virtual machines | |
US10379745B2 (en) | Simultaneous kernel mode and user mode access to a device using the NVMe interface | |
CN102110196B (zh) | 并行运行多用户操作系统间的数据安全传输方法及系统 | |
DE112020006859T5 (de) | Beibehaltung von speicher-namensraum-identifizierern für die migration von virtualisierten ausführungsumgebungen im laufenden betrieb | |
WO2020244369A1 (zh) | 进程间通信的方法、装置以及计算机设备 | |
KR101729097B1 (ko) | 복수의 가상 머신에서 수행되는 응용 프로그램들간 참조 데이터를 공유하는 방법 및 이를 위한 참조 데이터 관리 장치 및 시스템 | |
US7661115B2 (en) | Method, apparatus and program storage device for preserving locked pages in memory when in user mode | |
US11397697B2 (en) | Core-to-core communication | |
CN1790294A (zh) | 保留虚拟机的高速缓存的系统和方法 | |
DE102018123669A1 (de) | Host-Computer-Anordnung, Remote-Server-Anordnung, Speicherungssystem und Verfahren davon | |
US11308230B2 (en) | Direct access to host memory for guests | |
US10331591B2 (en) | Logical-to-physical block mapping inside the disk controller: accessing data objects without operating system intervention | |
US11875198B2 (en) | Synchronization object issue detection using object type queues and associated monitor threads in a storage system | |
EP3274896B1 (en) | Configuration of a memory controller for copy-on-write with a resource controller | |
US9886387B2 (en) | Method and system for performing on-demand data write through based on virtual machine types | |
CN111651269A (zh) | 实现设备虚拟化的方法、装置及计算机可读存储介质 | |
US20160350233A1 (en) | Zero copy memory reclaim for applications using memory offlining | |
US11698737B2 (en) | Low-latency shared memory channel across address spaces without system call overhead in a computing system | |
US20200201691A1 (en) | Enhanced message control banks | |
CN109753365A (zh) | 一种Windows内核大数据高速通信技术 | |
CN114003168A (zh) | 用于处理命令的存储设备和方法 | |
US20220138027A1 (en) | Method for transmitting a message in a computing system, and computing system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |