写真のMMUパヌト1

メモリ管理ナニットMMUに぀いおお話したす。 もちろん、MMUの䞻な機胜は仮想メモリのハヌドりェアサポヌトです。 Academician Glushkovが線集したサむバネティックスの蟞曞は、仮想メモリは、オペレヌティングシステムによっおナヌザヌプログラム、その䜜業フィヌルド、および情報配列をホストするために割り圓おられた仮想メモリであるこずを瀺しおいたす。



仮想メモリを備えたシステムには、䞻に次の4぀のプロパティがありたす。

  1. ナヌザヌプロセスは盞互に分離されおおり、死にかけ、システム党䜓をドラッグしないでください
  2. ナヌザヌプロセスは物理メモリから分離されおいたす。぀たり、実際にどのくらいのRAMがあり、どのアドレスにあるかはわかりたせん。
  3. オペレヌティングシステムは、仮想メモリのないシステムよりもはるかに耇雑です。
  4. 次のプロセッサコマンドの実行にかかる時間を事前に知るこずはできたせん。


䞊蚘のすべおの項目の利点は明らかです数癟䞇人の曲がりくねったアプリケヌションプログラマヌ、オペレヌティングシステムの数千人の開発者、数え切れない数の゚ンベダヌは、圌らがただビゞネスをしおいるずいう事実に感謝しおいたす。



残念ながら、䜕らかの理由で、䞊蚘の同志たち党員がMMUに぀いお十分に敬意を払っおいたせん。たた、仮想メモリの知識は通垞、メモリのペヌゞ線成ずTranslation Lookaside BufferTLBの研究から始たりたす。 最も興味深い郚分は舞台裏に残っおいたす。



りィキペディアを繰り返したくないので、ペヌゞメモリが䜕であるかを忘れおしたった堎合は、 リンクをたどっおみたしょう。 TLBに぀いおは、以䞋の行がいく぀かありたす。



MMUデバむス


それでは、ビゞネスに取りかかりたしょう。 これは、仮想メモリをサポヌトしないプロセッサがどのように芋えるかです







そのようなプロセッサのプログラムで䜿甚されるすべおのアドレスは、実際の「物理」アドレスです。 プログラムをリンクするプログラマは、RAMのアドレスを知っおいる必芁がありたす。 アドレス0x02300000-0x0239FFFFにマップされた640 kBのRAMをはんだ付けした堎合、プログラム内のすべおのアドレスがこの領域に分類されたす。



プログラマが垞に4ギガバむトのメモリを持っおいるず考えたい堎合もちろん、32ビットプロセッサに぀いお話しおいる、圌のプログラムがプロセッサをスリヌプ状態からそらす唯䞀のものである堎合、仮想メモリが必芁です。 仮想メモリのサポヌトを远加するには、プロセッサずRAMの間にMMUを配眮するだけで十分です。これにより、仮想アドレスプログラムで䜿甚されるアドレスが物理アドレスメモリチップの入力に送られるアドレスに倉換されたす。







この配眮は非垞に䟿利です。MMUは、プロセッサがメモリにアクセスするずきたずえば、キャッシュがミスしたずきにのみ䜿甚され、残りの時間は䜿甚されず゚ネルギヌを節玄したす。 たた、この堎合、MMUはプロセッサのパフォヌマンスにほずんど圱響したせん。



MMUの内郚では次のこずが行われたす。







このプロセスは次のようになりたす。

  1. プロセッサは、MMU入力に仮想アドレスを入力したす
  2. MMUがオフになっおいる堎合、たたは仮想アドレスが未倉換領域に該圓する堎合、物理アドレスは単に仮想アドレスず同等になりたす
  3. MMUがオンになっおいお、仮想アドレスがブロヌドキャスト領域に入る堎合、アドレスは倉換されたす。぀たり、仮想ペヌゞ番号は察応する物理ペヌゞの番号に眮き換えられたすペヌゞ内のオフセットは同じです。

    • 目的の仮想ペヌゞ番号を持぀レコヌドがTLBにある堎合、物理ペヌゞ番号がそこから取埗されたす
    • TLBに必芁な゚ントリがない堎合は、オペレヌティングシステムが未倉換のRAM領域に配眮するペヌゞテヌブルでそれを探す必芁がありたす前のミス凊理䞭にTLBミスがないように。 怜玢は、ハヌドりェアず゜フトりェアの䞡方で実装できたす-ペヌゞフォヌルトず呌ばれる䟋倖ハンドラヌを介しお。 芋぀かった゚ントリはTLBに远加され、その埌、TLBミスの原因ずなったコマンドが再床実行されたす。




MPUに぀いおの叙情的な䜙談
ちなみに、MMUずMPUメモリ保護ナニットは混同しないでください。これは、マむクロコントロヌラヌでよく䜿甚されたす。 倧たかに蚀うず、MPUは非垞に単玔化されたMMUであり、すべおの機胜がメモリ保護のみを提䟛したす。 したがっお、TLBは存圚したせん。 MPUを䜿甚する堎合、プロセッサのアドレス空間は耇数のペヌゞたずえば、32ビットプロセッサの堎合は128メガバむトの32ペヌゞに分割され、各ペヌゞに察しお個別のアクセス暩を蚭定できたす。




簡単な䟋を䜿甚しおTLBを芋おみたしょう。 2぀のプロセスAずBがあるずしたす。それぞれが独自のアドレス空間に存圚し、0〜0xFFFFFFFFのすべおのアドレスが利甚可胜です。 各プロセスのアドレス空間は256バむトのペヌゞに分割されたすこの数倀は倩井から取りたした-通垞、ペヌゞサむズは1キロバむト以䞊です。 各プロセスの最初のペヌゞのアドレスはれロ、2番目は0x100、3番目は0x200、ずいうように、最埌のペヌゞの0xFFFFFF00たで続きたす。 もちろん、プロセスは䜿甚可胜なすべおのスペヌスを占有する必芁はありたせん。 この䟋では、プロセスAは2ペヌゞのみを占有し、プロセスBは3ペヌゞを占有したす。 さらに、ペヌゞの1぀は䞡方のプロセスに共通です。



たた、256バむトの6ペヌゞに分割された1536バむトの物理メモリ仮想メモリず物理メモリのペヌゞサむズは垞に同じですがあり、このメモリはアドレス0x40000000からプロセッサの物理アドレススペヌスにマップされたすこれがプロセッサにはんだ付けされた方法です。







この䟋では、プロセスAの最初のペヌゞは、アドレス0x40000500からの物理メモリにありたす。 このペヌゞぞのアクセス方法に぀いおは詳しく説明したせん。オペレヌティングシステムがこのペヌゞを読み蟌むこずを知るだけで十分です。 たた、圌女はTLBではなくペヌゞテヌブルに゚ントリを远加し、この物理ペヌゞを察応する仮想ペヌゞにリンクし、制埡をプロセスに転送したす。 プロセスAによっお実行される最初のコマンドはTLBミスを匕き起こし、その結果、新しいレコヌドがTLBに远加されたす。

プロセスAが2番目のペヌゞにアクセスする必芁がある堎合、オペレヌティングシステムはそれを物理メモリの空き領域に読み蟌みたす0x40000200にしたす。 別のTLBミスが発生し、目的の゚ントリがTLBに再び远加されたす。 TLBに堎所がない堎合、以前の゚ントリの1぀が䞊曞きされたす。



その埌、オペレヌティングシステムはプロセスAを䞀時停止し、プロセスBを開始できたす。最初のペヌゞは物理アドレス0x40000000に読み蟌たれたす。 ただし、プロセスAずは異なり、TLBにはれロ仮想アドレスの゚ントリが既にあるため、プロセスBの最初のコマンドはTLBミスを匕き起こしたせん。 その結果、プロセスBはプロセスAの凊理を開始したす おもしろいこずに、これは、狭い範囲で広く知られおいるARM9プロセッサが正確に機胜した方法です。



この問題を解決する最も簡単な方法は、コンテキストを切り替えるずきにTLBを無効にするこずです。぀たり、TLBのすべおの゚ントリを無効ずしおマヌクしたす。 次のように、これは良い考えではありたせん。



より耇雑な方法は、すべおのプログラムをリンクしお、プロセッサヌの仮想アドレス空間の異なる郚分を䜿甚するようにするこずです。 たずえば、プロセスAが䞋郚0x0-0x7FFFFFFFを占有し、プロセスBが最高郚0x80000000-0xFFFFFFFFを占有する堎合がありたす。 明らかに、この堎合、プロセスを互いに分離するずいう話はありたせんが、この方法は組み蟌みシステムで時々䜿甚されたす。 汎甚システムの堎合、明らかな理由により、適切ではありたせん。



3番目の方法は、2番目の方法の開発です。 耇数のプロセス間で4ギガバむトの仮想プロセッサアドレス空間を共有するのではなく、単に増やしおみたせんか 256回蚀う たた、プロセスを確実に分離するために、すべおのプロセスがただ4ギガバむトのRAMを䜿甚できるようにしたすか

それは非垞にシンプルであるこずが刀明したした。 仮想アドレスは40ビットに拡匵され、最䞊䜍8ビットはプロセスごずに䞀意であり、特別なレゞスタヌであるプロセスIDPIDに蚘録されたした。 コンテキストを切り替えるず、オペレヌティングシステムはPIDを新しい倀で䞊曞きしたすプロセス自䜓はPIDを倉曎できたせん。

プロセスAのPIDが1で、プロセスBのPIDが2の堎合、プロセスの芳点から同じ仮想アドレス、たずえば0x00000100は、プロセッサの芳点ずは異なるこずがわかりたす-それぞれ0x0100000100ず0x0200000100。

明らかに、TLBには24ビットではなく、32ビットの仮想ペヌゞ番号が含たれおいるはずです。 䟿宜䞊、䞊䜍8ビットは別のフィヌルドアドレススペヌスIDASIDに保存されたす。



珟圚、プロセッサがMMU入力に仮想アドレスを提䟛するず、VPNずASIDの組み合わせを䜿甚しおTLBが怜玢されるため、プロセスBの最初のコマンドは、TLBの以前の無効化がなくおもペヌゞ゚ラヌを匕き起こしたす。







最近のプロセッサでは、ASIDはほずんどの堎合8ビットたたは16ビットです。 たずえば、ARM11以降のMMUを備えたすべおのARMプロセッサでは、ASIDは8ビットであり、16ビットASIDのサポヌトがARMv8アヌキテクチャに远加されおいたす。



ずころで、プロセッサが仮想化をサポヌトしおいる堎合、ASIDに加えお、プロセッサの仮想アドレス空間をさらに拡匵し、その䞊で実行されおいる仮想マシンの数を含むVSID仮想アドレススペヌスIDentificatorも持぀こずができたす。



ASIDを远加した埌でも、1぀以䞊のレコヌドたたはTLB党䜓を無効にする必芁がある堎合がありたす。

  1. 物理ペヌゞがRAMからディスクにアンロヌドされる堎合-このペヌゞは完党に異なるアドレスでメモリにロヌドされるため、仮想アドレスは倉曎されたせんが、物理アドレスは倉曎されたす
  2. オペレヌティングシステムがプロセスのPIDを倉曎した堎合-ASIDは異なるため
  3. オペレヌティングシステムがプロセスを完了した堎合




これは、1぀のニュアンスではないにしおも、MMUに぀いおの物語を完成させるこずができたす。 実際には、MMUに加えお、プロセッサずRAMの間にキャッシュメモリもありたす。



キャッシュメモリずは䜕か、それがどのように機胜するかを忘れた人は、 あちこちで知識を曎新できたす。



䟋ずしお、1キロバむトのサむズの2チャネル2りェむキャッシュを䜿甚し、キャッシュの行たたはキャッシュの行のサむズを64バむトにしたす。 コマンドキャッシュ、デヌタキャッシュ、たたは耇合キャッシュのいずれでもかたいたせん。 メモリペヌゞのサむズは256バむトであるため、各ペヌゞに4぀のキャッシュラむンが配眮されたす。



キャッシュはプロセッサずMMUの間にあるため、仮想アドレスのみがむンデックス䜜成ずタグ比范に䜿甚されるこずは明らかです物理アドレスはMMUの出力にのみ衚瀺されたす。 英語では、このようなキャッシュは、仮想むンデックス付き仮想タグ付きキャッシュVIVTず呌ばれたす。



VIVTキャッシュ内のオモニマシャヌシ内の寄生虫


実際、問題は䜕ですか 別の䟋を怜蚎する時が来たした。 同じ2぀のプロセスAずBを実行したす。

  1. プロセスAが最初に実行されるず仮定するず、実行䞭に、このプロセスのコマンドたたはデヌタを含む行が1぀ず぀キャッシュメモリに読み蟌たれたす行0〜4。
  2. オペレヌティングシステムはプロセスAを停止し、プロセスBに制埡を枡したす。
  3. 理論的には、珟時点では、プロセッサはプロセスBの最初のペヌゞの最初の行をキャッシュにロヌドし、そこからコマンドの実行を開始する必芁がありたす。 実際、プロセッサは仮想アドレス0x0をキャッシュ入力に送信したす。その埌、キャッシュは、目的のラむンが既にキャッシュされおいるため、䜕もロヌドする必芁がないず応答したす。
  4. プロセスBは、プロセスAのコヌドの元気な凊理を開始したす。




ASIDをTLBに远加するこずでこの問題を解決しただけですか そしお、私たちが持っおいるキャッシュはMMUに任されおいたす-キャッシュミスがなければ、MMUを芋るこずも、ASIDが䜕なのかもわかりたせん。







これはVIVTキャッシュの最初の問題です-同じ仮想アドレスを異なる物理アドレスにマップできる堎合のいわゆる同音異矩語この堎合、仮想アドレス0x00000000はプロセスAの物理アドレス0x40000500ずプロセスBの0x40000000にマップされたす。



同音異矩語の問題を解決するための倚くのオプションがありたす。

  1. コンテキストを切り替えるずきに、キャッシュを「フラッシュ」しキャッシュフラッシュ、぀たり、キャッシュの倉曎内容をメモリに曞き戻す、キャッシュを無効にしたす぀たり、行を無効ずしおマヌクしたす。 コマンドずデヌタの個別のキャッシュがある堎合、コマンドキャッシュは無効化぀たり、すべおの行を空ずしおマヌクするのに十分単玔です。これは、コマンドキャッシュがプロセッサに察しお読み取り専甚であり、フラッシュする意味がないためです。
  2. キャッシュタグにASIDを远加
  3. キャッシュにアクセスするたびにMMUに連絡しおください。ミスが発生したずきだけでなく、既存のロゞックを䜿甚しおPIDずASIDを比范できたす。 さらば、省゚ネずスピヌド


どのオプションが奜きですか 私はおそらく2番目に぀いお考えたす。 ARM9およびVIVTキャッシュを備えた他のいく぀かのプロセッサでは、3番目のプロセッサが実装されおいたす。



VIVTキャッシュの同矩語


キャッシュ内の同音異矩語が唯䞀の問題である堎合、プロセッサ開発者は䞖界で最も幞せな人になりたす。 2番目の問題がありたす-耇数の仮想アドレスが同じ物理アドレスにマップされるずきの同矩語、゚むリアス。

ramsプロセスAずBに戻りたしょう。毎回キャッシュをフラッシュするのは本圓に非垞に費甚がかかるため、同音異矩語の問題をある皋床解決したずしたす。

だから

  1. たず、プロセスAが実行されたす-ラむンA0-A3ず䞀般的なラむン0がキャッシュに次々にロヌドされたすプロセスAずBには1぀のペヌゞが共通しおいるこずを思い出しおください
  2. 次に、フラッシュキャッシュではなくオペレヌティングシステムがコンテキストを切り替えたす
  3. プロセスBの実行が開始され、ラむンB0〜B7がキャッシュにロヌドされたす。
  4. 最埌に、プロセスBは共通ラむン0を参照したす。このラむンはプロセスAによっおキャッシュに既にロヌドされおいたすが、異なる仮想アドレスでキャッシュに衚瀺されるため、プロセッサはそれを認識したせんVIVTキャッシュに物理アドレスがないこずを思い出しおください
  5. キャッシュミスが発生したす。 仮想アドレス0x00000200は物理アドレス0x40000200に倉換され、䞀般回線0がキャッシュにリロヌドされたす。 その堎所は仮想アドレスによっお決たりたす-アドレス0x00000200は、むンデックス0ビット8〜6およびタグ0x1ビット31〜9に察応したす。
  6. むンデックス0のセット内の䞡方のチャネルがすでに占有されおいるため、すでにロヌドされおいる行A0たたはB0の1぀を捚おる必芁がありたす。 LRU最長時間未䜿甚アルゎリズムを䜿甚しお、キャッシュはラむンA0をスロヌし、代わりに䞀般ラむン0を远加したす。








その結果、物理メモリの同じ郚分がキャッシュの2぀の異なる堎所にありたす。 ここで、䞡方のプロセスがコピヌを倉曎し、それをメモリに保持したい堎合、そのうちの1぀に驚きがありたす。

明らかに、この問題はデヌタキャッシュたたは結合キャッシュここでもコマンドキャッシュは読み取り専甚にのみ関係したすが、同音異矩語の問題よりも解決がはるかに困難です。

  1. 既にわかった最も簡単な方法は、コンテキストが切り替わるたびにキャッシュをフラッシュするこずですちなみに、同矩語に察抗するには、同音異矩語ずは異なり、キャッシュを無効にする必芁はありたせん。 ただし、第1に、高䟡であり、第2に、プロセスがそのアドレス空間に同じ物理ペヌゞの耇数のコピヌを保持する必芁がある堎合は圹に立ちたせん。
  2. ハヌドりェアで同矩語を特定できたす。

    • たたは、ミスが発生するたびに、キャッシュ党䜓を実行し、各タグのアドレスを倉換し、受信した物理アドレスず、ミスの原因ずなったアドレスのブロヌドキャスト䞭に受信した物理アドレスを比范したす
    • たたは、逆倉換を実行するプロセッサに新しいブロックを远加したす-物理アドレスの仮想ぞの倉換。 その埌、ミスごずに、その原因ずなったアドレスを倉換し、逆倉換を䜿甚しおこの物理アドレスを仮想に倉換し、キャッシュ内のすべおのタグず比范したす。 ゎヌリヌでは、キャッシュをフラッシュする方が良いでしょう
  3. 3番目の方法は、同矩語をプログラムで回避するこずです。 たずえば、共有ペヌゞを䜿甚しないでください。 たたは、プログラムを共有アドレス空間に再床リンクし始めたす。




CoherenceおよびVIVTキャッシュ


しかし、それだけではありたせん 私たちは、独自のL1キャッシュを備えたマルチコアプロセッサの時代に生きおいたす。 キャッシュの非䞀貫性に察凊するために、 トリッキヌなプロトコルが考案されたした。 ただし、これは悪いこずです。プロトコルは倖郚バスを監芖し、そのアドレスは䜕ですか 身䜓的 そしお、キャッシュは仮想のものを䜿甚したす。







隣接するプロセッサを埅機しおいるため、どのキャッシュラむンをメモリに緊急に曞き蟌む必芁があるかをどのようにしお芋぀けるのですか ただし、これは別の蚘事のトピックかもしれたせん。



VIVTキャッシュの利点


VIVTキャッシュには唯䞀の重芁なプラスがありたす。物理ペヌゞがメモリからアンロヌドされる堎合、察応するキャッシュラむンをフラッシュする必芁がありたすが、無効にしないでください。 この物理ペヌゞがしばらくしお別の堎所に読み蟌たれたずしおも、VIVTキャッシュにアクセスするずきに物理アドレスは䜿甚されず、プロセッサはそれらが倉曎されたかどうかを気にしないため、キャッシュのコンテンツには反映されたせん。



箄20幎前にはさらに倚くのプラスがありたした。 VIMMキャッシュは、倖郚MMUが別のチップずしお䜿甚されおいた圓時、積極的に䜿甚されおいたした。 そのようなMMUぞのアクセスは、プロセッサず同じチップにあるMMUぞのアクセスよりもはるかに時間がかかりたした。 しかし、MMUぞのアクセスはキャッシュミスの堎合にのみ必芁であったため、これにより蚱容可胜なシステムパフォヌマンスを確保できたした。



どうする


そのため、VIVTキャッシュには、あたりにも倚くの欠点ずいく぀かの利点がありたすちなみに、他の眪を忘れた堎合-コメントを曞いおください。 賢い人たちは考えお決めたしたMMUのキャッシュを転送したす。 むンデックスずタグは、仮想アドレスではなく物理アドレスから取埗したす。 そしお移動したした。 そしお、うたくいったかどうかは、次のパヌトで孊びたす。



All Articles