だから私はいつもMMUがアドレスを物理アドレスに変換するUnixカーネルの一部だと思いましたが、MMU WikiページではMMUが通常は独自のメモリを持つコンピュータハードウェアの一部であると言いますが、ページではMMUについてあまり言及していません。 Unix / Linuxオペレーティングシステム
だから混乱しています。すべての変換がハードウェアで行われ、カーネルは変換を実行しませんか?デフォルトでは、オペレーティングシステムは実際の物理アドレスについて何も知りません。
Unixベースのオペレーティングシステムについて尋ねていますが、他のオペレーティングシステム(Windowsなど)についても知っているか、最新のコンピュータで一般的に使用されている場合はお知らせください。ありがとうございます。
答え1
MMU(メモリ管理装置)コンピュータシステムの物理コンポーネントであり、通常(必ずしもそうではない)CPUの一部です。仮想アドレス(x86世界では線形アドレスとも呼ばれます)を物理アドレスに変換します。また、メモリアクセス制御、キャッシュ制御、バス調停を実行することもできます。通常、それ自身のメモリがなく、システムのメインメモリのデータに依存して動作します。
MMUは、データ構造(ページテーブルなど)に格納されている情報を使用してこの変換を実行します。これは、線形アドレス範囲に対応する物理アドレス範囲を指定します(存在する場合、ページは「存在しない」可能性があります)。ページテーブルは、マッピングが何であるかを決定するカーネルによって設定されます。したがって、物理アドレスに対する最終権限はカーネルですが、常にMMUの助けを借りて機能します。つまり、CPUは常にMMUによって物理アドレスに変換される線形アドレスで動作しますが、カーネルはこれらの変換を知ってこれを実行するようにMMUをプログラムします。
ユーザー空間プロセスはこれについて何も知らず(通常)自分が使用する線形アドレスに対応する物理アドレスを知らず、通常はマッピングにアクセスできません。場合によっては、物理マッピングは破損しますが、通常はセキュリティの脆弱性として扱われ、すばやく解決されます。ただし、Linuxでは十分な権限を持つプロセスが/proc/<pid>/pagemap
。
特にLinuxの場合は、以下を参照してください。メモリ管理文書、特にページテーブルのセクションを確認してください。。
答え2
MMU(Memory Management Unit)は、仮想アドレスを物理アドレスに変換するハードウェアです。たとえば、CPUが読み取るアドレスを発行すると、MMUはその仮想アドレスを物理アドレスに変換し、物理アドレスをメモリバスに送信します。
MMUはオペレーティングシステムによってプログラムされます。オペレーティングシステムはメモリ(物理および仮想)を管理し、仮想 - 物理マッピングを管理します。
答え3
物理から仮想への変換が行われる正確な場所を検索していたので、答えを書くことにしました。
Linusの元の投稿へのリンクを残します。 カーネル空間からのアドレス変換 これによりファイルを見つけることができます
#include <asm/io.h>
もともと期待していたmmフォルダにはありません。その理由は、アーキテクチャ間の差が広すぎるため、すべてをmmフォルダに含めるには、各アーキテクチャにはより多くの違いがあるためです。
したがって、Arch/x86/include/asm/io.h ファイル、特に virt_to_phys を見てください。 https://codebrowser.dev/linux/linux/arch/x86/include/asm/io.h.html#virt_to_phys
x86のLinusのコメントによると、バスアドレスは同じ仮想アドレスなので、すべてがより簡単です。バスアドレスと仮想アドレスの違いは、バスアドレスがCPU以外のデバイスがメモリレイアウトを見る方法であることです。
x86では、より単純で、2つの用語(バスアドレスと仮想アドレス)が同じ意味で使用されるためです。
次の定義は私の言葉を証明します
#define isa_bus_to_virt phys_to_virt
isa / pciが外部(CPU以外)デバイスであるとします。
もう少し詳しく見ると、linux / arch / powerpc / mm / ioremap_32.cファイルにあります。これは、ISAデバイスのメモリレイアウトが異なる他のアーキテクチャ(PowerPC)に関連しています。
https://codebrowser.dev/linux/linux/arch/powerpc/mm/ioremap_32.c.html
関数で見ることができます。
__ioremap_caller
コメントは次のとおりです。
/*
* If the address lies within the first 16 MB, assume it's in ISA
* memory space
*/
if (p < 16 * 1024 * 1024)
p += _ISA_MEM_BASE;
これは実際には異なるバスアドレスと仮想アドレスを考慮してPowerPCレイアウトがわずかに異なるというLinusの声明を確認します。