首页
社区
课程
招聘
[讨论]分配的内存不是连续的?
发表于: 2011-3-3 17:30 4505

[讨论]分配的内存不是连续的?

2011-3-3 17:30
4505
今天写了个程序,R3和R0共享一块内存,结果出现了点问题,

程序是这样的:

R3用malloc分配一块大小为0x190的内存,然后把地址p1发给R0的驱动,
驱动得到地址后通过MmGetPhysicalAddress和MmMapIoSpace映射它,得到指针p2,

结果最终使用的时候发现,p1和p2中内容并不完全一样,我仔细看了一下,只有前面0x68字节的内容是一样的,后面的内容完全不一样。

我百思不得其解,结果后面发现MmGetPhysicalAddress(p1)得到的值是0x1A62BF98,而0x1A62BF98 + 0x68 = 0x1A62C000,刚好是一页。。

那么,是否可以这么认为,malloc分配的内存,其虚拟内存是连续的,但是这块虚拟内存对应的物理内存却分别指向了两个页面,其中前0x68字节是在0x1A62B000这页中,剩下的0x128字节则在另一页中,这两页并不是连续的。
而驱动中MmMapIoSpace(0x1A62BF98,0x190,)映射的是从0x1A62BF98到0x1A62BF98+0x190的这块物理地址?

如果是这样,那么如何保证申请的内存是在同一物理页中呢(需要分配的内存大小小于一页)?,如果分配的内存大于一页,怎么办呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
小于1页,使用_aligned_malloc申请内存。无论大小,都不应在内核中直接用该页,而应在内核中分配非分页内存,然后COPY。
2011-3-3 18:56
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
恩恩,三层和零层同一位看到的东西不一样。
2011-3-3 19:40
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
谢谢,我自己解决了,,
2011-3-3 21:16
0
游客
登录 | 注册 方可回帖
返回
//