文档详情

Windows进程的用户空间.PDF

发布:2017-05-24约3.83万字共23页下载文档
文本预览下载声明
漫谈兼容内核之二十一: Windows 进程的用户空间 毛德操 进程的用户空间是应用软件活动的舞台,所以搞清楚 Windows 进程用户空间的格局和 轮廓对于深入理解 Windows 进程的运行有着重要的意义。而对于兼容内核的开发者,则这 个问题更是非搞清楚不可,因为开发兼容内核的意图就是要让 Windows 应用软件得以在 Linux 系统上运行。其实,在前面的一些漫谈中,随着当时话题的开展也曾讲到过有关这个 问题的一些大概,但是一方面只是散见于各处,不够集中;另一方面也不够系统和完整,实 际上也因而不够详细和确切;因此有必要专门把它作为一个话题加以比较系统、完整的深入 介绍。有道是“耳闻为虚,眼见为实”,对于我们来说,所谓“眼见”就是要见到有关的源 代码。当然,我们所能见到的只是 RreactOS 的源代码,好在各种迹象表明 RreactOS 与 Windows 在这方面也是相当贴近和一致的。 我们先从几个宏定义着手: #define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress #define MM_USER_PROBE_ADDRESS *MmUserProbeAddress #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 #define KI_USER_SHARED_DATA 0xffdf0000 #define SharedUserData \ ((KUSER_SHARED_DATA *CONST) KI_USER_SHARED_DATA) 在 ReactOS 的代码中,每当需要引用用户空间的上限、即最高地址时,一般就把 MM_HIGHEST_USER_ADDRESS 用作常数,但实际上这是个宏操作,是在引用指针 MmHighestUserAddress 的内容。与此相似的还有 MM_USER_PROBE_ADDRESS ,实际上 是在引用指针MmUserProbeAddress 的内容。这两个指针的内容是在内核初始化时设置好的: MmInit1(…) { …… MmUserProbeAddress = 0x7fff0000; MmHighestUserAddress = (PVOID)0x7ffeffff; …… } 就是说,应用软件在用户空间可以访问的最高地址(虚拟地址)是 0x7ffeffff,从 0x7fff0000 开始就不能访问了。一般文献中讲 Windows 系统中用户空间与系统空间的分界线是 0而这里之所以是 0x7fff0000 而不是 0是因为在分界下面留了 64KB 的空间不让访问,以此作为隔离区。 应用软件在用户空间可以访问的最低地址是 MM_LOWEST_USER_ADDRESS ,这是个 常数,定义为 0x10000,就是第一个 64KB 边界的地方,而从 0 开始的 64KB 也是不让访问 的。 还有个常数 KI_USER_SHARED_DATA 更是值得一说。这个常数定义为 0xffdf0000,是 一个区间的起点。这个区间按说是在系统空间,却又划出来让用户空间的程序访问,就好像 是用户空间的一小片飞地。这片飞地的目的是用来让用户空间的程序访问内核中的一些数 据,好像是在系统空间的地皮上挖了口井。而且,这个区间是由系统空间和所有用户空间共 享,也就是为所有进程所共享,所以这个常数名为 KI_USER_SHARED_DATA 。那么这个“井” 里有些什么数据呢?上面的宏定义为此定义了一个数据结构 KUSER_SHARED_DATA ,并 定义了一个相应的结构指针 SharedUserData,让它指向这个地址: typedef struct _KUSER_SHARED_DATA { ULONG TickCountLowDeprecated; ULONG TickCountMultiplier; vo
显示全部
相似文档