9.4. mmap() システムコールを使用してファイルまたはデバイスをメモリーにマップする

リアルタイムシステムで大量のメモリーを割り当てる場合、メモリー割り当て (malloc) メソッドは mmap() システムコールを使用してメモリー空間を見つけます。flags パラメーターに MAP_LOCKED を設定することで、メモリー領域を割り当てて、ロックできます。mmap() はページ単位でメモリーを割り当てるため、同じページで 2 つのロックが行われるのを回避し、二重ロックまたは単一ロック解除の問題を防ぎます。

前提条件

  • システムの root 権限がある。

手順

  • 特定のプロセスアドレス空間をマッピングするには、次のようにします。

    #include <sys/mman.h>
    #include <stdlib.h>
    
    void *alloc_workbuf(size_t size)
    {
     void *ptr;
    
     ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
                MAP_PRIVATE | MAP_ANONYMOUS | MAP_LOCKED, -1, 0);
    
     if (ptr == MAP_FAILED)
      return NULL;
    
     return ptr;
    }
    
    void
    free_workbuf(void *ptr, size_t size)
    {
     munmap(ptr, size);
    }

検証

  • mmap() 関数が正常に完了すると、マップされた領域へのポインターが返されます。エラーの場合は、MAP_FAILED 値を返し、エラーを示す errno を設定します。
  • munmap() 関数が正常に完了すると、0 が返されます。エラーの場合は -1 を返し、エラーを示す errno を設定します。

関連情報

  • mmap(2) man ページ
  • mlockall(2) man ページ