MMUはUnix / Linuxカーネル内にありますか?それとも、独自のメモリを持つハードウェアデバイスにのみありますか?

MMUはUnix / Linuxカーネル内にありますか?それとも、独自のメモリを持つハードウェアデバイスにのみありますか?

だから私はいつも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の声明を確認します。

関連情報