こんにちは、ダックです。
C 言語を覚え、とあるファームウェアを読んでいました。
すると MMU という単語が出てきました。
どうやら 「Memory Management Unit」 の略であり 「メモリ管理ユニット」 と訳すことまでしか分かりませんでした。
そこで、先輩に聞いてみました。
ダック 「この MMU ってなんですか?」
先輩 「MMU はファームを立ち上げるために、仮想メモリと物理メモリのアドレス変換をするためのものだよ。」
ダック 「???」
始めて聞く単語が多すぎて、頭がパンクしそうでした。
そこで、今回から二回に分けてこの言葉の意味を解き明かしていきます。
メモリアドレスとは
まず、はじめにメモリのアドレスについてです。
メモリ内にはデータの住所ともいえるアドレスがあり、そのアドレスを使って CPU はプログラムに基づいた処理を行います。
例)アドレス 1 のデータとアドレス 2 のデータを足してアドレス 3 に保存。
メモリを使い分ける~アドレス空間~
例えばプログラム A B C で次のように実際のメモリのデータを扱うことを考えます。
メモリの一マスは一つのデータではなく一定のサイズ ( 4 KB など) のメモリの範囲を示しています。
このような場合、誤って他のプログラムで使用するはずのメモリを書き換えてしまう恐れがあります。
また、不連続であるためメモリの場所を決めるときに分かりにくいことになります。
そのため、実際のメモリのアドレスをプログラム内で扱いやすいように変換して使うことで解消します。
・物理アドレス 実際のメモリ(物理メモリ(RAMなど))のアドレス
・物理アドレス 実際のメモリ(物理メモリ(RAMなど))のアドレス
・仮想アドレス プログラム内で使うメモリ(仮想記憶)アドレス
・アドレス変換 仮想メモリと物理メモリを変換する・MMU アドレス変換を行う
このように、物理アドレスと仮想アドレスをアドレス変換します。
この変換を MMU で行います。
変換を行うことで、プログラム内ではアドレスを連続的に使用することができます。
このプログラム内で連続的に扱える仮想アドレスの範囲(図で同じ色で囲まれた領域)をアドレス空間と言います。
次回、この MMU がどのようにアドレス変換を行うのかをさらに詳しく見ていきます。
覚えておきたい+α
もちろんこの MMU ですが、ARM® のシステムにも搭載されていますので、 アルテラ社の SoC デバイス でも使用することができます。
そして、なんとアルテラ社の Nios® II (ソフトコアプロセッサ) でも使用することができます。
アルテラ社の SoC デバイスに搭載されているのは ARM Cortex-A9です。
この Cortex-A シリーズでは、キャッシュを使用するためには MMU の使用が必須です。(キャッシュについては、また別の機会に記事にしたいと思います。)
Nios II では、自分で自由にペリフェラルを組み合わせて CPU システムを構築することができます。
Nios II は MMU 機能を持っていますので、これを使用することができます。
また、MMU と MPU (Memory Protection Unit: メモリ保護ユニット) が別々に使用することができるようになっているので、必要に応じて選ぶことが可能です。
ちなみに、Nios II では MMU と MPU はどちらかしか有効にできません。なぜでしょう?
先輩に質問してみたところ、
「MMU には Protection 機能もついているから、わざわざ MPU を使う必要はないんだよ。」
MMU はそんな側面も持ち合わせていたのですね。
次回のアドレス変換のしくみでこの辺も解き明かしていきましょう。