阅读:1393回复:6
内存分配的问题?
我现在在User Mode分配一块至少1M的内存,然后用MmGetPhysicalAddress得到每4k的物理地址,但发现只有第一个4k能获得物理地址,后面的得出的物理地址全是零。
请各位大侠帮小弟看看是什么问题?在User Mode应该怎么分配? |
|
沙发#
发布于:2002-05-18 16:33
user mode分配内存,一般是分配virtual address,我记得好像只会给第一页(4K)分配物理内存,其他的实际上不在物理内存的,需要的时候才分配。
我想应该是GlobalAlloc(),GlobalLock这几个函数吧。 |
|
板凳#
发布于:2002-05-19 00:05
我现在用的就是GlobalAlloc,GlobalLock分配的内存。但最大也只能分配500K,超过500K就会出现上面的现象。
|
|
地板#
发布于:2002-05-19 00:19
那你看看在堆里面分配内存,看看可不可以吧!
|
|
地下室#
发布于:2002-05-19 16:43
用VirtualAlloc先保留一块地址空间(address space),在根据需要,在你保留的空间,提交(commit)物理空间。
#define PAGELIMIT 80 // ask for this many pages lpvBase = VirtualAlloc( NULL, // system selects address PAGELIMIT*dwPageSize, // size of allocation MEM_RESERVE, // allocate reserved pages PAGE_NOACCESS); // protection = no access lpvResult = VirtualAlloc( (LPVOID) lpNxtPage, // next page to commit dwPageSize, // page size, in bytes MEM_COMMIT, // allocate a committed page PAGE_READWRITE); // read/write access 详细请看MSDN,SDK Documentation,Base Service,Memory 这样应该可以的。不保证non-paged |
|
5楼#
发布于:2002-05-19 21:52
你可以先用VirtualLock锁定啊,用完后再解锁就行了
|
|
|
6楼#
发布于:2002-05-20 09:09
faint,怎么忘了VirtualLock? :D
|
|