에있는 파일을 매핑. 그것은 항상 EINVAL 실패거대한 페이지는 내가 리눅스 3.13에 메모리 매핑 파일과 거대한 페이지를 사용하려면 리눅스
#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
size_t size = 2 * 1024 * 1024; /* 1 huge page */
int fd = open("foo.bar", O_RDWR|O_CREAT, 0666);
assert(fd >= 0);
int rc = ftruncate(fd, size);
assert(rc == 0);
void* hint = 0;
int flags = MAP_SHARED | MAP_HUGETLB;
void* data = mmap(hint, size, PROT_READ|PROT_WRITE, flags, fd, 0);
if (data == MAP_FAILED)
perror("mmap");
assert(data != MAP_FAILED);
}
:
sudo apt-get install hugepages
sudo hugeadm --pool-pages-min=2048K:10
가 그럼 난이 테스트 프로그램을 실행 :
가 시작하려면, 우분투에 나는이 10 거대한 페이지를 할당했다. 당신이 MAP_PRIVATE|MAP_ANONYMOUS
에 flags
을 변경하는 경우 그것은 작동하지만, 물론 그것은 파일에 아무것도 쓰지 않습니다.
MAP_HUGETLB
없이
mmap()
후
madvise()
를 사용하여 시도 :
MAP_ANONYMOUS
를 사용하지 않을 경우
가
rc = madvise(data, size, MADV_HUGEPAGE);
if (rc != 0)
perror("madvise");
assert(rc == 0);
이것은 또한 (EINVAL
)를 실패합니다.
디스크에 메모리 매핑 파일이 포함 된 거대한 페이지를 활성화하는 방법이 있습니까?
분명히하기 위해 C에서이 작업을 수행 할 방법을 찾고 있습니다. 기존 실행 파일에 적용 할 솔루션을 요구하지 않았습니다. 그런 다음 질문은 수퍼 유저에 속합니다.
나는 운 좋게도 비슷한 것들을 시도해 왔습니다. 솔루션을 제안한 경우 공유하십시오 :) BTW :이 QA를 읽었습니까? http://stackoverflow.com/questions/30470972/using-mmap-and-madvise-for-huge-pages 해결할 수 없습니다. 내 문제 그러나 일부 커널 문서에 대한 링크를 제공합니다. 나는 그 문서를 따르도록 노력 - 아직 운이없이하지만, 아마도 당신은 그것의 무언가를 만들 수 있습니다. – 4386427