SOLID未分類 OSレスでSOLIDコアサービスを使うー2(連載25)

OSレスでSOLIDコアサービスを使うー2(連載25)

(2023/12/11)

[連載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)を使ってみることも試してみたいと思います。