MMUとプロテクション機能を積極的に使った、 新 …...2018.07.27...
Transcript of MMUとプロテクション機能を積極的に使った、 新 …...2018.07.27...
MMUとプロテクション機能を積極的に使った、新しいRTOSシステム
2018.07.27 京都マイクロコンピュータ株式会社 1
バグの自動検出も可能な新開発環境
京都マイクロコンピュータについて
• 設立 1985年• CEO 山本 彰一• 国内拠点 本社・開発拠点 京都市西京区
東京オフィス 港区新橋• 海外販売 韓国代理店:Nextech Solutions Co., Ltd
インド代理店:Celestial Systems Pvt. Limited• 主要製品 JTAGエミュレータ PARTNER-Jet2
GCC コンパイラ exeGCC開発プラットフォーム SOLID
2018.07.27 京都マイクロコンピュータ株式会社 2
とは
2018.07.27 京都マイクロコンピュータ株式会社 3
2018.07.27 京都マイクロコンピュータ株式会社
プラットフォーム変更のお悩み
ベアメタル
RTOS
システムも大型化してきたし、
アプリも複雑化してきたし、そろそろ…
RTOS
Linux
システム設計大変そう
デバッグ大変そう
printfデバッグで、やり切れるか?
プログラミングモデルのパラダイムシフトはリスク、できれば
RTOS を使い続けたいな
リアルタイム性も確保でマルチCPU +マルチOSそんなのうちで作れるのかよ?
開発リソース不足も心配
お使いのプラットフォーム
検討中プラットフォーム
4
2018.07.27 京都マイクロコンピュータ株式会社
組込みソフトウエア開発の普遍的なお悩み
・納期どおりに開発する
・品質を確保する
・快適な操作性
・出来るだけ安価に
これらを実現するための開発環境として生まれたのが、SOLID開発プラットフォームです。
5
2018.07.27 京都マイクロコンピュータ株式会社
• 開発環境とRTOSが一体化提供される、組み込み向けソフトウェア開発プラットフォーム
• SOLID-IDE• VisualStudioベースのIDE
• GCC/Clangコンパイラベースのツールチェイン
• KMCが創業以来培ってきたデバッガ
• SOLID-OS• リアルタイムOS(TOPPERSカーネル)
• Armプロセッサに対応した専用ランタイムライブラリ
• これを一つ用意するだけで、開発がスタートできる「優れモノ」
とは
6
2018.07.27 京都マイクロコンピュータ株式会社
SOLID-OS SOLID-IDE
LLVM/Clangコンパイラ
デバッガ
(Visual Studioベース)
JTAG/デバッグモニタ
TOPPERS/ASP3, FMPデバッグ支援, ミドルウェア ツールを
パッケージ化した統合開発環境
ここが新しい!
従来は、、、7
2018.07.27 京都マイクロコンピュータ株式会社
連携というより、むしろ、各々のツールが専用設計されている
• RTOS実装とコンパイラの専用化
• RTOS実装とデバッガの専用化
• コンパイラとデバッガの専用化
• IDEを、RTOS,コンパイラ,デバッガに合わせて専用化
組み合わせを限定することで、使う側には、一体専用設計によるメリットが大きく享受される。
そんな開発プラットフォームがSOLID です。
8
本日の三つのポイント
• RTOSなのに、MMUによるプロテクションが簡単!!
• RTOSなのに、ファイルからの実行が簡単
• RTOSなのに、リッチなデバッグ開発環境
2018.07.27 京都マイクロコンピュータ株式会社 9
RTOSなのに、MMUによるプロテクションが簡単!!
SOLID-OSでのMMU対応について
2018.07.27 京都マイクロコンピュータ株式会社 10
従来の多くの開発案件では、、、、
Cortex-AでRTOSを使うとき、MMUはキャッシュオン(データキャッシュ有効化)のために”だけ”使っていませんか?
• Linuxなどの高級OSを使う場合は、それらのシステムがMMUを高機能に使ってくれるが、、、、
• そうでない場合、極端にMMUを有効活用していないのが多いのでは?
2018.07.27 京都マイクロコンピュータ株式会社 11
MMUを積極的に使うには
おそらくMMUを使うための設定のプログラムなどが、なかなか面倒だったのでは?
SOLIDが解決しますさっきから同じ事、しつこいですよね、、、ただ、これがSOLID作る大きなきっかけの一つなので、、、
• メモリマップエディタによる簡単な設定で仮想アドレスを有効化
• MMU周りのAPIを整備して提供
2018.07.27 京都マイクロコンピュータ株式会社 12
メモリマップエディタで設定した例
物理アドレスマップ 論理アドレスマップ
2018.07.27 京都マイクロコンピュータ株式会社 13
メモリマップエディタで設定した例
周辺レジスタの領域は、プログラム開発しやすいよう論物一致で設定
同じアドレスのバッファを、、
異なるアドレスで、キャッシュオンと、
キャッシュオフで割り付け
2018.07.27 京都マイクロコンピュータ株式会社 14
MMU関連APIの例
• メモリマップエディタで設定すると、自動的に設定テーブルが生成され実行時に初期化されるが、それだけでなく、後からプログラム中でAPIを使ってMMUを制御する事も出来ます
• 物理アドレスの論理割り当て、解放関連
• SOLID_MEM_Map, SOLID_MEM_Unmap, …
• I/O領域の論理割り当て、解放関連
• SOLID_MEM_AllocIO, SOLID_MEM_FreeIO, …
• 論理アドレス管理関連
• SOLID_MEM_IsValid, SOLID_MEM_VA2PA, SOLID_MEM_SetAttr, …
• キャッシュコントロール関連
• SOLID_MEM_CACHE_Invalidate, SOLID_MEM_CACHE_Clean, …
• 詳しくは以下のドキュメントで
• http://solid.kmckk.com/doc/skit/current/os/cs/memory.html
2018.07.27 京都マイクロコンピュータ株式会社 15
では、SOLIDはLinuxなのか??
SOLIDではMMUを簡単に積極的に使うために割り切りをした
割り切って出来なくしたこと
•ユーザーモードを使わない• 全てのプログラムはスーパーバイザーモードで実行• したがって、割り当てた領域は、全てどこからでもアクセス可能
•基本的にページテーブルを切り替えない• Linuxユーザー空間のように、同じアドレスで異なるメモリ、にはしない• メモリ空間は単一の一つの空間しか存在しない
2018.07.27 京都マイクロコンピュータ株式会社 16
SOLIDは割り切りのMMUだから、、、、
• メモリ空間が一つしかない• 同じ論理アドレスは、同じメモリ
• 実行レベルは常に一つ• どこからでも、どこのメモリをアクセス可能
すなわち、今までのRTOSでのプログラムでのメモリアクセスとなんら変わらない!!
• プログラム中で新しく学習する必要があまりない
• いままでのプログラムを効率よく移植して実行が可能
2018.07.27 京都マイクロコンピュータ株式会社 17
MMUを積極的に使うと
• メモリプロテクションを使った効率よい開発
• 0番地などはメモリを割り当てない
• 実行メモリなどは書き換え不能に設定
• SOLIDでは開発環境のリンカスクリプトとSOLID-OSの連携で、各セクションのメモリアクセス権を自動設定します
• 物理的なメモリを効率よく利用
• SOLIDでは4Kページを採用することで、効率よくメモリ割り当てをします
• 論理アドレスが離れていても、その隙間に物理メモリを割り当てる必要はありません
• ELFローダーの利用
• SOLIDのELFローダーは、MMUで論理アドレスが使える事を前提に動作します
• サブモジュールは論理アドレス固定で作成することで、実行効率をよくしています
• 論理アドレス固定でも、隙間に物理メモリを割り当てないので、メモリ利用効率に優れます
2018.07.27 京都マイクロコンピュータ株式会社 18
SOLIDでのMMU関係の注意点
•通常のプログラムでは、特に意識する必要はないが、DMAの場合は以下の注意が必要• DMAコントローラには物理アドレスを渡す必要がある
• 専用APIでアドレスを取得すれば良い
• DMA前後に適切にキャッシュメンテナンスが必要• これは今までも同じだが、専用APIを用意しているので、それを利用すること
•これ以外は、MMUを有効にしていても、今までと同じ感覚でRTOSプログラムが可能• I/O領域をアドレス変換した場合、その部分は変換して読み替え必要だが、アドレス変換しなければ、これも必要なし
2018.07.27 京都マイクロコンピュータ株式会社 19
SOLID-OSのMMUによる安全な開発
• コンパイル・リンクしたプログラムは、各セクション毎に適切にMMUの権限が設定されます• .textなど 実行可能、リード可能、ライト不可能
• .rodataなど 実行不可能、リード可能、ライト不可能
• .dataや.bssなど 実行不可能、リードライト可能
• プログラムバグなどで、実行命令などの書き込みからの破壊を即時検出します
• タスクのスタック突き抜けを保護します• RTOSが生成するタスクスタックを割り当てるとき、隣接境界のメモリを割り当てないことで、スタックを使いすぎたときに、即時に検出します
2018.07.27 京都マイクロコンピュータ株式会社 20
スタック突き抜け検出の様子
スタック突き抜け詳細情報
← RTOS状態表示のスタック消費量
2018.07.27 京都マイクロコンピュータ株式会社 21
RTOSなのに、ファイルからの実行が簡単
SOLIDローダーの概要
2018.07.27 京都マイクロコンピュータ株式会社 22
SOLIDの複数プログラム対応
• 標準搭載のELFローダーの仕組みを使えば、分割開発、分割ロードが可能• 分割開発ごとに、実行ファイルを生成可能。SOLIDのELFローダーが、メモリを効率的に実行ファイルを展開し、実行
• ローダー機能は、特にRTOS(TOPPERS/ASP3, TOPPERS/FMP)に依存せず実装• ローダーが存在するからといって、RTOSを使ったプログラム方法は変化しない
• SOLIDローダーの機能は、シンボルへのアドレス解決をしているだけ
• ELFローダーとRTOSマルチタスクを使えば、複数アプリケーションの並列実行のような環境を実現• 並列実行は必須ではなく、シングルタスクでも可能です
2018.07.27 京都マイクロコンピュータ株式会社 23
実行時のイメージ
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
アプリ1
アドレス解決
相互呼び出し可能
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
アプリ1
アドレス解決
相互呼び出し可能
アプリ 2
アドレス解決
相互呼び出し可能
アドレス解決
相互呼び出し可能
起動直後
アプリ1ロード
アプリ2ロード
2018.07.27 京都マイクロコンピュータ株式会社 24
アプリサイズ変更も問題なし
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
アプリ1
アドレス解決
相互呼び出し可能
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
アプリ1
アドレス解決
相互呼び出し可能
アプリ 2
アドレス解決
相互呼び出し可能
アドレス解決
相互呼び出し可能
起動直後
アプリ1ロード
アプリ2ロード
2018.07.27 京都マイクロコンピュータ株式会社 25
システム部分のサイズ変更や、アプリ開始アドレス変更も問題なし
メモリ空間SOLIDシステム + RTOS
+ システム初期アプリケーション
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
アプリ1
アドレス解決
相互呼び出し可能
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
アプリ1
アドレス解決
相互呼び出し可能
アプリ 2
アドレス解決
相互呼び出し可能
アドレス解決
相互呼び出し可能
起動直後
アプリ1ロード
アプリ2ロード
2018.07.27 京都マイクロコンピュータ株式会社 26
MMUを使ったメモリ管理で、隙間があっても効率的なメモリ利用が可能
メモリ空間SOLIDシステム+ RTOS
+ システム初期アプリケーション
アプリ1 アプリ 2
実行する時のメモリ空間は、MMUを設定した仮想アドレス空間を利用
物理メモリ空間
SOLIDシステム+ RTOS+ システム初期アプリケーション
アプリ1 アプリ 2
この隙間には、実際にはメモリが存在しない。アクセスすると例外発生
2018.07.27 京都マイクロコンピュータ株式会社 27
SOLIDローダーの特長
• 各サブモジュールは、固定の論理アドレスでリンク• 実行時(ローディング時)に、アドレス再配置を行わない
• 実行時には未解決シンボルのみ、アドレスを解決して設定
• 各サブモジュールの実行アドレスをあらかじめ決めておく必要はあるが、実メモリの予約は不要• 必要なメモリをローディング時に払い出す
• 関数だけでなく、変数のアドレスも解決可能
• 複数のサブモジュールをローディング可能
• アンロードが可能• ただし、そのモジュールの公開しているシンボルが、どのモジュールも利用していない場合に可能
• 実装としては、スタティックリンクの最後の工程を、実行時に行っている感じ• 解決後の命令などはスタティックリンクしたものと同じ
2018.07.27 京都マイクロコンピュータ株式会社 28
ローダー対応に必要な条件
• SOLID開発環境で作成できること
• ツールチェイン(コンパイラやリンカ)に専用機能を追加しているので、SOLID開発環境利用が前提
• ARM側プログラムに、SOLIDコアサービスのうち、以下の追加が必須
• SOLID ELFローダ
• SOLID ARM v7メモリ管理マネージャ
• SOLID ファイルシステム抽象化レイヤ
• ファイルシステムの実体は、システムやユーザー毎に自由に変更・実装が可能
• Exportシンボルリスト
• テキストファイルに、アプリケーションが外部公開するシンボル名を定義すること。関数のプロトタイプや変数種別など型情報は必要なく、シンボル名称のみをテキストのリストアップ
• マルチタスク機能が必要な場合には、RTOSを追加
2018.07.27 京都マイクロコンピュータ株式会社 29
開発やデバッグ
• SOLID-IDEでアプリケーションプロジェクトを作成してビルド• 他のアプリケーションのプロジェクトや、ベースシステムのプロジェクトが無くてもかまわない
• SOLID-IDEを使ってアプリケーション単体だけをデバッグ可能
• ベースシステムや他のアプリケーションがROMなどに書き込んである状態で、開発しているアプリケーションのみをIDEデバッガからデバッグ可能
• ROMなどに書いてあるアプリケーションを、SOLID-IDEで作成したアプリケーションと置き換えてデバッグ可能
2018.07.27 京都マイクロコンピュータ株式会社 30
システムに応じて必要なFSやデバイス
に対応して実装
SOLID 標準実装としてKMCから提供
SOLIDファイルシステム
SOLIDファイルシステム抽象化レイヤ
FAT FS RAM FS ROMFS ・・・・・・・
SOLID ELFローダ
SD CF HDD DDR NORSPI
NORNAND ・・・・・・・
2018.07.27 京都マイクロコンピュータ株式会社 31
SOLIDローダーがある事で可能になること
• アプリケーション毎の分割開発が可能• 機能毎に分割したアプリケーションとして開発
• 協力会社と連携して開発するときに、アプリケーション分割して開発
• 開発する以外のアプリケーションは、ソースやオブジェクトなどが無い実行バイナリのみも可能• システムや基本アプリケーションをROMに書いておき、協力会社に提供して追加アプリケーションのみ作成してもらう、など
• MMU対応なので、余裕をもったアドレス割り当てをしても効率的にメモリを利用可能
• 機器の試験用アプリケーションを作成、用意しておき、試験モード起動などの作成が簡単に
2018.07.27 京都マイクロコンピュータ株式会社 32
ローダーがあると、、、分散開発へ応用
開発協力会社がアプリケーション単位で、プログラムを分担して開発
担当部分以外のソースコード無しで開発を実施
2018.07.27 京都マイクロコンピュータ株式会社 33
ローダーがあると、、、仕向地向け開発への応用
ローダーがないと、、、、
また、自作のローダー的な物を作って対応、など
SOLIDのローダーは、アドレス解決の仕組みです。関数コールだけでなく、変数のアドレス解決も可能。
すなわち、データをローダーで入れ替える事も可能ので、仕向地別のメッセージなどの入れ替えに応用することも可能
2018.07.27 京都マイクロコンピュータ株式会社 34
RTOSなのに、リッチなデバッグ開発環境
SOLIDローダーを使った具体的なプログラム
2018.07.27 京都マイクロコンピュータ株式会社 35
代表的な自動バグ検出機能
•ソースコード静的解析機能を標準搭載
• 追加設定なく、ビルドの設定さえあれば、解析可能
• 0除算や不正ポインタアクセスの可能性などを検出
•アドレスサニタイザによる実行時メモリバグ検出機能
• iOSアプリ開発環境などで定評のアドレスサニタイザを、
組み込みで初めて実現
• バッファオーバーランや、解放後のメモリアクセスなど、
不正アクセスを自動検出
2018.07.27 京都マイクロコンピュータ株式会社 36
実行前のバグ検出が可能。デバッグを効率良くします
プログラムの流れを遡って解析し、不具合に至る「きっかけ」となり得る処理を指摘します。
静的解析機能
2018.07.27 京都マイクロコンピュータ株式会社 37
アドレスサニタイザ(メモリアクセスバグの自動検出)
・バッファオーバーラン・不正ポインタ・二重解放など
手順はとてもシンプルサニタイザモードでビルド&実行するだけです。バグを検出する様子を動画で見てみましょう。
アドレスサニタイザ
2018.07.27 京都マイクロコンピュータ株式会社 38
RTOSの状態分析
•イベントトラッカー(タスク遷移の解析)
• RTOSのプロセス・タスク・スレッドなどの遷移表示機能です。JTAGエミュレータであるPARTNER-Jet2と連動して動作するので、イベントトラッカーとCPUのリアルタイムトレースを連携させた解析が可能です。
• RTOSの資源表示• プログラムをブレークしたときのタスクの状態や、スタックの使用量などが一目でわかります。
2018.07.27 京都マイクロコンピュータ株式会社 39
イベントトラッカの結果を表示
• 機能が豊富にあるのですが、ここでは基本的な操作のみ説明します。
モジュール名TID: タスク
INT: 割り込みCYC: 周期ハンドラ
時間軸
緑実線:CPU実行中
黒破線:CPU実行可能
赤破線:待ち状態
青四角:待ち遷移イベント
2018.07.27 京都マイクロコンピュータ株式会社 40
プログラムをブレークしたときのタスクの状態や、スタックの使用量などが一目
でわかります。
RTOSの資源表示
2018.07.27 京都マイクロコンピュータ株式会社 41
SOLID-IDE標準搭載機能
•カバレッジ計測機能を標準搭載
• 実行済み・非実行コードが一目でわかる
• パフォーマンスチューニングのポイントが簡単に絞り込める
• LLVM-Clnagコンパイラの機能を利用しており、簡単に使えます
• ソース単位でカバレッジ測定する・しないを設定できます
•サイズプロファイル機能も標準搭載
• ROM化時のサイズ検討等が簡単にできます
• コンパイル単位で分析、セクション単位で分析、など、生成されたELF
ファイルを様々な角度からサイズ分析できます
2018.07.27 京都マイクロコンピュータ株式会社 42
コードカバレッジの機能
ソースコード中の各ベーシックブロック単位ごとに、実行された回数を記録、表示します。
ソースコード単位のカバレッジサマリーを一覧表示
ソースコード上に実行回数をグラフィカルに表示
2018.07.27 京都マイクロコンピュータ株式会社 43
コードカバレッジの使い方
関数単位のサマリ表示
• 関数単位のカバレッジを、カウント数の順位で一覧表示
• 関数名でソートすることもできます。
[解析]後、「ビュー」を「カバレッジ」-> 「関数」に切り替える
2018.07.27 京都マイクロコンピュータ株式会社 44
まとめると
2018.07.27 京都マイクロコンピュータ株式会社 45
本日の三つのポイント
• RTOSなのに、MMUによるプロテクションが簡単!!
• RTOSなのに、ファイルからの実行が簡単
• RTOSなのに、リッチなデバッグ開発環境
2018.07.27 京都マイクロコンピュータ株式会社 46
本日のポイント
SOLIDは、
ITRON以上Linux未満を実現する開発環境
従来のプログラムモデルのまま、
Linuxライクな効率良い開発が可能
2018.07.27 京都マイクロコンピュータ株式会社 47
SOLIDの進化
2018.07.27 京都マイクロコンピュータ株式会社 48
SOLIDの64bit対応
• 32bit ARM Cortex-A対応のSOLID• シングルコア用
• マルチコアSMP用
• ARM V8A(Cortex-A53など)の、32bitモードも対応すみ
• 64bit ARM Cortex-A対応のSOLID• ARM V8Aの、64bitモードで動作するSOLIDを現在開発中
• 2018/12ごろに先行提供の予定で作業中
492018.07.27 京都マイクロコンピュータ株式会社
LinuxとSOLIDの混在構成(試作中)
A57 x 4 A53 x 4
Linux
Non-Secure/EL0,EL1
SOLID-OS
Secure/EL1
ATF/EL3
2018.07.27 京都マイクロコンピュータ株式会社 50
RTOSでCPUを占有する
A57 x 4 A53 x 4
LinuxNon-Secure/EL0,EL1 SOLID-OS
Secure/EL1
ATF/EL3
LinuxNon-Secure/EL0,EL1
Xen-VMNon-Secure/EL2
Hypervisorの存在にかかわらず、RTSOに専用CPUを割り当て、Linux系OSの影響を排除する
2018.07.27 京都マイクロコンピュータ株式会社 51
おわり
http://www.kmckk.co.jp/
https://solid.kmckk.com/SOLID/
2018.07.27 京都マイクロコンピュータ株式会社 52