初步了解设备IO方式和ReactOS MDL实现
Posted bcbobo21cn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初步了解设备IO方式和ReactOS MDL实现相关的知识,希望对你有一定的参考价值。
Mdl意为‘内存映射描述符’、‘缓冲描述符’,一个mdl就代表一个缓冲。(任意一块物理内存,可以同时映射到用户地址空间和系统地址空间的);
设备IO方式分为三种:缓冲方式、直接IO方式、直接方式
缓冲方式:将用户空间中的数据拷贝到内核缓冲,将内核缓冲中的数据拷贝到用户空间,效率低,适合少量数据交换
直接IO方式:将用户空间中的内存通过MDL机制映射到系统地址空间,效率高,适合大数据交换
直接方式:直接使用用户空间地址,效率最高,但不安全。
这里设备IO是指向外设读取写入数据;
MDL的定义:
typedef struct _MDL
struct _MDL *Next;
CSHORT Size;
CSHORT MdlFlags;
struct _EPROCESS *Process;
PVOID MappedSystemVa;
PVOID StartVa;
ULONG ByteCount;
ULONG ByteOffset;
MDL, *PMDL;
typedef MDL *PMDLX;
第一个成员变量Next用于连接成一个MDL的链表,而第二个成员变量则用于保存MDL的大小,MDL的大小并不仅仅只是这个结构体的大小,还包含MDL管理的内存页地址指针的大小。第三个成员变量表明MDL管理的页的属性,第四个变量表明MDL管理的内存页属于哪一个进程,如果这个成员变量为NULL,则表明是从非换页内存中映射的。
IoAllocateMdl函数,这个函数首先对内存按照内存页大小进行对齐,计算出需要多少内存页进行映射。如果需要进行映射的内存页的数量大于23,则从非换页内存中进行分配,否则将直接从全局的Lookaside列表中进行分配。对MDL的初始化是在一个宏当中完成的,主要填充MDL数据结构的一些成员变量。
以上是关于初步了解设备IO方式和ReactOS MDL实现的主要内容,如果未能解决你的问题,请参考以下文章