怎么申请连续的物理内存空间

时间:2022-07-29 04:29:29
内存从128M换成了256M,写个程序去访问后面空间,本来用malloc来申请,领导说malloc申请的不一定是连续的物理内存空间,好像有一个系统函数能申请一个连续的物理内存空间,有没人知道的啊,

21 个解决方案

#1


ioremap,不过这个是linux内核的函数,应用层是木有办法获得大片连续物理空间的

#2


ioremap,这个不是io映射的吗,还有好像可以用__get_free_page,不过不会用啊,有没用过的啊,

#3


关注等正确解答             

#4


malloc申请的是连续的吧好像?malloc(size*num) 这个是num个连续的地址空间吧。

#5


看看这个,是否对你有帮助:
http://blog.163.com/toplcx@yeah/blog/static/92667383201041764320433/

#6


windows? linux?
windows参考VirtualAlloc

#7


引用 2 楼 Diwat 的回复:
ioremap,这个不是io映射的吗,还有好像可以用__get_free_page,不过不会用啊,有没用过的啊,


内存是给os管起来的,你没办法从os那里获得大片连续的物理内存. get_free_page也是,通常不能超过64KB,vmalloc到时可以获得很大的空间,但是和malloc一样面临地址不连续的问题.

#8


内核态这种事情好办,用kalloc或者DMA相关的接口比如dma_zalloc_coherent,楼主可以考虑下用户态有没有与之对应的接口哦!

#9


mlock/munlock,VirtualLock/VirtualUnlock锁定后的内存应该是连续的;

#10


实模式编程?禁止 mmu?

#11


Memory Management Functions
The following functions are used in memory management. 

  
 
CopyMemory  
FillMemory  
GetProcessHeap  
GetProcessHeaps  
GlobalMemoryStatus  
HeapAlloc  
HeapCompact  
HeapCreate  
HeapDestroy  
HeapFree  
HeapLock  
HeapReAlloc  
HeapSize  
HeapUnlock  
HeapValidate  
HeapWalk  
IsBadCodePtr  
IsBadReadPtr  
IsBadStringPtr  
IsBadWritePtr  
MoveMemory  
VirtualAlloc  
VirtualAllocEx  
VirtualFree  
VirtualFreeEx  
VirtualLock  
VirtualProtect  
VirtualProtectEx  
VirtualQuery  
VirtualQueryEx  
VirtualUnlock  
ZeroMemory  


VLM Functions
  
  
CopyMemoryVlm  
FillMemoryVlm  
GlobalMemoryStatusVlm  
MapViewOfFileVlm  
MoveMemoryVlm  
ReadFileVlm  
ReadProcessMemoryVlm  
UnmapViewOfFileVlm  
VirtualAllocVlm  
VirtualFreeVlm  
VirtualProtectVlm  
VirtualQueryVlm  
WriteFileVlm  
WriteProcessMemoryVlm  
ZeroMemoryVlm  


Global and Local Functions
  
  
GlobalAlloc  
GlobalDiscard  
GlobalFlags  
GlobalFree  
GlobalHandle  
GlobalLock  
GlobalReAlloc  
GlobalSize  
GlobalUnlock  
LocalAlloc  
LocalDiscard  
LocalFlags  
LocalFree  
LocalHandle  
LocalLock  
LocalReAlloc  
LocalSize  
LocalUnlock  

#12


realloc

#13


引用 12 楼 lin5161678 的回复:
realloc
哦 我错了

#14


calloc可以申请出n个连续的内存空间

#15


要想使用物理内存是不容易的,在Windows下,驱动程序,可以获取 连续的非分页内存,基本上可以看成是连续的物理内存。
另外进行DMA操作的时候,一定要使用连续的物理内存,这些只有驱动程序才有能力做到,普通的 exe程序要想使用 连续的,大块的物理内存是很 困难的。

#16


引用 15 楼 lm_whales 的回复:
要想使用物理内存是不容易的,在Windows下,驱动程序,可以获取 连续的非分页内存,基本上可以看成是连续的物理内存。
另外进行DMA操作的时候,一定要使用连续的物理内存,这些只有驱动程序才有能力做到,普通的 exe程序要想使用 连续的,大块的物理内存是很 困难的。

言之有理。
参考《深入解析Windows操作系统-Windows Internals》
内存管理相关内容。

#17


为什么要申请连续的呢,一般用链表不也可以吗

#18


一般常用的有以下:
应用程序一般使用VirtualAlloc, HeapAlloc, malloc和new申请内存和堆栈

#19


连续物理内存?你那是干什么用的啊,不会是驱动吧?还是表述有问题?

#20


malloc realloc是我所知全部

#21


如果要分配大量的连续物理内存,get-free-pages,kmem_cache_alloc,kmalloc、vmalloc、ioremap都不能满足,应该用BootMemory函数,在linux内核引导阶段来预留部分内存。

#1


ioremap,不过这个是linux内核的函数,应用层是木有办法获得大片连续物理空间的

#2


ioremap,这个不是io映射的吗,还有好像可以用__get_free_page,不过不会用啊,有没用过的啊,

#3


关注等正确解答             

#4


malloc申请的是连续的吧好像?malloc(size*num) 这个是num个连续的地址空间吧。

#5


看看这个,是否对你有帮助:
http://blog.163.com/toplcx@yeah/blog/static/92667383201041764320433/

#6


windows? linux?
windows参考VirtualAlloc

#7


引用 2 楼 Diwat 的回复:
ioremap,这个不是io映射的吗,还有好像可以用__get_free_page,不过不会用啊,有没用过的啊,


内存是给os管起来的,你没办法从os那里获得大片连续的物理内存. get_free_page也是,通常不能超过64KB,vmalloc到时可以获得很大的空间,但是和malloc一样面临地址不连续的问题.

#8


内核态这种事情好办,用kalloc或者DMA相关的接口比如dma_zalloc_coherent,楼主可以考虑下用户态有没有与之对应的接口哦!

#9


mlock/munlock,VirtualLock/VirtualUnlock锁定后的内存应该是连续的;

#10


实模式编程?禁止 mmu?

#11


Memory Management Functions
The following functions are used in memory management. 

  
 
CopyMemory  
FillMemory  
GetProcessHeap  
GetProcessHeaps  
GlobalMemoryStatus  
HeapAlloc  
HeapCompact  
HeapCreate  
HeapDestroy  
HeapFree  
HeapLock  
HeapReAlloc  
HeapSize  
HeapUnlock  
HeapValidate  
HeapWalk  
IsBadCodePtr  
IsBadReadPtr  
IsBadStringPtr  
IsBadWritePtr  
MoveMemory  
VirtualAlloc  
VirtualAllocEx  
VirtualFree  
VirtualFreeEx  
VirtualLock  
VirtualProtect  
VirtualProtectEx  
VirtualQuery  
VirtualQueryEx  
VirtualUnlock  
ZeroMemory  


VLM Functions
  
  
CopyMemoryVlm  
FillMemoryVlm  
GlobalMemoryStatusVlm  
MapViewOfFileVlm  
MoveMemoryVlm  
ReadFileVlm  
ReadProcessMemoryVlm  
UnmapViewOfFileVlm  
VirtualAllocVlm  
VirtualFreeVlm  
VirtualProtectVlm  
VirtualQueryVlm  
WriteFileVlm  
WriteProcessMemoryVlm  
ZeroMemoryVlm  


Global and Local Functions
  
  
GlobalAlloc  
GlobalDiscard  
GlobalFlags  
GlobalFree  
GlobalHandle  
GlobalLock  
GlobalReAlloc  
GlobalSize  
GlobalUnlock  
LocalAlloc  
LocalDiscard  
LocalFlags  
LocalFree  
LocalHandle  
LocalLock  
LocalReAlloc  
LocalSize  
LocalUnlock  

#12


realloc

#13


引用 12 楼 lin5161678 的回复:
realloc
哦 我错了

#14


calloc可以申请出n个连续的内存空间

#15


要想使用物理内存是不容易的,在Windows下,驱动程序,可以获取 连续的非分页内存,基本上可以看成是连续的物理内存。
另外进行DMA操作的时候,一定要使用连续的物理内存,这些只有驱动程序才有能力做到,普通的 exe程序要想使用 连续的,大块的物理内存是很 困难的。

#16


引用 15 楼 lm_whales 的回复:
要想使用物理内存是不容易的,在Windows下,驱动程序,可以获取 连续的非分页内存,基本上可以看成是连续的物理内存。
另外进行DMA操作的时候,一定要使用连续的物理内存,这些只有驱动程序才有能力做到,普通的 exe程序要想使用 连续的,大块的物理内存是很 困难的。

言之有理。
参考《深入解析Windows操作系统-Windows Internals》
内存管理相关内容。

#17


为什么要申请连续的呢,一般用链表不也可以吗

#18


一般常用的有以下:
应用程序一般使用VirtualAlloc, HeapAlloc, malloc和new申请内存和堆栈

#19


连续物理内存?你那是干什么用的啊,不会是驱动吧?还是表述有问题?

#20


malloc realloc是我所知全部

#21


如果要分配大量的连续物理内存,get-free-pages,kmem_cache_alloc,kmalloc、vmalloc、ioremap都不能满足,应该用BootMemory函数,在linux内核引导阶段来预留部分内存。