我想在Linux机器使用的大页面上分配内存.我看到有两种方法可以做到这一点,使用mmap和madvise.
也就是说,使用MAP_HUGETLB带有mmap调用的标志-
base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
Run Code Online (Sandbox Code Playgroud)
和呼号的MADV_HUGEPAGE旗帜madvise-
madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);
Run Code Online (Sandbox Code Playgroud)
有人可以解释两者之间的区别吗?
我需要有关在运行树莓派操作系统 64 位的树莓派 4 上管理大页的帮助。
我在网上没有找到太多可靠的信息。
首先我重新编译了内核源启用Memory Management options --->Transparent Hugepage Support选项。当我运行命令时:
grep -i huge /proc/meminfo
输出是:
AnonHugePages: 319488 kB
ShmemHugePages: 0 kB
FileHugePages: 0 k
Run Code Online (Sandbox Code Playgroud)
并运行命令:
cat /sys/kernel/mm/transparent_hugepage/enabled
Run Code Online (Sandbox Code Playgroud)
输出是:
[always] madvise never
Run Code Online (Sandbox Code Playgroud)
所以我认为应该设置透明大页(AnonHugePages)。我需要使用 HugePages 使用 mmap 函数、c 代码来映射最大的连续内存块。
mem = mmap(NULL,buf_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
Run Code Online (Sandbox Code Playgroud)
查看https://www.man7.org/linux/man-pages/man2/mmap.2.html有两个标志来管理大页:MAP_HUGETLB 标志和 MAP_HUGE_2MB、MAP_HUGE_1GB 标志。
我的问题是:要使用 HugePages,我应该以这种方式映射吗?
mem = mmap(NULL,buf_size,PROT_READ|PROT_WRITE,MAP_SHARED,MAP_HUGETLB,fd,0);
Run Code Online (Sandbox Code Playgroud)
内核配置:
CONFIG_SYS_SUPPORTS_HUGETLBFS=y
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_HUGE_VMAP=y
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
CONFIG_TRANSPARENT_HUGE_PAGECACHE=y
# CONFIG_HUGETLBFS is not set
Run Code Online (Sandbox Code Playgroud)