初步了解设备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实现的主要内容,如果未能解决你的问题,请参考以下文章

reactos操作系统实现 2

JAVA:NIO初步了解

ReactOS --- Windows操作系统重现

基于Wrk和ReactOS源码分析APC机制的记录

局域网广域网初步认识

注册IRP_MJ_SHUTDOWN事件 基于ReactOS0303