首页
社区
课程
招聘
[求助]Win7系统内核编程、内核物理内存管理问题
发表于: 2013-6-7 13:53 10989

[求助]Win7系统内核编程、内核物理内存管理问题

2013-6-7 13:53
10989
32位 Win7系统  安装了4GB物理内存,但是Win7系统只是识别了4GB物理内存,只使用了2.75GB的物理内存,还有1.25GB物理内存被空闲了。我想用 MmMapIoSpace 把空闲的1.25GB物理内存地址映射到内核线性地址加以使用。但是又恐怕这些空闲的1.25GB物理内存也被别的程序 MmMapIoSpace 了,这样重叠使用这段内存会造成系统的不稳定,不知内核之中有没有 哪个API可以让我独占使用这些空闲的1.25GB物理内存?当然可以让自己的驱动程序在系统启动早期 HOOK MmMapIoSpace 来阻止其他程序对空闲的1.25GB物理内存进行 MmMapIoSpace ,这个办法我不想用,我只希望让Win7系统自己来管理内存,提供给我独占使用这段内存。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
      物理地址空间并不意味着物理内存!!!
    按照正常的情况,你安装了多少内存,就应该有多少物理空间,比如你安装了4G内存,那你的物理地址空间就范围就应该是0x00000000--0xFFFFFFFF。但问题是,系统的BIOS,PCI等等硬件会占用一部分物理空间,貌似PCI就会占用好几百M。他们占用这些内存是为了让CPU能按照内存的方式访问硬件,比如计算机启动的时候,BIOS的引导代码不是在内存中的,但由于被映射出来,占用了内存空间,所以对应的物理内存的空间就是空闲,没法使用的。当然这里的映射不是什么MapIoSpace,而是由主板上的ICH,MCH来完成的。
    因此你的1.25G如果是被硬件占用了,那就是没法使用的,用MmMapIoSpace也是不行的。
2013-6-7 14:13
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
3
我安装3GB的物理内存,系统只是使用了2.75GB,我装4GB物理内存系统也只是使用了2.75GB。说明什么?不是说明1.25Gb被空闲了吗?而硬件会占用的一部分物理空间应该是在2.75GB里面,不是吗?
2013-6-7 14:22
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我前面说的有点欠妥,物理地址空间跟CPU有关,跟多少物理内存无关,在32位非PAE系统下,物理地址空间就是4G。比如PCI占用了高1.25G空间,那你3G或4G内存,都只能用2.75G。
3G的地址空间是0x00000000 -- 0xC0000000。4G的地址空间是0x00000000--0xFFFFFFFF,假设PCI的地址空间是0xB0000000--0xFFFFFFFF。
那你不管3G或4G,都只能用0x00000000--0xB0000000,共2.75G空间
2013-6-7 14:45
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
5
所以我还是可以把 2.75GB外的物理内存 MapIoSpace 来用!因为MapIoSpace是 建立物理地址到线性地址的映射。
2013-6-7 14:49
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不可以,你的物理地址空间被PCI占用了,不是说你不能MapIoSpace,而是说你MAP的,不是你的物理内存,而是PCI的空间,你读写的,不是那个被占用的1.25G物理内存,而是硬件的地址空间。
2013-6-7 14:52
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
既然你知道MapIoSpace是建立物理地址到线性地址的映射,那你就应该明白,不是建立物理内存的映射,而是物理地址映射,你MAP成功后,返回了虚拟地址,当你读写这个虚拟地址,CPU会翻译成物理地址,这个物理地址和读写请求会发送到MCH(北桥)中,MCH如果发现这个物理地址被PCI或其他的占用等等,就会直接送往ICH(南桥),否则送往内存条。这个过程不是你控制的,也不是MAP就能解决的。
2013-6-7 15:00
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
老机器也许不能使用被PCI等设备占用的内存地址空间。但是新机器都可以使用的。只要开了PAE,所有的被占用的1.25G左右的内存会被映射到4G-5.25G这个地址范围内的物理内存。所以物理内存4G,实际就是可以使用4G的,分别是0-3.25G的空间和4G以上4G-4.75G左右的空间,当然如果集成显卡占用了部分内存做显存,那么要减掉那一部分显存,实际可用是-0-3.25G,4-4.5G,共3.75G,另外256M给了显卡了。
2013-6-7 15:05
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
9
那用哪个NT API可以建立物理内存到线性地址的映射?
2013-6-7 15:10
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
直接申请内核非分页内存就可以了。只是不知道你申请1.25G的非分页内存,能否成功。再说你要这么多非分页内存干什么。
2013-6-7 15:14
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
32位win7需要开pae,申请pae管理的内存吧。具体我不知道。64位的win7直接申请1.25G内核非分页内存应该可以成功,因为64位win7可以管理所有4G的物理内存,包括内存地址超过32位的4G-5G这一块的内存。而32位win7对4g-5G这一块的内存只能通过pae扩展来管理,和普通内存的api可能不同。
2013-6-7 15:18
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
12
我想把它虚拟成一个磁盘或光盘又或USB存储设备,也可以做为磁盘还原程序的位图信息或需要的数据保存。
2013-6-7 15:19
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
软件是搞不定的,这个需要硬件框架来处理,就跟aait说的一样,新机器在PAE的情况下,被占用了内存被映射到高于4G的空间,那是由硬件来保证的。但硬件有没有编程接口可以修改这种映射我就不知道了,这个估计你得去问问intel的南桥北桥了,windows更不用说了。
2013-6-7 15:19
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
windows可以使用,应该有pae扩展的api,你可以查查。
2013-6-7 15:23
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
32位应该申请不了那么大的,WINDOWS留给nonpaged的空间根本就没那么大,好像也就几百M吧。
2013-6-7 15:25
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
哪个API?
有PAE那就好说了,但PCI占用的问题和把被PCI占用的物理内存映射到其他地址空间那是硬件支持的,如果硬件不支持,有PAE也不好使啊。
2013-6-7 15:28
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
硬件的问题你不用管,如果硬件不支持,pae返回0,那你还申请什么?如果硬件支持,pae返回有1.25G,你就可以申请,可以使用了啊。具体的api我不清楚,需要查资料。
2013-6-7 15:37
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
MmAllocateContiguousMemorySpecifyCache?
2013-6-7 15:40
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
19
大家有谁看过 《Windows 内核情景分析》这本书? 那个内存管理一章 说得怎么样? Win7既然识别了是4GB物理内存,那它肯定有4GB的物理内存寻址表,只能用2.75GB,是因为物理内存寻址表只有2.75GB映射到虚拟内存线性地址表。没错吧?
2013-6-7 15:52
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
20
Win7 32位 你补丁了?
没补丁只是能看看而已~
2013-6-7 16:15
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
21
《Windows 内核情景分析》这本书讲的是 NT5.0 及以前的内核,Win7的内核已经有变化,只是对理解有帮助而已。
2013-6-7 16:23
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
http://blog.renren.com/share/295612111/6100949794
xp32位下4G内存使用详解,为什么xp配置4G无用

这篇文章讲解得很清楚了。

其中一段话:
微软在Windows上提供了一个简单明了的API组——也就是AWE地址窗口扩展API组,它仅仅由5个API调用组成,包括了核心级和用户级调用,
。。。。。。
通过使用AWE API,核心模式/用户模式可以轻易地突破2GB容量的限制,最高可以达到64GB,如SQL Server就使用了这个AWE API(可设定),从而提高对大容量内存的能力,大大提升了应用软件/系统的性能。
64bit系统中不存在这个问题,实际上,64bit系统不需要PAE的支持,也不支持AWE API,用户模式和核心模式的程序都可以直接访问非常大容量(8TB)的内存空间,
2013-6-7 16:55
0
游客
登录 | 注册 方可回帖
返回
//