EN JA
MEM(4)
MEM(4) FreeBSD Kernel Interfaces Manual MEM(4)

名称

mem, kmemメモリファイル

書式

device mem

解説

スペシャルファイル /dev/mem は、コンピュータの物理メモリへのインタフェースです。このファイルでのバイトオフセットは、物理メモリアドレスとして解釈されます。このファイルを読み書きすることは、メモリ自体を読み書きすることと同等です。 /dev/mem の範囲内のオフセットだけが許されています。

カーネル仮想記憶は、 /dev/mem と同じ方法で /dev/kmem インタフェースを通してアクセスされます。現在メモリにマップされているカーネル仮想アドレスだけが許されます。

ISA では、 I/O メモリ空間は、物理アドレス 0x000a0000 から始まって 0x00100000 まで達します。現在プロセスのためのプロセスごとのデータサイズは、 UPAGES であり、仮想アドレス 0xf0000000 で終わります。

IOCTL インタフェース

いくつかのアーキテクチャは、物理メモリの範囲に関連している属性を許します。これらの属性は、 /dev/mem で実行された ioctl() 呼び出しによって操作できます。宣言とデータ型は、 < sys/memrange.h> に存在します。

特有の属性とプログラム可能な範囲の数は、アーキテクチャの間で異なります。サポートしている属性の一式は、次の通りです:

MDF_UNCACHEABLE
範囲は、キャッシュされていません。
MDF_WRITECOMBINE
範囲への書き込みは、結合されているか異常な実行です。
MDF_WRITETHROUGH
範囲への書き込みが同時に行なわれました。
MDF_WRITEBACK
範囲への書き込みが同時に行なわれました。
MDF_WRITEPROTECT
範囲に書き込むことができません。

メモリ範囲は、 struct mem_range_desc で説明されています:

uint64_t mr_base; /∗物理基本アドレス∗/ 
uint64_t mr_len;  /∗範囲の物理長∗/ 
int  mr_flags; /∗範囲の属性∗/ 
char  mr_owner[8];

また、上にリストされた範囲属性に加えて、次のフラグは、 mr_flags フィールドに設定できます:

MDF_FIXBASE
範囲のベースアドレスを変更することができません。
MDF_FIXLEN
範囲の長さを変更することができません。
MDF_FIRMWARE
範囲は、システムファームウェアによって確立されたと信じられています。
MDF_ACTIVE
範囲は、現在アクティブです。
MDF_BOGUS
範囲が無効であるか、そうでなければ、誤りがあると信じています。
MDF_FIXACTIVE
範囲を無効にできません。
MDF_BUSY
範囲は、現在別のプロセスで所有されて、変更できません。

操作は、 struct mem_range_op を使用することで実行されます:

struct mem_range_desc *mo_desc; 
int   mo_arg[2];

MEMRANGE_GET ioctl は、現在のメモリ範囲属性を検索して取り出すために使用されます。 mo_arg[0] が 0 に設定されるなら、メモリ範囲記述子の総数でそれを更新します。 0 以上であるなら、 mo_desc の配列は、対応する記述子構造体の数か、どちらかが少ないかなら、最大が入れられます。

MEMRANGE_SET ioctl は、メモリ範囲属性を追加する、変更する、削除するために使用されます。 MDF_FIXACTIVE フラグがある範囲は、削除できません。 MDF_BUSY フラグがある範囲は、削除も更新もできません。

mo_arg[0] は、存在するか新しい範囲を確立して更新するために MEMRANGE_SET_UPDATE に設定し、範囲を削除するために MEMRANGE_SET_REMOVE に設定するべきです。

戻り値

[ EOPNOTSUPP]
メモリ範囲操作は、このアーキテクチャでサポートされません。
[ ENXIO]
メモリ範囲記述子は、利用可能ではありません (例えば、ファームウェアは、いずれも有効ではありません)。
[ EINVAL]
引数として供給されたメモリ範囲は、無効であるかこのアーキテクチャによってサポートされなかった方法で別の範囲に重なります。
[ EBUSY]
範囲がビジーであるので、範囲を削除するか更新する試みは、失敗しました。
[ ENOSPC]
新しい範囲を作成する試みは、ハードウェアリソース (例えば、記述子スロット) が不足したために失敗しました。
[ ENOENT]
範囲は、供給された記述子 base/length に一致しないので、範囲を削除する試みは、失敗しました。
[ EPERM]
範囲が永久に有効にされるので、範囲を削除する試みは、失敗しました。

関連ファイル

/dev/mem
/dev/kmem

関連項目

kvm(3), memcontrol(8)

歴史

memkmem ファイルは、 Version 6 AT&T UNIX で登場しました。メモリ範囲属性のための ioctl インタフェースは、 FreeBSD 3.2 で追加されました。

バグ

ビジー範囲属性は、まだ正しく管理されていません。

このデバイスは、 kvm(3) のすべてのユーザが操作するために必要です。

October 3, 2004 FreeBSD