MPUについての勉強~メモリ関連の周辺機器~

2021/01/11

組み込み

はじめに

 前回はメモリについて勉強しました。MPUについての勉強~メモリについて~

今回はメモリに関連する周辺機器について勉強します。

前回と同様に下記本を参考にしております。


DMAC(Direct Memory Access Controler)

従来のデバイスとメモリ間でのデータ転送をMPUを使ってデバイスからデータを読み書きしたりしていました。(PIO:プログラムI/O方式)この方式ではMPUがデータ転送している間に他の仕事ができなくなってしまいます。

図1にPIOによる動作例を示します。
図1:マイコンによるPIO転送の動作例[1]

特徴としては1転送ごとに転送元、転送先の指定ができますが、先ほど述べた通りCPU(MPU)の動きを止めてしまうので、処理時間は長くなります。

PIOは処理時間が長くなってしまうので登場したのが、DMACという専用ハードを使ったDMA方式です。

MPUはDMAC転送指示を出すだけでいいので、その間に論理演算などの処理を行うことができます。
図2にMDAによる動作例を示します。
図2:マイコンによるDMA転送の動作例[1]

ただし、DMAを用いた転送はデメリットも存在します。詳しくは次の章で解説します。

バスの共有/転送モード

DMAはCPUの代わりにデータ転送を実施してくれますが、1本しかないバスをみんなで共有しているため、DMAがバスを使っている時は他の人はバスを使うことができません。(DMAがバスを占有している状態)

このようにバスを占有して使うことができるハードウェアをバスマスタと呼びます。

図1 DMAの基本動作例
図3:MPU(CPU)とDMAのバス使用イメージ[2]


従ってMPUが別の要件でメモリを使おうとしても、DMAの転送処理が終わるまで待たなくてはいけないため、MPUの処理性能が低下してしまいます。

そこで効率よくバスを使用できるように転送モードというものがあります。

シングル転送モード
バイト転送モードやサイクル転送モードとも呼ばれます。
1バイト転送ごとにバスの使用権を占有したり、開放したりするモードです。

定期的にバスの使用権を開放するのでMPUへの影響は少ないですが、DMAからすると効率が悪くなってしまいます。

図4:シングル転送モードのイメージ


バースト転送モード
設定したデータを転送し終わるまでバスを転送する方法です。指定した開始アドレスからデータが連続する必要があります。そのため、連続転送モードブロック転送モードとも呼ばれます。バスを占有するため、DMAからすると高速にデータ転送ができますが、MPUからするとバスの使用権を待たされる時間が長くなってしまいます。
図5:バースト転送モードのイメージ

デマンド転送モード
こちらはバースト転送モードとシングル転送モードの中間となるモードです。
専用の信号を使って中断再開を行う機能を持たせたものです。
バスを効率よく使用できますが、専用の信号が使えるようなハードウェアが設計されている必要があります。
図6:デマンド転送モードのイメージ

他にもラウンドロビン方式サイクススチール方式と呼ばれる転送モードがあるみたいですが、今回は割愛いたします。

MMU(Memory Management Unit)

MMUは名前の通りメモリを管理するユニットで、物理アドレスと論理アドレスの変換機能やメモリ保護機能などをもっています。
図7:MMUによるアドレス変換例[3]

論理アドレス(仮想アドレス)とは

MMUの役割として物理アドレスと論理アドレスを変換する機能があると説明しましたが、なぜ論理アドレスに変換する必要があるかを簡単に説明したいと思います。

例えばプログラムでメモリをまとめて確保したい場合、論理アドレスがない場合はどこのアドレスが連続して確保できるか意識しなくてはなりません。

しかし、論理アドレスを使うことでまとまった物理アドレスが確保できなくても、空いている箇所を集めて仮想的に連続したメモリとしてプログラムに渡すことができます。

ページテーブル方式

論理アドレス(仮想アドレス)を管理する方法として、ページテーブル方式と呼ばれるものがあります。
図8:ページテーブルエントリ方式の例[4]


ページテーブルには論理アドレス(仮想アドレス)に対応する物理アドレスが格納されています。これをページテーブルエントリ(PTE)と呼びます。

ページテーブルには該当データが物理アドレスに存在するかのフラグも存在します。

例えば図8でプロセスBが使っている仮想アドレス空間上の1番のデータが物理アドレス上ではどこに存在するか見てみましょう。

ページテーブルの「B#01」となっているところを見ると、「#008」となっているので、物理アドレス上では「#008」にあることがわかります。

このようにすることで、各プロセスが意識せずとも同じ物理アドレスを使うことを防ぐことが可能になります。

TLB(Translation Look-aside Buffer)

ページテーブルは物理的にどこに置かれるかというとメモリに置かれます。
ただ、前回のブログにも書きましたがメインメモリにアクセスするのには時間がかかってしまいます。MPUについての勉強~メモリについて~

そこで考えられたのがTLBです。PTE専用のキャッシュを使う方式です。
前回のブログに書いたキャッシュヒット・キャッシュミスが行われております。

キャッシュヒットした場合は特に問題ないのですが、キャッシュミスをした場合にページフォルト(TLBミス)と呼ばれる例外処理が起こります。

ページフォルトが発生すると仮想アドレスと物理アドレスの対応がTLBに保存されます。
なので次にそのアドレスにアクセスしたときにはページフォルトが発生しなくなります。
(詳しい動作は図9も参照してください)

図9:TLBの動作[5]


仮想記憶(ページング方式)

MMUを使うことで実際のメモリよりも多くのメモリ領域があるように見せかける仕組みです。簡単に言うとHDDのようなROMをあたかもRAMのように扱う仕組みです。
図10にページング方式の例を示します。
図10:ページング方式の例[6]

図10のマッピングテーブル(ページテーブル)の仮想アドレス3番を見てください。ページ番号Dにあると記載されてますが、ページ番号DはHDDに保存された情報のためフラグは0となっています。これは主記憶(RAM)に格納されてないためProgが実行できる状態ではないからです。

HDDにあるものを主記憶にもってきて、実行できるようにすることをページインといいます。図11にページイン方式の例を示します。
図11:ページインの例[6]

図11はHDDのDに保存されているProg B3を主記憶に持ってくる例です。
図10を見ると主記憶の6番が空いているので、そこにProg3を移動させます。

Prog3が主記憶に来たため、マッピングテーブルのページ番号も更新され、フラグも1になります。

逆に主記憶からHDDに移動させることをページアウトといいます。
動作としてはページインの逆となります。(詳しくは図12を見てください。)
図12:ページアウトの例[6]

メモリ保護

最初にも書きましたが、MMUにはメモリ保護機能があります。
MPUの動作モードとしてOSなどのシステム用の特権モードとアプリケーション用のユーザーモードが選択できるようになっているのが一般的です。

MMUは特権モードのみがアクセスできるようにしたり、すべてのモードでアクセス可能などのアクセス制限を決めることができます。(他にもリードのみ、ライトのみ、などの設定もできるみたいです。)

もし特権モードでしかアクセスできない領域にユーザーモードで動作しているアプリケーションがアクセスすると、MMUが例外を発生させ、OSにアクセスバイオレーションを通知して、アプリケーションを強制停止させます。

このようにすることで、アプリケーションプログラムのバグや異常を検知したり、悪意があるプログラムからシステム領域を保護することが可能となります。

まとめ

DMACを使うことで、MPUを効率よく動作させることができます。
ただし、転送モードを適切に選択しないとMPUの動作を阻害してしまう場合があります。

MMUを使うことで、論理アドレス(仮想アドレス)を使うことができ、プログラムは効率よくメモリを使ったり、実際のメモリより多くのメモリを使用可能です。また、MMUにはメモリ保護機能があるため、プログラムからシステム領域を守ることが可能です。

参考文献


その他参考にしたサイト
↓DMA関連

↓MMU関連









自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

QooQ