一点小疑惑,驱动程序访问内存的疑惑
张帆 的windows驱动开发详解 121页说: 驱动程序被应用程序加载至内核模式地址,它能访问的只是这个进程的虚拟内存地址,而不能是其他进程的虚拟地址。
对于这句,我有点疑惑:书中说,虚拟地址低2G是用户模式地址,高2G是内核模式地址,windows所有进程的内核地址映射是完全一致的,进程切换时,只改变用户模式地址的映射。
既然内核地址映射是完全一致的,那驱动程序加载至了内核地址,为什么只能访问自己进程的虚拟内存地址,所有内存的内核地址映射不都一致的吗,应该可以访问其他进程的虚拟地址啊。
请大侠指点。
[解决办法]
我也是菜鸟 ··· 说说自己的看法 ···
我觉得他的意思应该是哪个进程与驱动程序通信,驱动程序就能访问哪个进程的。如果你把进程的ID传给驱动程序,那么驱动程序就可以访问那个进程。
[解决办法]
我没做过windows的驱动,但我做过linux的驱动,对于linux,驱动时共享内核空间的,所以在驱动中使用内存要特别小心,而在用户空间,各个进程有自己独立的内存映射,和自己独立的资源,按理说,各个进程之间是不会发生内存冲突的,但是由于有些共享资源,比如串口,或则是其他的共享内存块的话,就需要用到进程之间的通信,而进程之间的通信是会用到内核空间的,所以,在用户空间中,进程之间是不会直接访问其他进程的内存的,都是通过内核空间的代码(驱动)来间接访问其他进程的内存
[解决办法]
所有的驱动都运行在一个叫System的内核态进程中,它们共享地址空间。这个和Linux没有区别。
用户态的进程,不能直接访问内核态的代码,虽然理论上高2G的地址也是属于这个进程的。
当用户态的进程要访问自己的核心态地址空间时,系统会syscall切到核心态的system 进程中执行,执行完了再返回到用户态的原进程。
[解决办法]
内核空间高于2GB(32位进程)是共享的,实际上在内核中也不能直接访问当前进程用户空间,(这个好像是由CR4寄存器中的一位来控制)。
[解决办法]