熊二修Linux传:
使用大页需要mmap来申请。
参见man mmap:
MMAP(2) Linux Programmer's Manual MMAP(2)
NAME
mmap, munmap - map or unmap files or devices into memory
SYNOPSIS
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);
See NOTES for information on feature test macro requirements.
The flags argument
MAP_HUGETLB (since Linux 2.6.32)
Allocate the mapping using "huge pages." See the Linux kernel source file Documentation/admin-guide/mm/hugetlbpage.rst for
further information, as well as NOTES, below.
这样明显会方便些,但是大内存页面预留的操作还是要做的,我们来演示下,先来准备环境:
root@wzm-phytium-d2000:~# cat /proc/sys/vm/nr_hugepages
0
root@wzm-phytium-d2000:~# echo 100 /proc/sys/vm/nr_hugepages
100 /proc/sys/vm/nr_hugepages
root@wzm-phytium-d2000:~# echo 100 >/proc/sys/vm/nr_hugepages
root@wzm-phytium-d2000:~# cat /proc/meminfo |grep -i huge
AnonHugePages: 100352 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 100
HugePages_Free: 100
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 204800 kB
再来看演示代码如下:# cat huge.c
#include <sys/mman.h>
#include <stdio.h>
#include <memory.h>
int main(int argc, char *argv[]) {
char *m;
size_t s = (8UL * 1024 * 1024);
m = mmap(NULL, s, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | 0x40000 /*MAP_HUGETLB*/, -1, 0);
if (m == MAP_FAILED) {
perror("map mem");
m = NULL;
return 1;
}
memset(m, 0, s);
printf("map_hugetlb ok, press ENTER to quit!\n");
getchar();
munmap(m, s);
return 0;
}
# gcc huge.c
# ./a.out
map_hugetlb ok, press ENTER to quit!
我们成功用大页面申请了8M内存,4个大页面,同时进行清零操作成功,再munmap之前,我们需要确认内存确实是被我们使用了。
好,切换到另外一个窗口来看下:
root@wzm-phytium-d2000:/home/wzm# cat /proc/meminfo |grep -i huge
AnonHugePages: 100352 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 100
HugePages_Free: 96
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: