！
すＭＭＵを倒いで使ＳΟスマートＴＲムイ
シンプル
リアルタ
ト

コンパク

SOLIDでは「コアサービス」と名付けた一連のランタイムがIDEと密接に連携することで、見開き面の多くの機能を実現しています。RTOSでMMUを活用するための機能もコアサービスに実装されています。
MMU活用などについて、コアサービスの仕様検討から実装までの開発を一貫して担当した小林章が、その役割や特徴的な機能を解説します。

京都マイクロコンピュータ株式会社
SOLID コアサービス開発エンジニア

小林 章

高機能を簡単に使えるコアサービスfor (blks=ptbl->blks; blks && blks->num_regions; blks++) {unsigned long desc_type, va_idx, region;
unsigned long sd = blks->sd;
unsigned long pa = 0;
va_idx = _REG_POPBIT(VMSAv7_SDTTL2, VA, blks->va);if ((va_idx + blks->num_regions) > (VMSAv7_SDTTL2_VA_MASK+1)) {ret = -3; /* TOO MANY REGIONS */goto L_ERROR;}
desc_type = VMSAv7_SDTTL2_CHK_DESCTYPE(sd);/* Pick up starting PA */switch (desc_type) {case VMSAv7_SDTTL2_DESCTYPE_LargePage:
pa = _REG_POPBIT(VMSAv7_SDTTL2_LARGEPAGE, PA, sd)<< VMSAv7_SDTTL2_LARGEPAGE_PA_SHIFT;
sd &= ~_REG_PUSHBIT(VMSAv7_SDTTL2_LARGEPAGE, PA, ~0);
break;
case VMSAv7_SDTTL2_DESCTYPE_SmallPage:
pa = _REG_POPBIT(VMSAv7_SDTTL2_SMALLPAGE, PA, sd)<< VMSAv7_SDTTL2_SMALLPAGE_PA_SHIFT;
sd &= ~_REG_PUSHBIT(VMSAv7_SDTTL2_SMALLPAGE, PA, ~0);
break;
case VMSAv7_SDTTL2_DESCTYPE_Invalid:default:
break;}for (region=0; region < blks->num_regions; region++) {GUIツールでメモリマップ設定

開発準備から性能解析までをシンプルに変えるQ コアサービスには、そもそもどのような機能があるのですか？

主にターゲットのリソース(メモリ/MMU, 割り込み, タイマ等)の管理と、ユーザーへの補助(ローダー,デバッグ）機能があります。
ターゲットシステムの一部に常駐していますが、システムセットアップや動的解析機能を使ったデバッグ時など、必要に応じてIDEとも連携して動作するソフトウエアです。

Q ターゲットのリソース管理とはどのようなものでしょうか？

はい、少し古いですが「BIOSのようなもの」と言えばイメージがわきやすいでしょうか。シンプルなAPI群を使って実装済みSOLID MMUライブラリリソースを操作するものです（左図）。

GUIで設定しビルドするのみ!!

また、ブート時のMMUの仮想アドレスへの移行といった、ユーザーが操作するのが面倒な処理も受け持っています。

Q SOLIDを開発するときに最も留意した点は何ですか？

コアサービスMMU処理「リアルタイム」を追求した「コンパクト」な構成であることはもちろん、ユーザーが「スマート」に開発できるようSOLID̲MEM̲* API群「シンプル」な仕様を心掛けています。
その上でPCとターゲットのどちらでどのように処理を行うかも重要です。
ちなみに、コアサービスは、KMCの造語です。縁の下の力持ちという役割からして、結構しっくりくる名称ではない● SOLIDコアサービスで、複雑なARM MMU処理も、プログラムを書くことなく簡単に利用可能!!

かと思っています。

● コアサービスには、他にELFローダーなど基本機能を実装済み

Q SOLIDではMMUのどのようなメリットに着目したのでしょうか？

まず各機能（モジュール）を仮想アドレス上に分散して配置できる点です。これにより、領域外アクセスであるＭＭＵの有効活用ならＳＯＬＩＤにお任せください

バッファオーバーランの検出や（右図①）、特定のメモリ領域に対してアクセス制限をするセキュリティ管理にも有効です。また複数拠点で開発する場合に、モジュールを各開発拠点単位に分割・分散配置して、開発対象モジュールだけに限定してデバッグ操作を行うといった管理が簡単に実施できるようになります（右図②）。

Q 従来のMMUの利用方法と異なる点は何ですか？

①領域外アクセス検出などのデバッグ機能強化に活用

Linuxであれば、仮想アドレスで空間を多重化し、なおかつデマンドページングによって動的にメモリ割り当てを行うといった機能がありますが、RTOSの場合はリアルタイム性（再現性）を重視するので、空間の多重化は使用しません。
SOLIDのアプローチとしては、単一の大きな仮想アドレス空間にプログラムを配置するのにMMUを利用しています。
SoCの構成に合わせた仮想アドレスの設定は全てIDE側の簡単な操作で利用できるようにしましたので、ユーザーはオーバーラン
検出領域

モジュール1

オーバーラン
検出領域

モジュール2

オーバーラン検出領域②複数拠点での分散開発に活用

メモリの設定プログラムを自分で作成する必要はありません。
また、物理空間のメモリ配置をIDE上で表示することで、何か問題が起きた時でもプログラムがどうなっているかを拠点１

拠点2

拠点3

ユーザーに分かりやすく伝える工夫もしています。

Q ユーザーにとっては嬉しい機能ですね

はい。MMUの設定は複雑ですし、それを間違えてしまうとデバッグが出来ない状態に陥ってしまうこともあるので、開発対象ではないモジュール、アドレスを固定してフラッシュに書き込んでおくことも可能

開発対象
モジュール

従来のユーザーは割と避けていた部分です。そこをツールベンダーが専門家として取り組んだ事は、ユーザーにも多いに喜んでいただける点だと思います。

インテリジェントローダーがスマートなデバッグ環境を生み出す

Q SOLIDのローダーの特徴は何ですか？

プログラムの規模が大きくなってくると、修正の度にプログラム全体をロードする時間が開発者の負担になってきます。それなら新たに開発対象モジュール単体だけをロードする仕組みを作ろう、という事で出来上がったのがSOLIDのローダーであり、SOLIDの最も大きな特徴のひとつです。

Q モジュール単体でビルド（リンク）すると、モジュール間参照などの問題は生じませんか？

いいえ、ローダーにリンク機能を持たせていますので、モジュール間に参照が残っていても問題ありません。かつ

ロードイベント通知

SOLIDではモジュールのビルドでリンクの問題が生じないように、かつ「コンパクト」にロードできるような工夫をしています。リンクもDLLのような形式ではないので、モジュール間の双方でシンボル参照をしていても問題ありませSOLID-OSん。またモジュールが追加されたことを、ローダーがIDEに通知するので、IDE側でシンボルを自動的にロードしたり、逆にロードするモジュールをIDE側で差し替えたりすることも可能です。

Q ローダーとIDEは深く連携しているのですね

追加デバッグ開始

はい、それがSOLIDの一番の特徴といえます。ローダーはRTOSカーネル情報、MMUによるマッピング情報、IDEのELFロード時にSOLID-IDEとARMターゲットシステム上のSOLID
コアサービスが連携。自動的にIDEデバッグを開始

ビルダが持っているシンボル情報やデバッグ情報の全てと連携して動作しています（左図）。SOLIDが開発環境の一体化を実現したことで、ローダーをはじめとするスマートな開発スタイルが実現できたのは間違いありません。

京都マイクロコンピュータ株式会社
本社：〒610-1104 京都市西京区大枝中山町2-44

Tel.075-335-1050

東京オフィス：〒105-0004 東京都港区新橋2-14-4 Rビル5F Tel.03-5157-4530

http://www.kmckk.co.jp/

お問い合わせメールアドレス：jp-info@kmckk.co.jp
2017. 5

http://www.kmckk.co.jp/SOLID/

SP3

RTOS TOPPERS/A用TOPPERS/ASP3を採

ンソースITRON

最新のオープ● 軽量コンパクトなネル
カーレスック● ティ

る・ 省電力性にすぐれ
現時間管理を効率的に実・ μsecオーダーの、よりコンパクトな動的生成版カーネルと● 資源生成版カーネルを用意
リティフリー● ランタイムロイヤ

携SOLID-IDEと密接に連静的、スタック解析機能● スタックフェンスレーサルト● システムコー示に表IDE
況を● タスク状示
源表の資OS● RTスク、割り込み）遷移表示● 実行コンテキスト（タに、タス クリ スト や
SO LID -ID Eの デバ ッガの状 態だ けで なく 、状態 を表 示。各タ スクーカル変数もタスク
関数呼び出し状況やロを切り替えて表示可能

Visual Studio® IDE エディタ, デバッガ
実績豊富なVisual Studioを採用● SOLID用に専用実装をしているので、VisualStudioの別途導入や購入は必要なし

Visual Studioエディタが持つ高度な機能を、Clangコンパイラと連携して実現● 入力リストを候補表示するインテリセンス● ソース編集時にコンパイル時の問題を警告（入力時に自動的にバックグラウンドでコンパイラエンジンが動作）

Visual Studioデバッガによる快適なデバッグ● ブレーク箇所周辺で参照している変数を、ローカル・グローバル問わずに集めて表示する自動変数表示● SOLID-OSと連携し、タスク別の呼び出し参照表示● ARM CPU例外発生時に、例外発生箇所をポイント● タスクを認識したブレーク機能

ARM® Cortex®-AシリーズのMMUをシンプルに 積極的に活用

IDEでのソース編集時に入力と同時にコンパイル時の問題を警告

サクサク
コーディング

動画で詳しく見るラクラクΜΜＵ活用● 仮想アドレスは使うが、単一空間なので常に全てのメモリ空間が見えている（わかりやすい）● 生成 され たプ ログ ラム について は、自動 的に セクションに応じたプロテクシ
ョンを設定

でね
読ん
裏面もIDEに搭載されるメモリマッ● 双方向アドレス解決
・ 固定アドレスで実行

・ アンロード機能無し● MMUを使って効率的にメモリ使用● ローディングにMMUを使ったプロテクション設定

軽量動作の実現● SOLIDツールチェインに、ARM側ローダーと連携した専用機能を追加

性能解析プロファイラを削減● ROM上のプログラムを効率的にロードする専用ファイルシステム● CPU負荷状況

IDEでメニュー選択するだけで静的解析が実行可能

解析結果もIDE上のソースにハイライト表示

メモリ空間

アプリ2

実行する時のメモリ空間は、MMUを設定して仮想アドレス空間を利用
アプリ2

物理メモリ空間効率的なメモリ利用

SOLID-OS
コアサービスアプリ2
ロード

LID -O S上 の検 出ランタ イム

ドt bugarray[10];static unsigned shor_t exinf)
void root_task(intptr{i, x = 0;
int
ercd;
ERbuf[10];char

10個の配列サイ
ズを 越え た書 き
込み が、i=1 0の時に発生する

クセスコード// スタック範囲外アi++) {for (i = 0; i <= 10;i;
=i]
buf[}
スコード
// .bss 範囲外アクセi++) {for (i = 0; i < 11;
11*i;bugarray[i] = 0x11}/** タスクの起動*/1);
ercd = act_tsk(TASK

メモリ領域不正アクセスがあった分）を表示（ピンク網掛け部● キャッシュミス率

プロファイルツールQPobeとの連携

アドレス解決アプリ1

アドレス解決

メモリ空間
アドレス解決相互呼び出し可能

SOLID-OS
コアサービス

アクセスの不正、オーバーランやーバル変数についてローカル変数、グロ能が可問題検出
未定義領域アクセスの専用っても、るメモリアクセスであ能が可
memcpy()など連続す検出問題
良く効率の利用で、（KMC製）
ライブラリ● タスク別の計測や集計

メモリ空間相互呼び出し可能

SOLID-OS
コアサービス

持つ 機能 と、SO● Cla ng コン パイ ラのて実現
わせ（KMC製）を組み合

バグ 付き のソ ース コー

RTOSと連携した性能解析

起動直後

アプリ1
ロード

アドレスサニタイザ● メモリアクセス回数など

・ SOLID-IDEと連携することで、ローディング時に自動的にデバッグ開始

この隙間には、実際にはメモリが存在しない。アクセスすると例外発生

簡単
性能解析！！
ARM Cortex CPUに搭載されるPMU（Performance MonitoringUnit）を利用した計測● 自動デバッグ開始起動

ね● IDEのビルド環境と連携しているので、#ifdefなどの条件もビルド設定をそのまま反映

ラム実行時のメモリ
C/ C+ +言 語 プ ロ グ
実行を自動検出・ 開発環境と実行環境の一体化で、実行時の負荷● 組込向けに特化した軽量動作

で
裏面も読ん

● 関数呼び出しや分岐条件を加味し、未初期化ポインタアクセスやゼロ除算など、様々な問題を指摘

グリバ
メモ 出！！
検自動

プレイアウト機能

プログラム更新・デバッグをスマートに!!

分割開発を可能にする本格的なELFローダーを標準提供

アプリ1

実行前にソースコードの分析を行い、論理的な問題を検出する静的解析機能を標準搭載

スッキリ
ソースコード解析

ELFローダーSOLID-OS
コアサービスU binutilsを同梱
リンカは実績あるGN
ポート
C99,C++11仕様をサ
アはGPLフリー
生成されるソフトウェ● MMU初期化コードと連携

機 能 豊 富 だ け ど 、設 定 が複雑なARM
Cortex-AのMMUを、簡単に安全に使えます

アプリ1

Clangコンパイラ● 先進的機能のLLVM/

問題箇所と、問題に繋がる箇所をソース上でハイライト表示

利用 する 仮想 アド レス を設定し やす くす る
ためのIDEメモリマップレイア
ウト機能

SOLID-OS
コアサービス

できる、開発時に便KMCデバッガと連携も同梱。VLINK利利なVLINKライブラリ
定単設
ら簡用もSOLID-IDEかな機 能（プ ロフ ァ
コン パイ ラの 持つ 豊富）も、SO LID -ID E
イル や関 数フ ック など
可能
利用と連携して簡単にもI DE のG UI で
リン カス クリ プト 設定ナ画面）可能ザイ設定（メモリマップデ● 実績

IDEのプロジェクトメニューを選択するだけで、簡単に実施可能

・ .text=実行可/読可, .rod
ata=読可, .data&.bss=読書可のような設定です● リンカスクリプトと連携が付属

ラ
豊富なGCCコンパイ

ソースコード静的解析
IDEでのソース編集時に入力リストを候補表示。メンバの型も表示

機能

イラを同梱

選べる二種類のコンパ

最新強力なイラをOSS コンパ！
自在に統合環境で、リッチにＲＴＯＳ分析

ARM Cortex-A メモリ管理

ラ, Clangコンパイラ
イ
パン
コC
C
Gン
イェ
チ
ツールては 、ソー スコ ード
標準 ライ ブラ リに つい相互呼び出し可能
アプリ1

メモリ空間

アプリ2

ローディング時に、アプリ間のアドレス解決

QProbeによるタスク実行時間分散画面● QProbeでタスク解析するための設定を導入済み

・ 関数単位やタスク単位で、実行履歴・比率・分散状況などが把握可能

ログラム
不正アクセスをしたプ（黄色反転部分）
行を強調表示ード
アドレスサニタイザモ
使い方は簡単。
で考自分。
ですだけするでビルドして実行を設 定するなど必ント
ポイーク
ブレえて-OSがSOLID-IDEとSOLID要ありません。
自動スをクセ
間違ったメモリア連携して、。
ますくれ
的にあぶり出して動画で詳しく見る