我们可以通过 mmap() 分配物理上连续的内存吗?
Can we allocate physically contiguous memory by mmap()?
出于实验目的,我需要 aarch64 Linux 4.15 中的物理连续内存。
我猜测如果所需的大小小于页面大小,分配的内存可能在物理上是连续的,如下所示。
void * p = mmap(0, getpagesize() - 1, PROT_READ | PROT_WRITE, MAP_SHARED, 0, 0);
分配后,我会通过/proc/self/pagemap
来识别它的物理地址。
但是我找不到任何关于此的文档。
我可以分配物理上连续的内存吗?
谢谢。
您几乎无法控制物理内存位置。在页面内,内存将是连续的(它或多或少是页面的定义)。但是在虚拟地址 space 中连续的不同页面在物理地址 space 中不需要连续(并且在物理地址 space 中连续的页面在虚拟地址中不需要连续space).
除非您将在内核内存管理的最低级别工作,否则您将无法快速发现物理连续性。
如果内存在 Linux 和其他内存之间是双端口的,那么您可能会遇到问题,但仅使用 mmap()
无法解决问题。
出于实验目的,我需要 aarch64 Linux 4.15 中的物理连续内存。
我猜测如果所需的大小小于页面大小,分配的内存可能在物理上是连续的,如下所示。
void * p = mmap(0, getpagesize() - 1, PROT_READ | PROT_WRITE, MAP_SHARED, 0, 0);
分配后,我会通过/proc/self/pagemap
来识别它的物理地址。
但是我找不到任何关于此的文档。 我可以分配物理上连续的内存吗?
谢谢。
您几乎无法控制物理内存位置。在页面内,内存将是连续的(它或多或少是页面的定义)。但是在虚拟地址 space 中连续的不同页面在物理地址 space 中不需要连续(并且在物理地址 space 中连续的页面在虚拟地址中不需要连续space).
除非您将在内核内存管理的最低级别工作,否则您将无法快速发现物理连续性。
如果内存在 Linux 和其他内存之间是双端口的,那么您可能会遇到问题,但仅使用 mmap()
无法解决问题。