首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

1点小疑惑,驱动程序访问内存的疑惑

2013-01-07 
一点小疑惑,驱动程序访问内存的疑惑张帆 的windows驱动开发详解 121页说: 驱动程序被应用程序加载至内核模

一点小疑惑,驱动程序访问内存的疑惑
张帆 的windows驱动开发详解 121页说: 驱动程序被应用程序加载至内核模式地址,它能访问的只是这个进程的虚拟内存地址,而不能是其他进程的虚拟地址。

对于这句,我有点疑惑:书中说,虚拟地址低2G是用户模式地址,高2G是内核模式地址,windows所有进程的内核地址映射是完全一致的,进程切换时,只改变用户模式地址的映射。

既然内核地址映射是完全一致的,那驱动程序加载至了内核地址,为什么只能访问自己进程的虚拟内存地址,所有内存的内核地址映射不都一致的吗,应该可以访问其他进程的虚拟地址啊。

请大侠指点。
[解决办法]
我也是菜鸟 ··· 说说自己的看法 ···
我觉得他的意思应该是哪个进程与驱动程序通信,驱动程序就能访问哪个进程的。如果你把进程的ID传给驱动程序,那么驱动程序就可以访问那个进程。
[解决办法]
我没做过windows的驱动,但我做过linux的驱动,对于linux,驱动时共享内核空间的,所以在驱动中使用内存要特别小心,而在用户空间,各个进程有自己独立的内存映射,和自己独立的资源,按理说,各个进程之间是不会发生内存冲突的,但是由于有些共享资源,比如串口,或则是其他的共享内存块的话,就需要用到进程之间的通信,而进程之间的通信是会用到内核空间的,所以,在用户空间中,进程之间是不会直接访问其他进程的内存的,都是通过内核空间的代码(驱动)来间接访问其他进程的内存

[解决办法]
所有的驱动都运行在一个叫System的内核态进程中,它们共享地址空间。这个和Linux没有区别。

用户态的进程,不能直接访问内核态的代码,虽然理论上高2G的地址也是属于这个进程的。
当用户态的进程要访问自己的核心态地址空间时,系统会syscall切到核心态的system 进程中执行,执行完了再返回到用户态的原进程。

[解决办法]
内核空间高于2GB(32位进程)是共享的,实际上在内核中也不能直接访问当前进程用户空间,(这个好像是由CR4寄存器中的一位来控制)。
[解决办法]

引用:
嗯,TO PANTONGLIN:
windows驱动也是如此的,应用程序在用户空间拥有自己的独立内存映射,互不干扰。但进入高2G的内核空间后,该进程是不是就可以访问别的进程的内存了呢??


这个,高于2G的内核空间不是那么好进的,应用程进入内核空间通常是通过系统调用,系统调用的行为原则上是不会让你乱来的。当然,BUG除外......
另外驱动是能够在内核空间运行,但进程在内核空间存放的东西都是任务结构之类的操作系统用于控制进程所使用的,应用程序自身的数据在内核空间之外。另外,内核空间乱动一不小心不蓝屏……

热点排行