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
歴史
mem と kmem ファイルは、 Version 6 AT&T UNIX で登場しました。メモリ範囲属性のための ioctl インタフェースは、 FreeBSD 3.2 で追加されました。バグ
ビジー範囲属性は、まだ正しく管理されていません。このデバイスは、 kvm(3) のすべてのユーザが操作するために必要です。
October 3, 2004 | FreeBSD |