2017-08-31 2 views
5

Intel x86-64マザーボードに2枚のDIMMを挿入したとします。すべてのメモリインターリーブ(バンクおよびチャネル)が無効になります。DIMMへのダイレクトメモリマッピング

Linux kernel(バージョン4.11.11)のDIMMの1つの物理メモリスペースを予約し、その物理的(予約済み)メモリスペースをアプリケーションに公開することを試みています。 DIMMはメモリチャネルででなく、になります。これをどうやってやりますか?どのようなプロセスですか?私はカーネル開発の初心者であり、ガイダンスを使用することができます。

  1. をあなたはmemmap=nn[KMG]$ss[KMG]ブートパラメータを指定することができ、Linuxカーネルからメモリを確保するために:私はこれまでに発見した何

    。このパラメータは、特定のメモリをssからss + nnまでのメモリの予約領域としてマークします。

  2. mmapは、ファイル記述子によって表されるメモリ・オブジェクトにLENバイトのアドレスPAfildesがをプロセスのアドレス空間との間のマッピングを確立するために使用することができるでオフオフセットlenバイトです。

メモリが予約された後、予約されたメモリをユーザースペースアプリケーションに公開するために、一部の文字デバイスドライバが必要であると仮定していますか?思考?


アップデートは

また、予約する必要DIMMは、それ自身の専用のメモリチャネルと全く銀行またはチャネルインターリーブが有効にされませんになりますことに留意すべきです。

+0

DIMM部分が画像全体にどのようにフィットするかわかりません。とにかく、 '/ dev/mem'のようなものはありませんか?予約されたメモリがそのようなデバイスによってマッピングされるかどうかはわかりません。 –

+0

@MargaretBloom DIMMについては何が分かりませんか?私は、いずれかのDIMM上のすべてのメモリをカーネルの使用から予約しようとしています。それは明確ですか? '/ dev/mem'はカーネルが使用できるすべてのメモリを表しますので、必要なものを必ずしも代表するものではありません。 – Jonathan

+0

フラグargに未使用のビットがある場合は、 'mmap'の新しいフラグ、つまり' MAP_RESERVED_DIMM'を定義して公開することができます。 HugeTLBFSは別のモデルです。ファイルをマップして、バッキングメモリに関する特別なものを使ってマッピングを得ることができる特別なファイルシステムです。私はLinux内部の専門家ではありませんが、興味のあるアマチュアですが、チャーやブロックデバイスの考えもうまくいくかもしれません。特に、一度に1つのユーザー空間プロセスを使用する予定がある場合は、それ以外の場合は、どの部分が既にマップされているか把握させてください。 –

答えて

0

マッピング/dev/memは簡単な方法です。私は以前これをしてきました。 mmapkernel sourceから実装:

static int mmap_mem(struct file *file, struct vm_area_struct *vma) 
{ 
    size_t size = vma->vm_end - vma->vm_start; 
    phys_addr_t offset = (phys_addr_t)vma->vm_pgoff << PAGE_SHIFT; 

    /* It's illegal to wrap around the end of the physical address space. */ 
    if (offset + (phys_addr_t)size - 1 < offset) 
     return -EINVAL; 

    if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size)) 
     return -EINVAL; 

    if (!private_mapping_ok(vma)) 
     return -ENOSYS; 

    if (!range_is_allowed(vma->vm_pgoff, size)) 
     return -EPERM; 

    if (!phys_mem_access_prot_allowed(file, vma->vm_pgoff, size, 
         &vma->vm_page_prot)) 
     return -EINVAL; 

    vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff, 
         size, 
         vma->vm_page_prot); 

    vma->vm_ops = &mmap_mem_ops; 

    /* Remap-pfn-range will mark the range VM_IO */ 
    if (remap_pfn_range(vma, 
       vma->vm_start, 
       vma->vm_pgoff, 
       size, 
       vma->vm_page_prot)) { 
     return -EAGAIN; 
    } 
    return 0; 
} 

変更する必要があるかもしれない唯一のものはvalid_mmap_phys_addr_range(vma->vm_pgoff, size)です。または、/dev/memドライバの独自のバージョンを書くことができます。

+0

しかし、物理メモリの領域を他の用途に使用するのを止める**割り当て/予約**はしていませんか?そしてそのコメントが示すように、 'VM_IO'としてマップされていることの意味は何ですか? mmap(/ dev/mem)は完全な答えの役に立つ部分かもしれませんが、私はこの部分が難しい部分だとは思わなかった。 –

+0

'mem = xx'コマンドラインを使って、カーネルがメモリの一部だけを使うようにします。例えば、 'mem = 4G'を渡すと、カーネルは4G以下のメモリしか使用しません。そして、修正された'/dev/mem'ドライバを使用して4Gを超えるメモリをmmapすることができます。 –

+0

これは興味深い考えです。インタリーブなしのOPのセットアップではうまくいくはずです。 '/ dev/mem'はまだカーネルの残りの部分が存在すると思われる範囲外のメモリにアクセスできますか? –

関連する問題