2013-06-20 53 views
2

我正在尋找直接從我的C代碼中獲取巨大頁面大小的值,而無需運行bash命令。如何獲得巨大頁面大小的值?

從bash的我能做到這一點

grep pse /proc/cpuinfo > /dev/null && echo '2M huge page size are supported' 
grep pdpe1gb /proc/cpuinfo> /dev/null && echo '1G huge page size are supported' 

其次如何使用mmap擁有1G大內存頁的大小?

感謝

更新

代碼片段

#include <stdio.h> 
#include <limits.h> 
#include <hugetlbfs.h> 

int main(void){ 
    long result1 = gethugepagesize(); 
    printf("%d\n", result1); 
    long result2 = gethugepagesizes(NULL, 0); 
    printf("%d\n", result2); 
    long result3 = getpagesizes(NULL, 0); 
    printf("%d\n", result3); 
    printf("%d\n", PF_LINUX_HUGETLB); 
    return 0; 
} 

輸出

2097152 
1 
2 
1048576 

這裏gethugepagesize返回2 MB什麼巨大的1Gb頁面?

回答

3

試試看。

#include <hugetlbfs.h> 
int getpagesizes(long pagesizes[], int n_elem); 
+0

謝謝,這個功能很有幫助。我將閱讀更多關於這個API的信息,看看如何使用1G大頁面大小的mmap。 – bioinfornatics

1

由於我沒有足夠的聲望發表評論,我將在一個答覆中發佈。

我修改你的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <hugetlbfs.h> 

void dump_page_sizes_arr(int (getter_fn)(long pagesizes[], int n_elem), int elem) { 

    int elem_alloc, i; 
    long *pagesizes = NULL; 

    if(elem <= 0) return; 

    pagesizes = calloc(elem, sizeof(long)); 
    if(pagesizes == NULL) return; 

    elem_alloc = getter_fn(pagesizes, elem); 
    if (elem_alloc != elem) goto stop; 

    for(i=0; i<elem_alloc; i++) printf(" %ld\n", pagesizes[i]); 

stop: 
    free(pagesizes); 
} 

int main(void){ 

    long result1 = gethugepagesize(); 
    printf("huge page size = %ld\n", result1); 

    int result2 = gethugepagesizes(NULL, 0); 
    printf("huge page sizes [%d] =\n", result2); 
    dump_page_sizes_arr(gethugepagesizes, result2); 

    int result3 = getpagesizes(NULL, 0); 
    printf("page sizes [%d] =\n", result3); 
    dump_page_sizes_arr(getpagesizes, result3); 

    printf("PF_LINUX_HUGETLB = %d\n", PF_LINUX_HUGETLB); 

    return 0; 
} 

而且似乎我收到我的系統上非常相似的結果(薄荷17.3 64 + 2吉布RAM):

huge page size = 2097152 
huge page sizes [1] = 
2097152 
page sizes [2] = 
4096 
2097152 
PF_LINUX_HUGETLB = 1048576 

因此,要回答你的問題:

1Gb大頁面呢?

......看來你的系統不支持它。