プロテクションユニット (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 の種類 動作プラットフォーム 該当する項目
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 初版