連載25-OSレスでSOLIDコアサービスを使うー2
前回、統合開発環境であるSOLIDからTOPPERSカーネルを取り外してみました。
「OS(SOLIDコアサービス含む)、デバッガ、コンパイラ」の三位一体
から、
「SOLIDコアサービス、デバッガ、コンパイラ」の三位一体
になったわけです。
当然OSの機能は使えないことになりますが、SOLIDコアサービスが提供している機能の中でOSとは独立しているものは、使えます。
今までご紹介してきた機能で、例えばどのような機能が使えるのか。
今回は、それを見ていきましょう。
※SOLIDコアサービスで使える全機能をご紹介するわけではありません。
沢山ありとても一回では無理なので、声を大にして言いたい機能をご紹介します。
1.MMU関連機能
今までご紹介したMMU関連機能について、OSなしでも使う事ができるかどうかを試してみます。
1.1 MMUアドレス変換テーブル表示・設定
振り返りになりますが、SOLID-IDEには、MMUアドレス変換テーブルを表示・設定するウインドウがあります。
このウインドウ、OSがなくても使えます。
OSに依存しているわけではないから、です。
開いてみましょう。
主に本連載第2回でご紹介した内容です。
https://note.com/yn_2022/n/n40b4e94e7a01
bspフォルダの下にある、memory_map.mnnファイルをダブルクリックすると。。。
開きました。
OSがある場合と変わらず、ここからMMUのアドレス変換テーブル設定を変更することもできます。
1.2 MMU保護違反例外を使用した各種検出
では、MMUの保護違反例外を使用した検出機能はどうでしょうか。
例えば、NULLポインタのアクセスを検出してみます。
本連載第1回でご紹介した内容です。
https://note.com/yn_2022/n/ne8a0329d2fb1#c957e24e-1e6e-4948-97c0-a817de80a97a
書いたプログラムは以下です。
#include
#include "sample1.h"
void nonos_main(void)
{
SOLID_LOG_printf("nonos_main() is running...\n");
uint32_t *p;
p = 0;
*p = 0;
while (1)
{
}
}
ビルドして実行します。
デバッグ例外ウインドウが出て、Data Abort Exceptionと表示されています。
OSがる場合と同じですね。
1.3 MMU関連API
MMU関連のAPIはどうでしょうか?
使ってみましょう。
本連載第6回でご紹介した内容を試してみましょう。
https://note.com/yn_2022/n/nd4047c7f5261
メモリマップデザイナーで、何も割り当てられていない仮想アドレスを調べてみます。
仮想アドレス0x42000000から、しばらく空いています。
APIを使って、ここにマッピングしてみましょう。
SOLID_MEM_Alloc()関数を使用し、以下のコードを書いてみます。
#include
#include "sample1.h"
void nonos_main(void)
{
SOLID_LOG_printf("nonos_main() is running...\n");
uint32_t *p;
int p_data;
SOLID_ADDRESS v_addr = 0x42000000;
size_t size = 0x100;
int ret = 0;
ret = SOLID_MEM_Alloc(v_addr, size);
p = 0x42000000;
p_data = *p;
while (1)
{
}
}
ビルドし、ブレークポイントを設定し、実行してみます。
マッピングされていなかったはずの仮想アドレス0x42000000から値が正しく読めていますね。
APIも、OSの有無関係なく使用できることがわかりました。
2.アドレスサニタイザ機能
次に、アドレスサニタイザ機能を使ってみます。
アドレスサニタイザ機能とは、本来アクセスすべきでないアドレスへのメモリアクセスを、アクセス直前に検出する機能です
コンパイラフロントエンドであるClangが準備している機能ですが、それと連携して動くルーチンが必要です。
SOLIDコアサービスが、その連携ルーチンを持っています。
したがって、これもOSとは独立した機能です。
本連載第4回でご紹介した内容です。
https://note.com/yn_2022/n/nbca5248a5926?magazine_key=m5b34a9ddbc30
試してみましょう。
詳細な使い方は、本連載第4回を参照していただくとして、実行した結果だけ。。。
ローカル変数として配列を定義し、配列の範囲外をリードしてみます。
範囲を超える直前にブレークし、デバッグ例外ウインドウで、「Out of bound access」と表示されました。
この機能もOSの有無関係なく使用できますね。
3.まとめ
OSを取り外し、「SOLID コアサービス、デバッガ、コンパイラの三位一体」のSOLIDを前回より深く味わってみました。
今回ご紹介した機能、MMU操作関連、アドレスサニタイザは、実はOSではなく、SOLID コアサービスの中にあるデバッグランタイムで実現されている機能です。
このため、OSがあろうとなかろうと、またOSが何であろうと、使えます。
もちろん、今回ご紹介した機能だけでなく、例えばローダ―機能、スナップショット機能等、その他の機能もいろいろと使えます。
SOLIDというと、OSを使った便利機能をいろいろ持っているというイメージもあるかもしれませんが、実は「SOLID コアサービス」がOSに依存せずに持っている機能が多いという事ですね。
次回は、今回ご紹介できなかったローダー機能を試してみます。
ローダブルアプリケーションとメインアプリケーションとの関数コールとして、通常の方法だけでなく、サービスコール(SVC)を使ってみることも試してみたいと思います。