驱动之路_驱动内存管理

我们的exe文件,载入到内存后,

他会分配一个4G的虚拟内存,

0~0x7fffffff  用户可以访问的内存

0x80000000~0xffffffff  内核才可以访问的内存

 

而这个内核内存是共享的,也就是说每个exe的内核内存都是统一的.不会变的.

当我们切换进程的时候,只是切换的用户内存,而内核内存不会变.

内核内存只有2个G,所以栈的空间也比较小.

 

而我们的sys驱动文件就跟dll差不多,dll是加载入用户内存的,而 sys 是加载到内核内存的.

 

 

 

 

    Windows的核心代码和Windows的驱动程序加载的位置都是在高2GB的内核地址中。Windows操作系统在进程切换时,保持内核态地址是完全相同的,即所有进程的内核地址映射完全一致,进程切换时只改变用户模式地址的映射。

 

 

 

  驱动程序类似于一个DLL,被应用程序加载到虚拟内存中,只不过加载地址是内核地址。它能访问的只是这个进程的虚拟内存,不能访问其他进程的虚拟地址。Windows驱动程序里的不同例程运行在不同的进程中。DriverEntry例程和AddDevice例程是运行在系统(System)进程中的。这个进程是Windows第一个运行的进程。当需要加载的时候,这个进程中会有一个线程将驱动程序加载到内核模式地址空间内,并调用DriverEntry例程。
    其他的例程,如IRP的派遣函数会运行于应用程序的“上下文”中。“上下文”是指运行于某个进程的环境中,所能访问的虚拟地址是这个进程的虚拟地址。
 
 
 
 
 
也 就是说:
DriverEntry例程和AddDevice例程是运行在系统(System)进程中的
而其他的派遣例程是根据哪个进程调用的,而相对应的进行改变虚拟内存
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2013-09-03 09:35  宝贝,我永远都在  阅读(226)  评论(0)    收藏  举报