保護レベル

μT-Kernelでは、実行時の保護レベルとして0~3の4段階(特権モード/ユーザモードなどに相当)、アクセス対象となるメモリの保護レベルとしても0~3の4段階がそれぞれ定義されており、現在実行中の保護レベルと同じか、それより低い保護レベルのメモリにのみアクセスができる。この機能は、ユーザプログラムの不正なアクセスから、OSなどのシステムを保護するために役立つ。

各保護レベルは次のような用途に使用する。

保護レベル用途
0カーネル、サブシステム、デバイスドライバなど
1システムアプリケーションタスク
2(予約)
3ユーザアプリケーションタスク

ただし、CPUによっては、特権モード(スーパバイザモード)とユーザモードの2段階の保護レベルしかない場合もある。そのような場合は、特権モードを保護レベル0、ユーザモードを保護レベル3として扱う。この場合には、保護レベルとして1~2を指定しても、保護レベル0を指定したものと解釈され、保護レベル0を指定した時と同等の動作をする。たとえば、tk_cre_tsktskatrTA_RNG2を指定した場合でも、TA_RNG0を指定した場合と同じく、生成されたタスクは特権モード(保護レベル0)で動作する。また、tk_cre_mplmplatrTA_RNG2を指定した場合でも、TA_RNG0を指定した場合と同じく、生成されたメモリプールのアクセスを制限する保護レベルが0となる。なお、この場合はサービスプロファイルTK_MEM_RNG0TK_MEM_RNG1TK_MEM_RNG2の定義値を0とする。

特権モードとユーザモードの区別もないCPUの場合は、保護レベル0のみを使用する。この場合には、保護レベルとして1~3を指定しても、保護レベル0を指定したものと解釈される。また、サービスプロファイルTK_MEM_RNG0TK_MEM_RNG1TK_MEM_RNG2TK_MEM_RNG3の定義値を0とする。

実行時の保護レベルが、アクセス対象となったメモリの保護レベルよりも低い場合には、メモリアクセス権の違反が検出され、CPU例外を発生する。

実行時の保護レベルの遷移は、システムコールまたは拡張SVCの呼出、および割込み・CPU例外により行われる。

非タスク部(タスク独立部、準タスク部など)は保護レベル0で実行する。保護レベル1~3で実行できるのはタスク部のみである。保護レベル0でもタスク部は実行可能である。