linux/Documentation/vm/map_hugetlb.c
<<
>>
Prefs
   1/*
   2 * Example of using hugepage memory in a user application using the mmap
   3 * system call with MAP_HUGETLB flag.  Before running this program make
   4 * sure the administrator has allocated enough default sized huge pages
   5 * to cover the 256 MB allocation.
   6 *
   7 * For ia64 architecture, Linux kernel reserves Region number 4 for hugepages.
   8 * That means the addresses starting with 0x800000... will need to be
   9 * specified.  Specifying a fixed address is not required on ppc64, i386
  10 * or x86_64.
  11 */
  12#include <stdlib.h>
  13#include <stdio.h>
  14#include <unistd.h>
  15#include <sys/mman.h>
  16#include <fcntl.h>
  17
  18#define LENGTH (256UL*1024*1024)
  19#define PROTECTION (PROT_READ | PROT_WRITE)
  20
  21#ifndef MAP_HUGETLB
  22#define MAP_HUGETLB 0x40
  23#endif
  24
  25/* Only ia64 requires this */
  26#ifdef __ia64__
  27#define ADDR (void *)(0x8000000000000000UL)
  28#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED)
  29#else
  30#define ADDR (void *)(0x0UL)
  31#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB)
  32#endif
  33
  34void check_bytes(char *addr)
  35{
  36        printf("First hex is %x\n", *((unsigned int *)addr));
  37}
  38
  39void write_bytes(char *addr)
  40{
  41        unsigned long i;
  42
  43        for (i = 0; i < LENGTH; i++)
  44                *(addr + i) = (char)i;
  45}
  46
  47void read_bytes(char *addr)
  48{
  49        unsigned long i;
  50
  51        check_bytes(addr);
  52        for (i = 0; i < LENGTH; i++)
  53                if (*(addr + i) != (char)i) {
  54                        printf("Mismatch at %lu\n", i);
  55                        break;
  56                }
  57}
  58
  59int main(void)
  60{
  61        void *addr;
  62
  63        addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0);
  64        if (addr == MAP_FAILED) {
  65                perror("mmap");
  66                exit(1);
  67        }
  68
  69        printf("Returned address is %p\n", addr);
  70        check_bytes(addr);
  71        write_bytes(addr);
  72        read_bytes(addr);
  73
  74        munmap(addr, LENGTH);
  75
  76        return 0;
  77}
  78