# プロテクションユニット (overview)

プロテクションユニットは、メモリのリード／ライト属性やキャッシュ／ライトバックの使用の有無を設定してメモリを保護するための機能です。8つのリージョンをメモリ空間にマッピングすることが可能で、それぞれに異なった属性を設定することができます。

プロテクションユニットは ARM9 プロセッサでのみ使用可能です。

## プロテクションユニットのイネーブル・ディセーブル

以下の関数で、プロテクションユニット自体をイネーブル、ディセーブルとすることが出来ます。

`OS_EnableProtectionUnit()`
`OS_DisableProtectionUnit()`

## 各リージョンの設定

各プロテクションリージョンの設定を行なうための関数は以下の通りです。

`OS_SetProtectionRegion()`
`OS_SetProtectionRegionParam()`

設定を取得するための関数は以下の通りです。

`OS_GetProtectionRegionAddress()`
`OS_GetProtectionRegionSize()
OS_GetProtectionRegionParam()`

## NITROモードでのデフォルトのマッピング

デフォルトでは各リージョンは以下のようにマッピングされています。
リージョンが重なっている場合、リージョン番号の大きい方が優先されます。

リージョン番号 | 用途 | ベースアドレス | サイズ | キャッシュ | ライトバッファ | ユーザ属性(命令) | ユーザ属性(データ)
--- | --- | --- | --- | --- | --- | --- | ---
- | バックグラウンド | 0x00000000 | 4GByte ( 0x100000000 ) | × | × | NA | NA
0 | I/Oレジスタ, VRAM等 | HW_IOREG ( 0x04000000 ) | 64MByte ( 0x4000000 ) | × | × | R/W | R/W
1 | メインメモリ, WRAM | HW_MAIN_MEM_MAIN ( 0x02000000 ) | 4MByte / 8MByte ( 0x400000/0x800000 )(注1) | ○ | ○ | R/W | R/W
2 | 共有メインメモリイメージ (注2) | HW_MAIN_MEM_IM_SHARED ( 0x027FF000 ) | 4KByte ( 0x1000 ) | × | × | NA | R/W
3 | カートリッジ | HW_CTRDG_ROM ( 0x08000000 ) | 128MByte ( 0x8000000 ) | × | × | NA | R/W
4 | DTCM | HW_DTCM ( 0x027E0000/0x2FE0000 ) (注3) | 16KByte ( 0x4000 ) | × | × | NA | R/W
5 | ITCM | HW_ITCM_IMAGE ( 0x01000000 ) (注4) | 16MByte ( 0x1000000 ) | × | × | R/W | R/W
6 | BIOS予約 | HW_BIOS ( 0xFFFF0000 ) | 32KByte ( 0x8000 ) | ○ | × | R | R
7 | 共有メインメモリ | HW_MAIN_MEM_SHARED ( 0x02FFF000 ) | 4KByte ( 0x1000 ) | × | × | NA | R/W

(注1)
メインメモリの保護を用途とするプロテクションリージョン1 のサイズは、デバッガ上で動作させる場合は、`OS_EnableMainExArena()` を `OS_InitArena()` や `OS_Init()` の前に指定することで 8MByte となります。実機の場合は上記の設定に依らず常に 4MByte となります。

以前のバージョンとの互換性のために、上記の指定の替わりに、OS ライブラリを NITRO_MEMSIZE=8M を指定してコンパイルすれば、プロテクションリージョン1 のサイズは 8MByte となります ( デバッガ上で動作させる場合 )。

(注2)
TWL-SDK の前身である NITRO-SDK では、このプロテクションリージョン2はメインメモリ上の ARM7 専用領域を保護するために使用されていましたが、TWL-SDK では共有メインメモリイメージという異なる用途に使用しますのでメインメモリ ARM7 専用領域の保護はありません。なお HYBRID ROM を NITRO モードで動作させた場合には正確には共有メインメモリのイメージではなく、共有メインメモリとは独立した領域となっています。

(注3)
DTCM の開始位置は lsf ファイルで指定されています。このアドレスは、動作モードでなく ROM の種類で決定されます。NITRO ROM では 0x027E0000 が、HYBRID ROM、LIMITED ROMでは 0x02FE0000 がデフォルトの値となっています。

(注4)
NULL ポインタへのアクセスで例外を発生させるためにあえて 0x00000000 からにしていません。

どのようにプロテクションリージョンが設定されるかをメモリマップと併せて図示します。

- NITRO ROM ・ HYBRID ROM の区別と、動作プラットフォームに搭載されているメインメモリサイズで場合わけをします。
- FINALビルドされているROM は、搭載メモリが 4MB であるという前提で動作しますので、MEMSIZE=4MB 扱いとなります。
- TWL実機で NITROモードが動作する場合、NITRO 実機の動作と合わせるために MEMSIZE=4MB 扱いとなります。
- NITRO ROM を NITROモードで動作させる場合と、HYBRID ROM を NITRO モードで動作させる場合では、DTCM の位置が異なるので、ここを覆うプロテクションリージョン 4 も異なります。
- MEMSIZE=4MB と MEMSIZE=8MB では、0x02400000 以降の領域のある・なしが異なりますので、メインメモリを保護する リージョン1 の大きさが異なりますMEMSIZE=4MB の場合は 0x02000000〜0x023FFFFF であり、MEMSIZE=8MB の場合は 0x02000000〜0x027FFFFF となります。MEMSIZE=32MB の場合は、MEMSIZE=8MB と同じとなります。

NITRO モードでの動作
ROM の種類 | 動作プラットフォーム | 該当する項目
--- | --- | ---
NIRO ROM | NITRO 実機 TWL 実機 すべての FINALROMビルド | NITRO MODE (NITRO ROM): MEMSIZE=4MB
IS-NITRO-DEBUGGER ENSATA EMULATOR | NITRO MODE (NITRO ROM): MEMSIZE=8MB
IS-TWL-DEBUGGER | NITRO MODE (NITRO ROM): MEMSIZE=32MB
HYBRID ROM | NITRO 実機 すべての FINALROMビルド | NITRO MODE (HYBRID ROM): MEMSIZE=4MB
IS-NITRO-DEBUGGER | NITRO MODE (HYBRID ROM): MEMSIZE=8MB
IS-TWL-DEBUGGER (強制的にNITRO動作) | NITRO MODE (HYBRID ROM): MEMSIZE=32MB

さらにメインメモリと拡張メインメモリ等、0x02000000〜0x03000000 を拡大したものが下の図です。

## TWLモードでのデフォルトのマッピング

デフォルトでは各リージョンは以下のようにマッピングされています。
リージョンが重なっている場合、リージョン番号の大きい方が優先されます。

リージョン番号 | 用途 | ベースアドレス | サイズ | キャッシュ | ライトバッファ | ユーザ属性(命令) | ユーザ属性(データ)
--- | --- | --- | --- | --- | --- | --- | ---
- | バックグラウンド | 0x00000000 | 4GByte ( 0x100000000 ) | × | × | NA | NA
0 | I/Oレジスタ, VRAM等 | HW_IOREG ( 0x04000000 ) | 64MByte ( 0x4000000 ) | × | × | R/W | R/W
1 | メインメモリ, WRAM | HW_MAIN_MEM_MAIN ( 0x02000000 ) | 32MByte ( 0x200000 ) | ○ | ○ | R/W | R/W
2 | ARM7専用メインメモリ | HW_MAIN_MEM_SUB ( 0x02F80000) | 512KByte ( 0x80000 ) | × | × | NA | NA
3 | 拡張メインメモリ | HW_CTRDG_ROM ( 0x08000000 ) (注5) | 64MByte / 128MByte ( 0x4000000/0x8000000 ) | ○ | ○ | R/W | R/W
4 | DTCM | HW_DTCM ( 0x02FE0000 ) (注6) | 16KByte ( 0x4000 ) | × | × | NA | R/W
5 | ITCM | HW_ITCM_IMAGE ( 0x01000000 ) (注7) | 16MByte ( 0x1000000 ) | × | × | R/W | R/W
6 | BIOS予約 | HW_TWL_BIOS ( 0xFFFF0000 ) | 32KByte ( 0x8000 ) | ○ | × | R | R
7 | 共有メインメモリ | HW_TWL_MAIN_MEM_SHARED ( 0x02FFC000 ) | 16KByte ( 0x4000 ) | × | × | NA | R/W

(注5)
拡張メインメモリは 0x0C000000 からですが、NITRO カートリッジ領域(0x08000000〜) にチェックのためにアクセスに行くので HW_CTRDG_ROM がベースになります。サイズは FINALROM 版では必ず 64MByte となります。それ以外では、32MBのメインメモリが搭載されている場合(拡張メインメモリがある場合) は128MByte、そうでない場合は 64MByte となります。

(注6)
DTCM の開始位置は lsf ファイルで指定されています。0x02FE0000 はデフォルトの値です。

(注7)
NULL ポインタへのアクセスで例外を発生させるためにあえて 0x00000000 からにしていません。

どのようにプロテクションリージョンが設定されるかをメモリマップと併せて図示します。 HYBRID ROM が TWL モードで動作する場合と LIMITED ROM が動作する場合で違いはありません。搭載メモリサイズは 動作する機器によって 16MB と 32MB に分けていますが、FINALROM ビルドされているものは、搭載メモリが 16MB であるという前提で動作しますので 16MB の項目を参照してください。

TWL モードでの動作
ROM の種類 | 動作プラットフォーム | 該当する項目
--- | --- | ---
HYBRID ROM LIMITED ROM | TWL 実機 すべての FINALROMビルド | TWL MODE : MEMSIZE=16MB
IS-TWL-DEBUGGER | TWL MODE : MEMSIZE=32MB

以下は 0x2000000〜0x3000000 のメインメモリ領域を拡大したものです。16MB設定でも 32MB設定でもこの領域は変わりません。

## 参照

`OS関数一覧(プロテクションユニット)
`

## 履歴

2008/12/02 TWL ROM のARM9プログラム開始位置を調整
2008/09/08 NITRO モードを NITRO ROM と HYBRID ROM NITRO に分けて説明
2008/08/20 TWL側のリージョン3を修正
2007/11/26 図を大幅に改訂
2007/10/08 TWLに関する記述を追加
2006/05/12 デフォルトのマッピング表の修正
2005/04/13 ARM7専用・DTCMリージョンのアドレスを変更
2004/12/14 用語や語尾など修正
2004/11/17 初版