(57)【特許請求の範囲】
【請求項１】
入出力インターフェースを管理するカーネルと前記カーネルの機能を呼び出すシステムコールとを含むオペレーティングシステムと、前記システムコールを呼び出すことにより前記入出力インターフェースに接続されている電装品を制御するプログラムと、を記憶する二次記憶装置と、
前記プログラムの実行状態であるプロセスにより想定される前記システムコールの呼び出し状況に基づいて、前記プログラムに悪意があるか否かを判定するＣＰＵと、
を備え、
前記ＣＰＵは、予め設定された許容周期内に前記プログラムに含まれる複数の処理部分が呼び出され、前記複数の処理部分の実行順序が前記プログラムの仕様通りであって、前記プロセスのうち前記複数の処理部分を監視する監視プロセスの戻り値がエラー値以外である場合、前記プログラムに悪意がないと判定する車載制御装置。
【請求項２】
前記ＣＰＵは、前記プロセスにより想定される処理結果に基づいて、前記プロセスの継続、終了及び再起動のいずれか１つを実行する請求項１に記載の車載制御装置。
【請求項３】
前記ＣＰＵは、複数の前記プロセスが生成されている場合、各前記プロセスのうち、悪意がある前記プロセスを終了し、悪意がない前記プロセスを継続する請求項１又は請求項２に記載の車載制御装置。
【請求項４】
前記ＣＰＵは、複数の前記電装品が前記入出力インターフェースに接続されている場合、各前記電装品に対応する前記プログラム毎に悪意があるか否かを判定する請求項２又は請求項３に記載の車載制御装置。
【請求項５】
前記ＣＰＵは、前記システムコールの開始アドレスが正しく設定されている場合、前記プログラムに悪意がないと判定する請求項１から請求項４のいずれか一項に記載の車載制御装置。
【請求項６】
前記ＣＰＵは、前記システムコールの呼び出し回数が予め設定された許容回数の範囲内である場合、前記プログラムに悪意がないと判定する請求項１から請求項５のいずれか一項に記載の車載制御装置。
【請求項７】
前記ＣＰＵは、前記プロセス毎に想定される前記呼び出し回数を計測してから前記システムコールを呼び出す請求項６に記載の車載制御装置。
【請求項８】
前記ＣＰＵは、前記プログラムに悪意がないと判定する場合、前記プロセスのうち、車両を安全に稼働させる安全確保処理を対象とするメッセージ認証コードを更新する請求項１から請求項７のいずれか一項に記載の車載制御装置。
【請求項９】
共有メモリ
をさらに備え、
前記ＣＰＵは、前記プロセスの識別子となるプロセスＩＤに前記メッセージ認証コードを関連付けた状態で、前記プロセスＩＤと前記メッセージ認証コードとを前記共有メモリに記憶させる請求項８に記載の車載制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、車載制御装置に関する。
【背景技術】
【０００２】
従来、車両システム内における故障発生時に故障したＥＣＵ（Ｅｌｅｃｔｒｏｎｉｃ  Ｃｏｎｔｒｏｌ  Ｕｎｉｔ）を特定し、車両が稼働可能なうちにバックアップとして用意した制御に切り替えるものが知られている（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】国際公開第２０１８／２２９９３０号
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、従来の車両システムは、悪意のあるプログラムの実行が想定される場合、バックアップとして用意した制御への切り替えを妨害される可能性がある。従って、悪意のあるプログラムによって車両システムが妨害された状態で車両の稼働を継続させるのは難しい。
【０００５】
本開示は、上記のような課題を解決するためになされたものであり、悪意のあるプログラムによって車両システムが妨害された状態でも車両の稼働を継続させることができる車載制御装置を得ることを目的とする。
【課題を解決するための手段】
【０００６】
本開示に係る車載制御装置は、入出力インターフェースを管理するカーネルと前記カーネルの機能を呼び出すシステムコールとを含むオペレーティングシステムと、前記システムコールを呼び出すことにより前記入出力インターフェースに接続されている電装品を制御するプログラムと、を記憶する二次記憶装置と、前記プログラムの実行状態であるプロセスにより想定される前記システムコールの呼び出し状況に基づいて、前記プログラムに悪意があるか否かを判定するＣＰＵと、を備え、前記ＣＰＵは、予め設定された許容周期内に前記プログラムに含まれる複数の処理部分が呼び出され、前記複数の処理部分の実行順序が前記プログラムの仕様通りであって、前記プロセスのうち前記複数の処理部分を監視する監視プロセスの戻り値がエラー値以外である場合、前記プログラムに悪意がないと判定する。
【発明の効果】
【０００７】
本開示によれば、悪意のあるプログラムによって車両システムが妨害された状態でも車両の稼働を継続させることができる。
【図面の簡単な説明】
【０００８】
【図１】実施の形態による車載制御装置の構成の一例を示す図である。
【図２】図１の二次記憶装置に記憶されている各種プログラムの階層例を示す図である。
【図３】図２の上位制御プログラムが上位のＥＣＵに設けられたＲＡＭに転送されて上位制御プロセスとして存在している状態の一例を示す図である。
【図４】図３の上位制御プロセスに関するプログラム監視状態の一例を示す図である。
【図５】図１のマイコンに設けられたＲＯＭに存在している下位制御プログラムの一例を示す図である。
【図６】図３の起動初期化処理のうち起動に関する処理を説明するフローチャートである。
【図７】図６のステップＳ１５におけるシステムコールテーブル書き換え処理を説明するフローチャートである。
【図８】図３の主処理を説明するフローチャートである。
【図９】図３の起動初期化処理のうち初期化に関する処理を説明するフローチャートである。
【図１０】図８のステップＳ４３及びステップＳ４８における異常要因判定処理を説明するフローチャートである。
【図１１】図１０のステップＳ８２における異常要因対処処理を説明するフローチャートである。
【図１２】図１１のステップＳ１０７及びステップＳ１１０における図３の安全確保処理を説明するフローチャートである。
【図１３】図８のステップＳ４６における図３のシステムコールテーブル監視処理を説明するフローチャートである。
【図１４】図３のシステムコール監視処理を説明するフローチャートである。
【図１５】図３の主処理から呼び出される各種処理を説明するフローチャートである。
【図１６】図５の下位制御プログラムに含まれる起動初期化処理を説明するフローチャートである。
【図１７】ハードウェア構成例を説明する図である。
【図１８】他のハードウェア構成例を説明する図である。
【発明を実施するための形態】
【０００９】
図１は、実施の形態による車載制御装置の構成の一例を示す図である。図１の一例においては、上位の電子制御装置であるＥＣＵ１と、下位の電子制御装置であるＥＣＵ２とが、通信線６を介して接続されていることにより、車両に搭載される車両システムが構成されている。ＥＣＵ１及びＥＣＵ２は、通信線６を介して互いに連係して各種制御を実行する。なお、通信線６には、例えば、ワイヤーハーネスが用いられている。
【００１０】
ここで、ＥＣＵは、Ｅｌｅｃｔｒｏｎｉｃ  Ｃｏｎｔｒｏｌ  Ｕｎｉｔを意味する電子制御装置の総称である。ＥＣＵ１及びＥＣＵ２は、車載電装品を制御する。
【００１１】
具体的には、ＥＣＵ１には、車載電装品として、カメラ３、レーダー４及びディスプレイ５が接続されている。ＥＣＵ１は、カメラ３及びレーダー４の検知結果に基づいて、ディスプレイ５に各種画像を表示させる。
【００１２】
カメラ３は、例えば、フロントガラスの車室側のうちバックミラーの隣に取り付けられている。カメラ３には、例えば、単眼カメラが用いられている。単眼カメラは、撮像素子を有している。撮像素子は、例えば、ＣＣＤイメージセンサ又はＣＭＯＳイメージセンサである。ＣＣＤは、Ｃｈａｒｇｅ  Ｃｏｕｐｌｅｄ  Ｄｅｖｉｃｅの略称である。ＣＭＯＳは、Ｃｏｍｐｌｅｍｅｎｔａｒｙ  Ｍｅｔａｌ  Ｏｘｉｄｅ  Ｓｅｍｉｃｏｎｄｕｃｔｏｒの略称である。単眼カメラは、撮像素子の撮像方向に対して直交する２次元空間における画素レベルを最小単位として連続的に物体の有無を検出可能である。
【００１３】
レーダー４は、例えば、車両におけるフロントバンパー及びリアバンパーのそれぞれに取り付けられている。レーダー４には、例えば、ミリ波レーダーが用いられている。ミリ波レーダーは、１つの送信アンテナと、複数の受信アンテナとを有している。ミリ波レーダーは、物体との距離及び相対速度を測定可能である。
【００１４】
ディスプレイ５は、例えば、フロントガラスの下部の領域にあるダッシュボードに取り付けられている。ディスプレイ５には、例えば、タッチパネル付き液晶ディスプレイが用いられている。
【００１５】
ＥＣＵ１は、ＳｏＣ１０、二次記憶装置１２及びＲＡＭ１３を備えている。
【００１６】
ＳｏＣは、Ｓｙｓｔｅｍ−ｏｎ−ａ−Ｃｈｉｐの略称である。ＲＡＭは、Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙの略称である。
【００１７】
ＳｏＣ１０は、ＥＣＵ１において制御部として機能する。ＳｏＣ１０は、入出力インターフェース１０１、ＣＰＵ１０２、メモリインターフェース１０３、ＨＳＭ１０４、ＲＯＭ１０５、タイマ１０６及び通信インターフェース１０７を備えている。
【００１８】
ＣＰＵは、Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔの略称である。ＨＳＭは、Ｈａｒｄｗａｒｅ  Ｓｅｃｕｒｉｔｙ  Ｍｏｄｕｌｅの略称である。ＲＯＭは、Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙの略称である。
【００１９】
入出力インターフェース１０１は、カメラ３及びレーダー４のそれぞれからの入力データをＳｏＣ１０に入力する入力インターフェースとして機能する。入出力インターフェース１０１は、カメラ３及びレーダー４に制御信号を出力する。入出力インターフェース１０１は、カメラ３から入力データとして画像データの入力を受け付ける。入出力インターフェース１０１は、レーダー４から入力データとして障害物データの入力を受け付ける。
【００２０】
また、入出力インターフェース１０１は、ＳｏＣ１０からの出力データをディスプレイ５に出力する出力インターフェースとして機能する。入出力インターフェース１０１は、ディスプレイ５に出力データとして映像データを出力する。これにより、ディスプレイ５は、映像データに基づいた画像を表示することができる。
【００２１】
なお、図示は省略するが、ＳｏＣ１０は、ＤＭＡを備えている。ＤＭＡは、Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓの略称である。入出力インターフェース１０１は、ＤＭＡの機能を利用することにより、ＣＰＵ１０２を介さずに、入力データをＲＡＭ１３に転送することができる。同様に、入出力インターフェース１０１は、ＤＭＡの機能を利用することにより、ＣＰＵ１０２を介さずに、出力データをＲＡＭ１３から転送することができる。これにより、転送処理を効率化することができる。
【００２２】
ＣＰＵ１０２は、コアを有している。ＣＰＵ１０２は、コアにより各種演算を実行する。ＣＰＵ１０２は、実行した演算結果に基づいて、車載電装品を制御する機能を有している。
【００２３】
具体的には、ＣＰＵ１０２は、ＳｏＣ１０に電源が投入された場合、動作を開始する機能を有している。ＣＰＵ１０２は、ＲＯＭ１０５に書き込まれた各種プログラムの実行を開始する機能を有している。ＣＰＵ１０２は、メモリインターフェース１０３を介して、二次記憶装置１２に記憶されているものをＲＡＭ１３に転送することにより、車載電装品を制御する機能を有している。
【００２４】
なお、ＣＰＵ１０２は、シングルコアから構成されているだけでなく、マルチコアから構成されていてもよい。また、ＣＰＵ１０２は、通常実行されているプログラムとは別に適宜別のプログラムによる割り込み処理をすることができる。
【００２５】
メモリインターフェース１０３は、二次記憶装置１２とＳｏＣ１０との間における各種データの送受信と、ＲＡＭ１３とＳｏＣ１０との間における各種データの送受信とを行うインターフェースである。
【００２６】
具体的には、メモリインターフェース１０３は、ＣＰＵ１０２又はＤＭＡからのデータアクセス要求に応じて、二次記憶装置１２及びＲＡＭ１３のそれぞれに適したコマンドを発行する。これにより、メモリインターフェース１０３は、二次記憶装置１２及びＲＡＭ１３のそれぞれに記憶されている各種データにアクセス可能である。
【００２７】
ＨＳＭ１０４は、セキュリティの強度を高めるために、秘密鍵を外部に漏洩しないように記憶している。ＨＳＭ１０４は、データの暗号化及び復号、メッセージ認証コードの生成及び検証、デジタル署名の検証等を行う機能を有している。これらの機能は、ＣＰＵ１０２からＨＳＭ１０４にアクセスすることで利用される。
【００２８】
なお、ＨＳＭ１０４には、秘密鍵が既に書き込まれている。また、ＨＳＭ１０４は、メッセージ認証コードの生成及び検証並びにデジタル署名の検証が可能な状態に設定されている。
【００２９】
ＲＯＭ１０５には、ＳｏＣ１０に電源が投入されてからＣＰＵ１０２が動作を開始するときに最初に実行するプログラムが記憶されている。ＲＯＭ１０５には、ＩＰＬと呼ばれるプログラムが記憶されている。ＩＰＬは、Ｉｎｉｔｉａｌ  Ｐｒｏｇｒａｍ  Ｌｏａｄｅｒの略称である。
【００３０】
タイマ１０６は、発振回路から出力されるクロック信号をカウントする。発振回路は、例えば、水晶発振器又はセラミック振動子である。タイマ１０６は、ＣＰＵ１０２の要求に応じて、クロック信号に基づいた各種タイミング信号を生成する。
【００３１】
通信インターフェース１０７は、他の機器と、ＳｏＣ１０との間における通信を実現するインターフェースである。通信インターフェース１０７は、ＣＡＮ、ＣＡＮ  ＦＤ、ＦｌｅｘＲａｙ、Ｅｔｈｅｒｎｅｔ（登録商標）等の各種通信規格に準拠している。これにより、通信インターフェース１０７は、通信線６を介して他の機器との通信を実現する。ここで、図１の一例では、通信媒体として有線の通信線６の一例について説明したが、通信媒体は、無線であってもよい。
【００３２】
なお、ＣＡＮは、Ｃｏｎｔｒｏｌｌｅｒ  Ａｒｅａ  Ｎｅｔｗｏｒｋの略称である。また、ＣＡＮ  ＦＤは、ＣＡＮ  ｗｉｔｈ  Ｆｌｅｘｉｂｌｅ  Ｄａｔａ−Ｒａｔｅの略称である。
【００３３】
二次記憶装置１２は、不揮発性の記憶装置である。二次記憶装置１２は、例えば、ＮＡＮＤ型のフラッシュメモリが用いられている。
【００３４】
二次記憶装置１２は、例えば、ＨＤＤ又はＮＯＲ型のフラッシュメモリが用いられてもよい。
【００３５】
なお、ＨＤＤは、Ｈａｒｄ  Ｄｉｓｃ  Ｄｒｉｖｅの略称である。
【００３６】
ＲＡＭ１３は、揮発性の記憶装置である。ＲＡＭ１３は、主記憶装置又はメインメモリとして機能する。
【００３７】
また、ＥＣＵ２には、車載電装品として、モータ７が接続されている。ＥＣＵ２は、モータ７に設けられているセンサ８の検知信号に基づいて、モータ７の駆動を制御する。
【００３８】
ＥＣＵ２は、マイコン２０、入力回路２２及び駆動回路２３を備えている。
【００３９】
マイコンは、マイクロコントローラユニット又はマイクロコンピュータの略称である。マイコン２０は、ＥＣＵ２において制御部として機能する。マイコン２０は、ＣＰＵ２０１、ＲＡＭ２０２、ＲＯＭ２０３、入出力インターフェース２０４、通信インターフェース２０５及びタイマ２０６を備えている。
【００４０】
ＣＰＵ２０１は、ＣＰＵ１０２と同様の機能を有している。従って、その詳細な説明は省略される。
【００４１】
ＲＡＭ２０２は、ＲＡＭ１３と同様の機能を有している。従って、その詳細な説明は省略される。
【００４２】
ＲＯＭ２０３は、ＲＯＭ１０５と同様の機能を有している。従って、その詳細な説明は省略される。
【００４３】
入出力インターフェース２０４は、入力回路２２とマイコン２０との間における入力インターフェースとして機能する。例えば、入出力インターフェース２０４は、アナログ信号をデジタル信号に変換し、変換したデジタル信号をマイコン２０に取り込む。
【００４４】
また、入出力インターフェース２０４は、マイコン２０と駆動回路２３との間における出力インターフェースとして機能する。例えば、入出力インターフェース２０４は、デジタル信号をアナログ信号に変換し、変換したアナログ信号を駆動回路２３に出力する。
【００４５】
通信インターフェース２０５は、他の機器と、マイコン２０との間における通信を実現するインターフェースである。通信インターフェース２０５は、通信インターフェース１０７と同じ通信規格に準拠している。これにより、通信インターフェース２０５は、通信線６を介して、ＥＣＵ１とＥＣＵ２との通信を実現する。
【００４６】
タイマ２０６は、タイマ１０６と同様の機能を有している。従って、その詳細な説明は省略される。
【００４７】
入力回路２２は、センサ８の検知信号を電圧として読み取る。入力回路２２は、読み取った電圧をマイコン２０内で処理可能な電圧値に変換する。入力回路２２は、変換した電圧値をマイコン２０に供給する。
【００４８】
駆動回路２３は、マイコン２０からの制御指令に基づいて、モータ駆動信号を生成する。駆動回路２３は、モータ駆動信号をモータ７に供給する。
【００４９】
なお、駆動回路２３の制御対象は、モータ７に限定されない。例えば、駆動回路２３の制御対象は、ＬＥＤのような光源であってもよい。ＬＥＤは、Ｌｉｇｈｔ  Ｅｍｉｔｔｉｎｇ  Ｄｉｏｄｅの略称である。駆動回路２３は、マイコン２０からの制御指令に基づいて、ＬＥＤの照度を制御してもよい。
【００５０】
なお、ＥＣＵ１は、本開示における車載制御装置に相当する。
【００５１】
また、カメラ３、レーダー４及びディスプレイ５は、本開示における電装品に相当する。
【００５２】
図２は、図１の二次記憶装置１２に記憶されている各種プログラムの階層例を示す図である。上位制御プログラム１２１は、複数のプログラムを含んでいる。各プログラムは、複数の処理を含んでいる。各処理は、複数の処理部分を含んでいる。
【００５３】
上位制御プログラム１２１は、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム、各種プログラムを監視するプログラム等を含んでいる。上位制御プログラム１２１の下層にはＯＳ１２２が存在している。
【００５４】
ＯＳは、Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍの略称である。
【００５５】
電装品に関するプログラムは、電装品毎に異なっている。
【００５６】
電装品としてのカメラ３に関するプログラムは、カメラデータ取得プログラム１２１Ｂ、画像変換プログラム１２１Ｃ、画像認識プログラム１２１Ｄ及び画像状況判定プログラム１２１Ｅを含む。
【００５７】
カメラデータ取得プログラム１２１Ｂは、カメラ３に固有の方式でカメラ３にアクセスし、カメラ３により撮像された画像データを取得するプログラムである。
【００５８】
画像変換プログラム１２１Ｃは、カメラデータ取得プログラム１２１Ｂにより取得された画像データを適した形式に変換するプログラムである。適した形式への変換は、対象を認識するために実行される。対象は、人、障害物等である。
【００５９】
画像認識プログラム１２１Ｄは、画像変換プログラム１２１Ｃにより変換したデータから、対象の種類、対象までの距離等を認識するプログラムである。
【００６０】
画像状況判定プログラム１２１Ｅは、画像認識プログラム１２１Ｄにより認識された対象の種類、対象までの距離等から最も優先すべき対処を判定するプログラムである。
【００６１】
電装品としてのレーダー４に関するプログラムは、レーダーデータ取得プログラム１２１Ｊ、レーダーデータ変換プログラム１２１Ｋ、レーダーデータ認識プログラム１２１Ｌ及びレーダー状況判定プログラム１２１Ｍを含む。
【００６２】
レーダーデータ取得プログラム１２１Ｊは、レーダー４に固有の方式でレーダー４にアクセスし、レーダー４により検知された検知結果を取得するプログラムである。
【００６３】
レーダーデータ変換プログラム１２１Ｋは、レーダーデータ取得プログラム１２１Ｊにより取得されたレーダー４の検知結果を適した形式に変換するプログラムである。適した形式への変換は、上記で説明したように、対象を認識するために実行される。
【００６４】
レーダーデータ認識プログラム１２１Ｌは、レーダーデータ変換プログラム１２１Ｋにより変換されたデータから、対象の種類、対象までの距離等を認識するプログラムである。
【００６５】
レーダー状況判定プログラム１２１Ｍは、レーダーデータ認識プログラム１２１Ｌにより認識された対象の種類、対象までの距離等から最も優先すべき対処を判定するプログラムである。
【００６６】
電装品としてのディスプレイ５に関するプログラムは、ディスプレイ表示プログラム１２１Ｎを含む。ディスプレイ表示プログラム１２１Ｎは、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム、各種プログラムを監視するプログラム等の実行結果に基づいた画像をディスプレイ５に表示させるプログラムである。
【００６７】
車両制御に関するプログラムは、総合状況判定プログラム１２１Ｆ及び通信プログラム１２１Ｈを含む。ここで、通信プログラム１２１Ｈは、通信線６を介して、車速、車両位置、車両挙動等を取得するプログラムである。車速は、例えば、車軸の回転数を計測するセンサから取得される。車両位置は、例えば、ＧＰＳから取得される。車両挙動は、例えば、操舵角を計測するセンサから取得される。
【００６８】
具体的には、総合状況判定プログラム１２１Ｆは、画像状況判定プログラム１２１Ｅの判定結果と、レーダー状況判定プログラム１２１Ｍの判定結果と、通信プログラム１２１Ｈの実行結果と、に基づいて、最も優先すべき対処を判定するプログラムである。
【００６９】
ＥＣＵ２に関するプログラムは、下位制御指示プログラム１２１Ｇを含む。
【００７０】
下位制御指示プログラム１２１Ｇは、総合状況判定プログラム１２１Ｆの判定結果に基づいて、ＥＣＵ２を制御するための具体的な下位制御指示値を算出するプログラムである。
【００７１】
各種プログラムを監視するプログラムは、起動監視プログラム１２１Ｙを含む。起動監視プログラム１２１Ｙは、上位制御プログラム１２１に含まれる起動プログラムリスト１２１Ｚと連動して実行される。
【００７２】
具体的には、起動監視プログラム１２１Ｙは、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれの実行を開始させるプログラムである。また、起動監視プログラム１２１Ｙは、これらのプログラムを必要に応じて監視するプログラムである。
【００７３】
起動プログラムリスト１２１Ｚは、記憶場所１２１ＺＡと、デジタル署名領域１２１ＺＢとを含んでいる。
【００７４】
記憶場所１２１ＺＡには、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれの二次記憶装置１２における記憶領域が設定されている。具体的には、例えば、二次記憶装置１２において、電装品に関するプログラムによって占有される記憶領域が設定されている。
【００７５】
なお、電装品としてカメラ３が車両に搭載されていない場合には、カメラデータ取得プログラム１２１Ｂ、画像変換プログラム１２１Ｃ、画像認識プログラム１２１Ｄ及び画像状況判定プログラム１２１Ｅの記憶領域は、記憶場所１２１ＺＡには設定されていない。
【００７６】
また、電装品としてカメラ３及びレーダー４が複数組車両に搭載されている場合には、その分の記憶領域が記憶場所１２１ＺＡに設定されている。
【００７７】
デジタル署名領域１２１ＺＢには、起動プログラムリスト１２１Ｚが不正に改ざんされたことを検出可能とするためにデジタル署名が付加されている。
【００７８】
ＯＳ１２２は、ＡＰＩ１２２１、カーネル１２２２及びカーネルモジュール１２２３を含んでいる。
【００７９】
ＡＰＩは、Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅの略称である。
【００８０】
ＯＳ１２２は、オペレーティングシステムである。ＡＰＩ１２２１は、アプリケーションプログラミングインターフェースである。ＡＰＩ１２２１は、システムコール１２２１Ａ及びライブラリ１２２１Ｂを含む。
【００８１】
システムコール１２２１Ａは、プログラムに対し、カーネル１２２２の機能を提供するインターフェースである。従って、システムコール１２２１Ａは、カーネル１２２２の機能を呼び出すことができる。システムコール１２２１Ａは、ｒｅａｄ、ｗｒｉｔｅ、ｏｐｅｎ、ｆｏｒｋ等である。このうち、ｆｏｒｋは、新しいプロセスを立ち上げる機能を有している。従って、起動監視プログラム１２１Ｙがプロセスを起動させるには、ｆｏｒｋが使用される。
【００８２】
なお、詳細についての説明は省略するが、ライブラリ１２２１Ｂは、よく使われる共通のサブルーチンである。
【００８３】
カーネル１２２２は、ハードウェア資源を管理する機能を有している。ハードウェア資源は、入出力インターフェース１０１、ＣＰＵ１０２、メモリインターフェース１０３、ＨＳＭ１０４、ＲＯＭ１０５、タイマ１０６及び通信インターフェース１０７である。従って、ハードウェア資源は、ＯＳ１２２の管理下にある。
【００８４】
例えば、カーネル１２２２は、入出力インターフェース１０１を管理する。従って、各種プログラムによりシステムコール１２２１Ａが呼び出されれば、システムコール１２２１Ａを介してカーネル１２２２の機能を呼び出すことができる。例えば、カメラデータ取得プログラム１２１Ｂは、システムコール１２２１Ａを呼び出すように実装されている。これにより、カメラデータ取得プログラム１２１Ｂは、入出力インターフェース１０１を管理できる。この結果、カメラデータ取得プログラム１２１Ｂは、カメラ３により撮像された画像データを取得することができる。
【００８５】
カーネルモジュール１２２３は、カーネル１２２２の機能を拡張するためのバイナリファイルである。
【００８６】
上位制御プログラム１２１は、ＳｏＣ１０に電源が投入された後、起動される。
【００８７】
具体的には、二次記憶装置１２に記憶されている上位制御プログラム１２１のうち、ＯＳ１２２が、ＲＯＭ１０５に記憶されているＩＰＬによってＲＡＭ１３に転送される。これにより、ＯＳ１２２の起動が開始される。これにより、ＲＡＭ１３の記憶領域は、ＯＳ１２２に管理される。
【００８８】
ＯＳ１２２が起動された後、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム及び各種プログラムを監視するプログラムが二次記憶装置１２からＯＳ１２２が管理するＲＡＭ１３の記憶領域に転送される。
【００８９】
これにより、ＯＳ１２２の管理下のプロセスとして、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム及び各種プログラムを監視するプログラムの実行が開始される。なお、起動プログラムリスト１２１Ｚは、起動監視プログラム１２１Ｙがプロセスとして実行中にＲＡＭ１３に読み出される。
【００９０】
即ち、プロセスは、プログラムの実行状態である。具体的には、プロセスとは、プログラムがＯＳ１２２によってＲＡＭ１３に読み込まれ、ＯＳ１２２の管理下にあるＣＰＵ１０２の実行単位である。なお、ＯＳ１２２にとっては、プロセスとはＲＡＭ１３等のようなメモリの管理単位である。
【００９１】
なお、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム及び各種プログラムを監視するプログラムの起動の順序は、ＥＣＵ１に要求される内容によって異なる。従って、車両制御に関するプログラム、ＥＣＵ２に関するプログラム及び各種プログラムを監視するプログラムの起動の順序は、任意である。
【００９２】
そこで、ここでは、実現の容易さから、ＯＳ１２２の起動後、まず、起動監視プログラム１２１Ｙの実行を開始するようにＯＳ１２２は設定されている。次に、起動監視プログラム１２１Ｙの実行可能な状態であるプロセスが、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれのプロセスの実行を開始させる。なお、起動監視プログラム１２１Ｙの実行可能な状態であるプロセスが、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれのプロセスを起動させる順序も任意である。
【００９３】
ここで、ＯＳ１２２の管理下にあるＲＡＭ１３は、本開示における共有メモリに相当する。
【００９４】
図３は、図２の上位制御プログラム１２１が上位のＥＣＵ１に設けられたＲＡＭ１３に転送されて上位制御プロセス１４０として存在している状態の一例を示す図である。図３に示すように、上位制御プロセス１４０は、共通処理１４１と、特有処理１４２とを有している。
【００９５】
共通処理１４１は、起動初期化処理１４１Ａ、主処理１４１Ｂ、内部監視処理１４１Ｃ、安全確保処理１４１Ｄ、プロセス間通信処理１４１Ｅ及びＥＣＵ間通信処理１４１Ｆを含んでいる。
【００９６】
共通処理１４１は、上位制御プログラム１２１に含まれる各プログラムに共通する処理である。
【００９７】
従って、カメラデータ取得プログラム１２１Ｂ、画像変換プログラム１２１Ｃ、画像認識プログラム１２１Ｄ及び画像状況判定プログラム１２１Ｅのそれぞれのプロセスは、共通処理１４１から構成されている。
【００９８】
また、総合状況判定プログラム１２１Ｆ、下位制御指示プログラム１２１Ｇ、ディスプレイ表示プログラム１２１Ｎ及び通信プログラム１２１Ｈのそれぞれのプロセスも同様に共通処理１４１から構成されている。
【００９９】
また、レーダーデータ取得プログラム１２１Ｊ、レーダーデータ変換プログラム１２１Ｋ、レーダーデータ認識プログラム１２１Ｌ及びレーダー状況判定プログラム１２１Ｍのそれぞれのプロセスも同様に共通処理１４１から構成されている。
【０１００】
一方、起動監視プログラム１２１Ｙの実行可能な状態であるプロセスは、共通処理１４１に加え、特有処理１４２を含んでいる。
【０１０１】
特有処理１４２は、上位制御プログラム１２１のうち起動監視プログラム１２１Ｙに特有の処理である。特有処理１４２は、システムコールテーブル監視処理１４２Ｈ、システムコール監視処理１４２Ｉ及びシステムコールテーブル書き換え処理１４２Ｊを含んでいる。また、特有処理１４２は、起動処理リスト１４２Ｋ、プロセスＩＤ記憶配列１４２Ｌ、旧システムコールテーブル記憶配列１４２Ｐ及びシステムコール回数記憶配列１４２Ｒを含んでいる。
【０１０２】
即ち、起動監視プログラム１２１Ｙの実行可能な状態であるプロセスは、共通処理１４１と、特有処理１４２とから構成されている。
【０１０３】
なお、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム及び各種プログラムを監視するプログラムは、二次記憶装置１２からＯＳ１２２が管理するＲＡＭ１３の記憶領域に転送される。これにより、上位制御プロセス１４０としてＣＰＵ１０２による実行が開始される。
【０１０４】
起動初期化処理１４１Ａは、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム及び各種プログラムを監視するプログラムのそれぞれの起動及び初期化を行うプロセスである。
【０１０５】
例えば、カメラデータ取得プログラム１２１Ｂの起動及び初期化を行うプロセスは、カメラ３から画像データを取得できるようにカメラ３の設定を行い、カメラ３とＳｏＣ１０との間において画像データを通信するための設定を行うプロセスである。
【０１０６】
主処理１４１Ｂは、電装品に関するプログラム、車両制御に関するプログラム、ＥＣＵ２に関するプログラム及び各種プログラムを監視するプログラムのそれぞれを実行するプロセスである。
【０１０７】
内部監視処理１４１Ｃは、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれが個別に実行することによって、プログラムが仕様通りに実行されているか否かを監視する監視プロセスである。
【０１０８】
例えば、内部監視処理１４１Ｃは、予め設定された許容周期内において、画像変換プログラム１２１Ｃの主処理１４１Ｂにおける特定の処理部分の実行を開始させる。この結果、内部監視処理１４１Ｃは、予め設定された許容時間内に主処理１４１Ｂにおける特定の処理部分の実行が完了したか否かを判定する。また、内部監視処理１４１Ｃは、画像変換プログラム１２１Ｃの主処理１４１Ｂにおける特定の処理部分の実行順序が画像変換プログラム１２１Ｃの仕様通りに入れ替わることなく全て実行されたか否かを判定する。また、内部監視処理１４１Ｃは、画像変換プログラム１２１Ｃの特定の命令群における引数及び戻り値が正常な範囲内か否かを判定する。
【０１０９】
即ち、内部監視処理１４１Ｃは、予め設定された許容周期内にプログラムに含まれる複数の処理部分が呼び出され、複数の処理部分の実行順序がプログラムの仕様通りであるか否かを判定する。また、内部監視処理１４１Ｃは、プロセスのうち複数の処理部分を監視する監視プロセスである。従って、内部監視結果として、監視プロセスの戻り値がエラー値以外である場合には、内部監視結果は正常である。内部監視結果が正常であれば、ＣＰＵ１０２によってそのプログラムに悪意がないと判定される。
【０１１０】
安全確保処理１４１Ｄは、内部監視処理１４１Ｃによってプログラムの異常が検出された場合、車両を安全に稼働させるプロセスである。安全確保処理１４１Ｄは、許容時間内に実行される。
【０１１１】
ここで、プログラムの異常が発生する要因には、あるプログラムの実行を意図的に妨害するプログラムの存在が想定される。あるプログラムの実行を意図的に妨害するプログラムは、本実施の形態においては悪意のあるプログラムと称する。意図的な妨害とは、例えば、ＲＡＭ１３に確保されたバッファをオーバーフローさせ、ＣＰＵ１０２が後に実行するプログラムを部分的に書き換え、本来意図した処理と異なる処理を実行させる処理である。ここで、バッファは、スタック、配列等である。本来意図した処理とは異なる処理は、例えば、無限ループである。
【０１１２】
具体的には、要求仕様通りに実装されているプログラムには、特定の条件次第では弱点が含まれることになる。例えば、プログラムに含まれる特定の処理が不必要に繰り返される場合、ＣＰＵ１０２の負荷が高い場合、又はＲＡＭ１３のメモリ領域が不足している場合には、プログラムは、要求仕様とは異なる結果を生じさせることがある。
【０１１３】
そこで、車両システムの攻撃を検討している攻撃者によって、プログラムに含まれる弱点を見つけ出し、そのプログラムの実行状態であるプロセスに特定のコードを埋め込むことが検討されることがある。
【０１１４】
そのような攻撃者によって利用される代表的な処理は、上記で説明したように、ＲＡＭ１３に確保されたスタック、配列等を構成するバッファをオーバーフローさせる処理である。バッファがオーバーフローさせられた場合、本来の処理で参照される変数及び処理の分岐先のアドレス等が確保されているメモリ領域が参照される。従って、本来の処理で参照される変数及び処理の分岐先のアドレス等が異なる値に書き換えられる。
【０１１５】
この結果、正常なプログラムの処理が攻撃者の意図した処理に変更される。攻撃者の意図した処理のうち、比較的容易に実現でき、且つ脅威となる処理は、無限ループの処理である。無限ループの処理は、１命令程度の処理を車両システムに侵入させ、実行させることで正常なプログラムの処理の実行を完全に停止させることができる。
【０１１６】
攻撃者の意図した処理は、車両システム内における通信を妨害する処理であってもよい。車両システム内における通信を妨害する処理によって正常なプログラムの処理の実行効率は著しく低下させられる。
【０１１７】
即ち、ＲＡＭ１３のメモリ領域のうち、通常の範囲から逸脱した領域に特定の値が書き込まれることにより、バッファのオーバーフローが発生する。バッファのオーバーフローが利用されることにより攻撃者は悪意のあるプログラムを車両システムに侵入させる。この結果、プログラムの妨害処理が実行されるので、処理対象のプログラムの実行状態であるプロセスは、本来の処理を実行せずに単に無限ループを実行するだけの状態に陥る。
【０１１８】
また、上記で説明したように、車両システム内における通信を妨害する処理であれば、処理対象のプログラムの実行状態であるプロセスは、本来は不要なプロセス間通信を大量に発生させることにより、別のプロセスの処理を滞らせる。
【０１１９】
従って、最も深刻な状態であれば、ＣＰＵ１０２は、上位制御プログラム１２１を実行することができない。この結果、内部監視処理１４１Ｃ及び安全確保処理１４１Ｄも実行不可能になることが想定される。このため、安全確保処理１４１Ｄは、同時に実行されている上位制御プログラム１２１のうち、異常が発生したプログラム以外のプログラムが実行を代行可能なように作成される。
【０１２０】
例えば、安全確保処理１４１Ｄは、配置されるアドレスに依存せずに実行可能なＰＩＣで作成される。ＰＩＣは、Ｐｌａｃｅ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｄｅの略称である。アドレスに依存しない安全確保処理１４１Ｄは、別プロセスからアクセス可能なようにＲＡＭ１３の共有メモリ領域に配置される。
【０１２１】
なお、ＣＰＵ１０２は、異常時に実行する安全確保処理１４１Ｄを二次記憶装置１２における上位制御プログラム１２１が記憶されている領域とは異なる領域に実行可能ファイルとして記憶させてもよい。具体的には、安全確保処理１４１Ｄには、上位制御プログラム１２１における安全確保処理１４１Ｄの実行可能ファイルの開始アドレスが記憶される。即ち、実体のない安全確保処理１４１Ｄから実体のある安全確保処理１４１Ｄが呼び出されるようにしてもよい。
【０１２２】
このように、安全確保処理１４１Ｄは、他のプログラムに相当するプロセスからも参照可能に構成する必要がある。このため、悪意のあるプログラムによって、改ざんされることにより、安全確保処理１４１Ｄ自体が悪意のあるプログラムとして作成され、記憶される可能性がある。
【０１２３】
そこで、安全確保処理１４１Ｄには、デジタル署名が予め付与される。これにより、ＣＰＵ１０２は、安全確保処理１４１Ｄの内容が正しい提供元のものであることを確認することができる。
【０１２４】
また、安全確保処理１４１Ｄの実行中に安全確保処理１４１Ｄの内容が変化する場合、ＣＰＵ１０２は、安全確保処理１４１Ｄの内容を変更したときにＨＳＭ１０４によってメッセージ認証コードを計算し、付与しておく。これにより、ＣＰＵ１０２は、安全確保処理１４１Ｄの内容が改ざんされたか否かを確認することができる。即ち、ＣＰＵ１０２は、安全確保処理１４１Ｄの内容が正当なものであるか否かを確認することができる。
【０１２５】
プロセス間通信処理１４１Ｅは、主処理１４１Ｂを実行する上で、他のプロセスと連係をとるために必要な情報を交換するプロセスである。これにより、プロセス間通信処理１４１Ｅは、内部監視処理１４１Ｃの実行結果を他のプロセスに提供することができる。
【０１２６】
ＥＣＵ間通信処理１４１Ｆは、上位制御プログラム１２１の通信プログラム１２１Ｈのプロセスにアクセスするプロセスである。これにより、主処理１４１Ｂを実行する上で、ＥＣＵ２と連係をとるために必要な情報が交換される。この結果、ＥＣＵ間通信処理１４１Ｆは、内部監視処理１４１Ｃの実行結果をＥＣＵ２に提供することができる。
【０１２７】
システムコールテーブル監視処理１４２Ｈは、システムコール１２２１Ａの開始アドレスが登録されたシステムコールテーブルに不正な変更があるか否かを起動監視プログラム１２１Ｙのプロセスによって監視するプロセスである。
【０１２８】
システムコール監視処理１４２Ｉは、システムコール１２２１Ａの代わりに呼び出され、システムコール１２２１Ａの呼び出し元のプロセス、呼び出し頻度、呼び出し回数等を起動監視プログラム１２１Ｙのプロセスによって監視するプロセスである。システムコール監視処理１４２Ｉは、監視を行った後、システムコール１２２１Ａの呼び出し元のプロセスがシステムコール１２２１Ａを開始する。
【０１２９】
システムコールテーブル書き換え処理１４２Ｊは、システムコール１２２１Ａの開始アドレスをシステムコール監視処理１４２Ｉの先頭アドレスに変更するプロセスである。これにより、プロセスによってシステムコール１２２１Ａが呼び出される度に、システムコール１２２１Ａが呼び出される代わりに、システムコール監視処理１４２Ｉが開始される。この結果、システムコール１２２１Ａ毎に監視を行うことができる。
【０１３０】
起動処理リスト１４２Ｋは、二次記憶装置１２に記憶されている起動プログラムリスト１２１Ｚの内容をＲＡＭ１３に読み出すための領域である。これにより、起動監視プログラム１２１ＹがＲＡＭ１３に転送され、プロセスとして実行が開始されたとき、上位制御プログラム１２１が必要な情報を効率良く参照できる。
【０１３１】
プロセスＩＤ記憶配列１４２Ｌは、起動監視プログラム１２１Ｙによって起動されたプログラムのプロセスに固有に割り付けられることにより各プロセスを識別するための識別子であるプロセスＩＤを記憶するための領域である。プロセスＩＤ記憶配列１４２Ｌには、起動監視プログラム１２１Ｙによって上位制御プログラム１２１に含まれる画像変換プログラム１２１Ｃ等のプログラムが起動される度に、プログラムのプロセスに対応するプロセスＩＤが逐次記憶される。
【０１３２】
旧システムコールテーブル記憶配列１４２Ｐは、システムコールテーブル書き換え処理１４２Ｊによってシステムコールテーブルが書き換えられる前のシステムコールテーブルを保存するための領域である。
【０１３３】
具体的には、システムコールテーブルの各要素には、システムコール１２２１Ａの開始アドレスが記憶されている。従って、旧システムコールテーブル記憶配列１４２Ｐには、システムコール１２２１Ａの開始アドレスが記憶される。これにより、システムコール監視処理１４２Ｉによる監視終了後、旧システムコールテーブル記憶配列１４２Ｐに記憶されているシステムコール１２２１Ａの開始アドレスを呼び出すことができる。この結果、本来のシステムコール１２２１Ａを呼び出すことができる。
【０１３４】
システムコール回数記憶配列１４２Ｒは、上位制御プログラム１２１に含まれるプログラム毎に、システムコール１２２１Ａの呼び出し回数を記憶するための領域である。システムコール監視処理１４２Ｉが呼び出される度に、呼び出し元のプロセスのプロセスＩＤが取得される。従って、システムコール回数記憶配列１４２Ｒには、プロセスＩＤと、累積した呼び出し回数とが記憶される。
【０１３５】
ここで、プロセスＩＤによってプロセスは特定される。プロセスが特定されればプログラムも特定される。また、特定したプロセスが呼び出したシステムコール１２２１Ａの累積呼び出し回数は、システムコール回数記憶配列１４２Ｒにより参照可能である。悪意のあるプログラムは無限ループを実行しているため、システムコール１２２１Ａの累積呼び出し回数は許容回数の範囲内にない。これにより、プログラムが悪意のあるプログラムであるか否かを判定することができる。
【０１３６】
なお、システムコールテーブル監視処理１４２Ｈ、システムコール監視処理１４２Ｉ及びシステムコールテーブル書き換え処理１４２Ｊは、システムコールテーブル及びシステムコール１２２１Ａに変更及び追加の処理を行う。旧システムコールテーブル記憶配列１４２Ｐ及びシステムコール回数記憶配列１４２Ｒも同様に、システムコールテーブル及びシステムコール１２２１Ａに変更及び追加の処理が伴う。しかし、ＯＳ１２２の管理下で実行される通常の実行権限のプロセスでは、システムコールテーブル及びシステムコール１２２１Ａに変更及び追加の処理を行うことができないことがある。
【０１３７】
例えば、システムコールテーブル書き換え処理１４２Ｊは、ＯＳ１２２が起動しているとき、システムコールテーブルを初期化した直後にＯＳ１２２の初期化処理の一部としての実行が必要な場合がある。このような場合が想定される場合には、システムコールテーブル監視処理１４２Ｈ及びシステムコール監視処理１４２Ｉは、ＯＳ１２２の拡張機能、即ち、カーネルモジュール１２２３として実装される。
【０１３８】
図４は、図３の上位制御プロセス１４０に関するプログラム監視状態１３２の一例を示す図である。ＲＡＭ１３には、異常検知プロセスＩＤ記憶配列１３１及びプログラム監視状態１３２の領域が確保される。
【０１３９】
異常検知プロセスＩＤ記憶配列１３１は、ＦＩＦＯのキューから構成されている。ＦＩＦＯは、Ｆｉｒｓｔ−Ｉｎ  Ｆｉｒｓｔ−Ｏｕｔの略称である。異常検知プロセスＩＤ記憶配列１３１は、悪意のあるプログラムのプロセスとして異常が検知されたプロセスのプロセスＩＤが記憶される。なお、上記キューの深さは、起動監視プログラム１２１Ｙによって起動処理リスト１４２Ｋが参照されることにより求められる。
【０１４０】
プログラム監視状態１３２は、プロセスＩＤ毎にプログラムの監視状態が記憶される。なお、プログラム監視状態１３２の領域は、起動監視プログラム１２１Ｙによりプロセスの実行を開始させる前に確保させる。
【０１４１】
プログラム監視状態１３２には、フラグ領域１３２Ａ、許容回数領域１３２Ｂ、監視周期領域１３２Ｃ、許容周期領域１３２Ｄ及び異常要因対処テーブル１３２Ｅが含まれている。また、プログラム監視状態１３２には、タイムスタンプ領域１３２Ｐ、内部監視結果領域１３２Ｑ、安全確保代行領域１３２Ｒ、安全確保処理状態１３２Ｓ及び認証領域１３２Ｚが含まれている。
【０１４２】
フラグ領域１３２Ａは、各プログラムが起動監視プログラム１２１Ｙによる監視を必要としているか否かを２値で起動監視プログラム１２１Ｙに提供するための領域である。２値としては、例えば、監視が必要な場合にはＴＲＵＥが設定され、監視が不要な場合にはＦＡＬＳＥが設定される。
【０１４３】
許容回数領域１３２Ｂは、プログラムの実行状態であるプロセスが呼び出すシステムコール１２２１Ａの回数における許容回数の範囲を提供するための領域である。システムコール１２２１Ａの回数における許容回数の範囲は、許容下限回数と、許容上限回数との２つの値で定められている。
【０１４４】
例えば、システムコール１２２１Ａの回数が許容回数の範囲外であることを起動監視プログラム１２１Ｙが検出した場合、ＣＰＵ１０２は、そのプロセスに異常が発生したと判定する。これにより、そのプロセスに対応するプログラムには悪意があると判定される。
【０１４５】
なお、一度も呼び出されないシステムコール１２２１Ａの許容下限回数及び許容上限回数はゼロに設定される。
【０１４６】
監視周期領域１３２Ｃは、プログラムの実行状態であるプロセスが呼び出すシステムコール毎に監視周期を起動監視プログラム１２１Ｙに提供するための領域である。監視周期領域１３２Ｃに監視周期が設定されている場合、起動監視プログラム１２１Ｙは時間の計測を開始してから監視周期に到達する度にシステムコール１２２１Ａの呼び出し回数を許容回数領域１３２Ｂの許容回数と比較する。これにより、監視周期におけるシステムコール１２２１Ａの呼び出し回数の異常の有無が判定される。
【０１４７】
なお、周期的に呼び出されないシステムコール１２２１Ａにおける監視周期は、監視周期領域１３２Ｃの対応する要素がゼロに設定される。
【０１４８】
許容周期領域１３２Ｄは、内部監視処理１４１Ｃを実行する周期の許容周期を起動監視プログラム１２１Ｙに提供するための領域である。内部監視処理１４１Ｃを実行する周期の許容周期は、許容下限周期と、許容上限周期との２つの値で定められている。
【０１４９】
例えば、内部監視処理１４１Ｃを実行する周期が許容周期外であることを起動初期化処理１４１Ａが検出した場合、ＣＰＵ１０２は、そのプロセスに異常が発生したと判定する。これにより、そのプロセスに対応するプログラムには悪意があると判定される。
【０１５０】
タイムスタンプ領域１３２Ｐは、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれによる内部監視処理１４１Ｃが完了した時刻を起動監視プログラム１２１Ｙに提供するための領域である。
【０１５１】
内部監視結果領域１３２Ｑは、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれによる内部監視処理１４１Ｃの結果を起動監視プログラム１２１Ｙに提供するための領域である。
【０１５２】
認証領域１３２Ｚは、プログラム監視状態１３２を更新したプロセスが正当なものであることを確認可能なように、プログラム監視状態１３２の内容が更新される度にそのメッセージ認証コードを算出し、保存するための領域である。
【０１５３】
異常要因対処テーブル１３２Ｅは、プログラムの異常要因に応じた対処を起動監視プログラム１２１Ｙに提供するための領域である。プログラムの異常要因として、ここでは以下の５つが想定される。
【０１５４】
第１の異常要因は、メッセージ認証コードの検証異常である。第２の異常要因は、システムコールテーブルの異常である。第３の異常要因は、システムコール１２２１Ａの呼び出し回数が許容回数の範囲外となる異常である。第４の異常要因は、内部監視タイムスタンプの時刻の差が許容周期の範囲外となる異常である。第５の異常要因は、内部監視結果の異常である。
【０１５５】
異常要因対処テーブル１３２Ｅには、上記異常要因に対応する対処の参照先となるアドレスが記憶されている。
【０１５６】
例えば、第１の異常要因として、メッセージ認証コードの検証異常である場合には、該当するプロセスの実行を終了させる対処の参照先となるアドレスが記憶されている。第３の異常要因として、システムコール１２２１Ａの呼び出し回数が許容回数の範囲外となる異常である場合には、該当するプロセスを再起動させる対処の参照先となるアドレスが記憶されている。第４の異常要因として、内部監視タイムスタンプの時刻の差が許容周期の範囲外となる異常である場合には、該当するプロセスにおける安全確保処理１４１Ｄを実行させる対処の参照先となるアドレスが記憶されている。第５の異常要因として、内部監視結果の異常である場合には、全プロセスにおける安全確保処理１４１Ｄを実行させる対処の参照先となるアドレスが記憶されている。
【０１５７】
なお、上記異常要因のいずれであっても、他のプロセスから受信したデータに異常があることにより、一時的に自身のプロセスを実行できない場合には、実行できない期間だけ何もしない旨の対処が記憶されている。即ち、プロセスは継続される。
【０１５８】
安全確保代行領域１３２Ｒは、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれから生成された安全確保処理１４１Ｄを記憶するための領域である。
【０１５９】
電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのいずれかが異常となり、自身のプログラムから安全確保処理１４１Ｄを生成できない場合がある。このような場合であっても、他の異常でないプログラムから生成した安全確保処理１４１Ｄに代行させるために、各安全確保処理１４１Ｄは参照可能に構成される。
【０１６０】
安全確保処理状態１３２Ｓは、電装品に関するプログラム、車両制御に関するプログラム及びＥＣＵ２に関するプログラムのそれぞれから生成された安全確保処理１４１Ｄの代行状態を記憶するための領域である。
【０１６１】
これにより、ＣＰＵ１０２は、各安全確保処理１４１Ｄの代行状態として、代行開始及び代行完了のいずれかを示す値を安全確保処理状態１３２Ｓに設定することができる。従って、安全確保処理１４１Ｄの代行が複数回実施されることを防ぐことができる。また、安全確保処理１４１Ｄの代行が正常に完了したか否かを判定することができる。
【０１６２】
なお、各プログラムが異常検知プロセスＩＤ記憶配列１３１及びプログラム監視状態１３２を同時に参照し、異常検知プロセスＩＤ記憶配列１３１及びプログラム監視状態１３２の少なくとも一方の変更を要求する可能性がある。そこで、ＯＳ１２２が提供するＭＵＴＥＸ等の仕組みを利用することにより、ハードウェア資源への排他的アクセスを実現させる。
【０１６３】
ＭＵＴＥＸは、ＭＵＴｕａｌ  Ｅｘｃｌｕｓｉｏｎの略称である。
【０１６４】
例えば、レーダーデータ取得プログラム１２１ＪのプロセスがＲＡＭ１３のプログラム監視状態１３２にアクセスしているとき、カメラデータ取得プログラム１２１ＢのプロセスがＲＡＭ１３の異常検知プロセスＩＤ記憶配列１３１にアクセスするのを防ぐ。
【０１６５】
図５は、図１のマイコン２０に設けられたＲＯＭ２０３に存在している下位制御プログラム１５０の一例を示す図である。下位制御プログラム１５０は、起動初期化処理１５１Ａ、センサデータ取得処理１５１Ｂ、上位制御値取得処理１５１Ｃ、下位制御値算出処理１５１Ｄ及び制御指示処理１５１Ｅを含んでいる。また、下位制御プログラム１５０は、内部監視処理１５１Ｆ、安全確保処理１５１Ｇ及び通信処理１５１Ｈを含んでいる。
【０１６６】
起動初期化処理１５１Ａは、ＥＣＵ２に接続されたセンサ８のデータをマイコン２０が取得可能となるように入出力インターフェース２０４を設定する処理である。起動初期化処理１５１Ａは、マイコン２０から駆動回路２３へ制御値を出力可能となるように入出力インターフェース２０４を設定する処理である。
【０１６７】
起動初期化処理１５１Ａは、下位制御処理に必要な制御処理周期を通知するようにタイマ２０６を設定する処理である。
【０１６８】
起動初期化処理１５１Ａは、ＥＣＵ１からＥＣＵ２へ送信されるデータを受信可能なように通信インターフェース２０５を設定する処理である。
【０１６９】
センサデータ取得処理１５１Ｂは、制御処理の各周期において、センサ８のデータを取得する処理である。
【０１７０】
上位制御値取得処理１５１Ｃは、制御処理の各周期において、ＥＣＵ１の下位制御指示プログラム１２１Ｇが算出した下位制御指示値を通信インターフェース２０５から取得する処理である。
【０１７１】
下位制御値算出処理１５１Ｄは、制御処理の各周期において、センサデータ取得処理１５１Ｂにより取得されたセンサ８のデータ及び上位制御値取得処理１５１Ｃにより取得された下位制御指示値に基づいて、下位制御値を算出する処理である。
【０１７２】
制御指示処理１５１Ｅは、下位制御値算出処理１５１Ｄにより算出された下位制御値を駆動回路２３へ出力する処理である。
【０１７３】
内部監視処理１５１Ｆは、センサデータ取得処理１５１Ｂ、上位制御値取得処理１５１Ｃ、下位制御値算出処理１５１Ｄ及び制御指示処理１５１Ｅを監視する処理である。
【０１７４】
安全確保処理１５１Ｇは、内部監視処理１５１Ｆが異常を検出した場合、内部監視処理１５１Ｆから呼び出され、駆動回路２３へ安全な制御値を出力する処理である。
【０１７５】
通信処理１５１Ｈは、通信インターフェース２０５及び通信線６を介して、ＥＣＵ１と必要な情報を交換する処理である。
【０１７６】
図６は、図３の起動初期化処理１４１Ａのうち起動に関する処理を説明するフローチャートである。
【０１７７】
ステップＳ１１において、ＣＰＵ１０２は、起動プログラムリスト１２１Ｚを起動処理リスト１４２Ｋに読み出す。次に、ステップＳ１１の処理は、ステップＳ１２の処理に進む。
【０１７８】
ステップＳ１２において、ＣＰＵ１０２は、デジタル署名の検証に成功したか否かを判定する。ＣＰＵ１０２によってデジタル署名の検証に成功していないと判定される場合、ステップＳ１２の処理は、ステップＳ１３の処理に進む。
【０１７９】
ステップＳ１３において、ＣＰＵ１０２は、起動失敗時の処理を実行する。次に、ステップＳ１３の処理は、終了する。
【０１８０】
一方、ステップＳ１２において、ＣＰＵ１０２によってデジタル署名の検証に成功したと判定される場合、ステップＳ１２の処理は、ステップＳ１４の処理に進む。
【０１８１】
ステップＳ１４において、ＣＰＵ１０２は、監視する処理の分だけ記憶領域をＲＡＭ１３に確保する。次に、ステップＳ１４の処理は、ステップＳ１５の処理に進む。
【０１８２】
ステップＳ１５において、ＣＰＵ１０２は、システムコールテーブル書き換え処理１４２Ｊを実行する。システムコールテーブル書き換え処理１４２Ｊの詳細な処理手順は、後述される図７に示される。次に、ステップＳ１５の処理は、ステップＳ１６の処理に進む。
【０１８３】
ステップＳ１６において、ＣＰＵ１０２は、プログラム監視状態１３２の自身の要素を初期化する。次に、ステップＳ１６の処理は、ステップＳ１７の処理に進む。
【０１８４】
ステップＳ１７において、ＣＰＵ１０２は、ＩＮＤＥＸを０に設定する。ＩＮＤＥＸは、起動処理リスト１４２Ｋの各要素を参照するときに利用されるパラメータである。次に、ステップＳ１７の処理は、ステップＳ１８の処理に進む。
【０１８５】
ステップＳ１８において、ＣＰＵ１０２は、起動処理リスト１４２ＫのＩＮＤＥＸ番目の処理を起動する。次に、ステップＳ１８の処理は、ステップＳ１９の処理に進む。
【０１８６】
ステップＳ１９において、ＣＰＵ１０２は、ＩＮＤＥＸを＋１だけ歩進する。即ち、ＣＰＵ１０２は、ＩＮＤＥＸを＋１だけインクリメントする。次に、ステップＳ１９の処理は、ステップＳ２０の処理に進む。
【０１８７】
ステップＳ２０において、ＣＰＵ１０２は、起動する処理数にＩＮＤＥＸが到達したか否かを判定する。ＣＰＵ１０２によって起動する処理数にＩＮＤＥＸが到達したと判定される場合、ステップＳ２０の処理は、終了する。一方、ＣＰＵ１０２によって起動する処理数にＩＮＤＥＸが到達していないと判定される場合、ステップＳ２０の処理は、ステップＳ１８の処理に戻る。
【０１８８】
図７は、図６のステップＳ１５におけるシステムコールテーブル書き換え処理１４２Ｊを説明するフローチャートである。
【０１８９】
ステップＳ３１において、ＣＰＵ１０２は、ＩＮＤＥＸを０に設定する。ＩＮＤＥＸは、システムコールテーブル及び旧システムコールテーブル記憶配列１４２Ｐのそれぞれの各要素を参照するときに利用されるパラメータである。次に、ステップＳ３１の処理は、ステップＳ３２の処理に進む。
【０１９０】
ステップＳ３２において、ＣＰＵ１０２は、旧システムコールテーブル記憶配列１４２ＰのＩＮＤＥＸ番目の要素にシステムコールテーブルのＩＮＤＥＸ番目の要素の開始アドレスを記憶させる。次に、ステップＳ３２の処理は、ステップＳ３３の処理に進む。
【０１９１】
ステップＳ３３において、ＣＰＵ１０２は、システムコールテーブルのＩＮＤＥＸ番目の要素にシステムコール監視処理１４２Ｉの先頭アドレスを書き込む。次に、ステップＳ３３の処理は、ステップＳ３４の処理に進む。
【０１９２】
ステップＳ３４において、ＣＰＵ１０２は、ＩＮＤＥＸを＋１だけインクリメントする。次に、ステップＳ３４の処理は、ステップＳ３５の処理に進む。
【０１９３】
ステップＳ３５において、ＣＰＵ１０２は、システムコールテーブルの要素数にＩＮＤＥＸが到達したか否かを判定する。ＣＰＵ１０２によってシステムコールテーブルの要素数にＩＮＤＥＸが到達したと判定される場合、ステップＳ３５の処理は、終了する。一方、ＣＰＵ１０２によってシステムコールテーブルの要素数にＩＮＤＥＸが到達していないと判定される場合、ステップＳ３５の処理は、ステップＳ３２の処理に戻る。
【０１９４】
図８は、図３の主処理１４１Ｂを説明するフローチャートである。
【０１９５】
ステップＳ４１において、ＣＰＵ１０２は、異常通知があるか否かを判定する。ＣＰＵ１０２によって異常通知があると判定される場合、ステップＳ４１の処理は、ステップＳ４２の処理に進む。
【０１９６】
ステップＳ４２において、ＣＰＵ１０２は、異常検知プロセスＩＤ記憶配列１３１からＩＮＤＥＸを求める。次に、ステップＳ４２の処理は、ステップＳ４３の処理に移行する。
【０１９７】
ステップＳ４３において、ＣＰＵ１０２は、異常要因判定処理を実行する。異常要因判定処理の詳細な処理手順は、後述される図１０に示される。次に、ステップＳ４３の処理は、ステップＳ４１の処理に戻る。
【０１９８】
なお、プロセス間における異常の通知は、ＯＳ１２２によって提供されるプロセス間通信が用いられる。例えば、ＰＯＳＩＸ仕様で定義されているシグナル若しくはメッセージキュー又は同等の機能が用いられる。ＰＯＳＩＸは、Ｐｏｒｔａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅの略称である。ＰＯＳＩＸは、ＩＥＥＥが策定したＡＰＩ規格である。ＩＥＥＥは、Ｉｎｓｔｉｔｕｔｅ  ｏｆ  Ｅｌｅｃｔｒｉｃａｌ  ａｎｄ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｅｎｇｉｎｅｅｒｓの略称である。
【０１９９】
一方、ステップＳ４１において、ＣＰＵ１０２によって異常通知がないと判定される場合、ステップＳ４１の処理は、ステップＳ４４の処理に進む。
【０２００】
ステップＳ４４において、ＣＰＵ１０２は、システムコール１２２１Ａの監視周期になったか否かを判定する。ＣＰＵ１０２によってシステムコール１２２１Ａの監視周期になっていないと判定される場合、ステップＳ４４の処理は、ステップＳ４５の処理に進む。
【０２０１】
ステップＳ４５において、ＣＰＵ１０２は、スリープする。次に、ステップＳ４５の処理は、ステップＳ４１の処理に戻る。
【０２０２】
なお、スリープは、プログラムのプロセスから異常が通知されるまで、ＣＰＵ１０２の実行時間を消費することなく待機する振る舞いである。スリープは、例えば、ＰＯＳＩＸ仕様で定義されているｓｌｅｅｐ又はｕｓｌｅｅｐの機能を用いて実施される。スリープする時間は、プログラムの異常を検出してから安全確保処理１４１Ｄを完了するまでの時間が許容時間となるように十分に短い時間とする。
【０２０３】
一方、ステップＳ４４において、ＣＰＵ１０２によってシステムコール１２２１Ａの監視周期になったと判定される場合、ステップＳ４４の処理は、ステップＳ４６の処理に進む。
【０２０４】
ステップＳ４６において、ＣＰＵ１０２は、システムコールテーブル監視処理１４２Ｈを実行する。システムコールテーブル監視処理１４２Ｈの詳細な処理手順は、後述される図１３に示される。次に、ステップＳ４６の処理は、ステップＳ４７の処理に進む。
【０２０５】
ステップＳ４７において、ＣＰＵ１０２は、ＩＮＤＥＸを０に設定する。ＩＮＤＥＸは、プロセスＩＤ毎にプログラム監視状態１３２の各要素を参照するときに利用されるパラメータである。次に、ステップＳ４７の処理は、ステップＳ４８の処理に進む。
【０２０６】
ステップＳ４８において、ＣＰＵ１０２は、異常要因判定処理を実行する。異常要因判定処理の詳細な処理手順は、後述される図１０に示される。次に、ステップＳ４８の処理は、ステップＳ４９の処理に進む。
【０２０７】
ステップＳ４９において、ＣＰＵ１０２は、ＩＮＤＥＸを＋１だけインクリメントする。次に、ステップＳ４９の処理は、ステップＳ５０の処理に進む。
【０２０８】
ステップＳ５０において、ＣＰＵ１０２は、起動する処理数にＩＮＤＥＸが到達したか否かを判定する。ＣＰＵ１０２によって起動する処理数にＩＮＤＥＸが到達したと判定される場合、ステップＳ５０の処理は、ステップＳ５１の処理に進む。一方、ＣＰＵ１０２によって起動する処理数にＩＮＤＥＸが到達していないと判定される場合、ステップＳ５０の処理は、ステップＳ４８の処理に戻る。
【０２０９】
ステップＳ５１において、ＣＰＵ１０２は、タイムスタンプ領域１３２Ｐに記憶されている内部監視タイムスタンプを更新する。次に、ステップＳ５１の処理は、ステップＳ５２の処理に進む。
【０２１０】
ステップＳ５２において、ＣＰＵ１０２は、認証領域１３２Ｚに記憶されているメッセージ認証コードを更新する。次に、ステップＳ５２の処理は、ステップＳ４１の処理に戻る。このようにステップＳ４１の処理に戻ることで、起動監視プログラム１２１Ｙの主処理１４１Ｂとして処理の実行が継続される。
【０２１１】
図９は、図３の起動初期化処理１４１Ａのうち初期化に関する処理を説明するフローチャートである。ステップＳ６１〜ステップＳ７２の処理が実行されている間は、上記で説明したようにプログラム監視状態１３２にアクセスする処理であるため、排他制御が実行される。
【０２１２】
ステップＳ６１において、ＣＰＵ１０２は、フラグ領域１３２ＡをＦＡＬＳＥに初期化する。次に、ステップＳ６１の処理は、ステップＳ６２の処理に進む。
【０２１３】
ステップＳ６２において、ＣＰＵ１０２は、プログラム毎に異なる初期化を行う。次に、ステップＳ６２の処理は、ステップＳ６３の処理に進む。
【０２１４】
ステップＳ６３において、ＣＰＵ１０２は、許容回数領域１３２Ｂを初期化する。次に、ステップＳ６３の処理は、ステップＳ６４の処理に進む。
【０２１５】
ステップＳ６４において、ＣＰＵ１０２は、監視周期領域１３２Ｃを初期化する。次に、ステップＳ６４の処理は、ステップＳ６５の処理に進む。
【０２１６】
ステップＳ６５において、ＣＰＵ１０２は、許容周期領域１３２Ｄを初期化する。次に、ステップＳ６５の処理は、ステップＳ６６の処理に進む。
【０２１７】
ステップＳ６６において、ＣＰＵ１０２は、タイムスタンプ領域１３２Ｐを初期化する。次に、ステップＳ６６の処理は、ステップＳ６７の処理に進む。
【０２１８】
ステップＳ６７において、ＣＰＵ１０２は、内部監視結果領域１３２Ｑを初期化する。次に、ステップＳ６７の処理は、ステップＳ６８の処理に進む。
【０２１９】
ステップＳ６８において、ＣＰＵ１０２は、安全確保代行領域１３２Ｒに安全確保処理１４１Ｄを書き込む。次に、ステップＳ６８の処理は、ステップＳ６９の処理に進む。
【０２２０】
ステップＳ６９において、ＣＰＵ１０２は、安全確保処理状態１３２Ｓを初期化する。次に、ステップＳ６９の処理は、ステップＳ７０の処理に進む。
【０２２１】
ステップＳ７０において、ＣＰＵ１０２は、フラグ領域１３２ＡをＴＲＵＥに変更する。次に、ステップＳ７０の処理は、ステップＳ７１の処理に進む。
【０２２２】
ステップＳ７１において、ＣＰＵ１０２は、メッセージ認証コードを計算する。次に、ステップＳ７１の処理は、ステップＳ７２の処理に進む。
【０２２３】
ステップＳ７２において、ＣＰＵ１０２は、認証領域１３２Ｚのメッセージ認証コードを更新する。次に、ステップＳ７２の処理は、終了する。
【０２２４】
図１０は、図８のステップＳ４３及びステップＳ４８における異常要因判定処理を説明するフローチャートである。異常要因判定処理は、プログラム監視状態１３２のＩＮＤＥＸ番目の要素を確認する。
【０２２５】
ステップＳ８１において、ＣＰＵ１０２は、メッセージ認証コードが正常であるか否かを判定する。ＣＰＵ１０２によってメッセージ認証コードが正常でないと判定される場合、ステップＳ８１の処理は、ステップＳ８２の処理に進む。
【０２２６】
ステップＳ８２において、ＣＰＵ１０２は、異常要因対処処理を実行する。異常要因対処処理の詳細な処理手順は、後述される図１１に示される。次に、ステップＳ８２の処理は、終了する。
【０２２７】
なお、メッセージ認証コードが正常でない場合には、プログラムの完全性は満たされていない。プログラムの完全性が満たされていない場合には、プログラムは改ざんされている可能性がある。改ざんされているプログラムは、悪意のあるプログラムである可能性がある。悪意のあるプログラムであれば、上記で説明したように、無限ループを実行する等の妨害を行う可能性がある。そこで、このような場合に該当するプロセスは、異常要因対処処理によって強制終了させる。
【０２２８】
一方、ステップＳ８１において、ＣＰＵ１０２によってメッセージ認証コードが正常であると判定される場合、ステップＳ８１の処理は、ステップＳ８３の処理に進む。
【０２２９】
ステップＳ８３において、ＣＰＵ１０２は、監視必要フラグがＴＲＵＥであるか否かを判定する。ＣＰＵ１０２によって監視必要フラグがＴＲＵＥでないと判定される場合、ステップＳ８３の処理は、終了する。一方、ＣＰＵ１０２によって監視必要フラグがＴＲＵＥであると判定される場合、ステップＳ８３の処理は、ステップＳ８４の処理に進む。
【０２３０】
なお、図８のステップＳ４３から異常要因判定処理が呼び出された場合には、プロセス間通信により異常が通知された状態となっている。従って、明らかに監視必要フラグにＴＲＵＥが設定されている状態と等価であるため、ステップＳ８３の処理は省略され、ステップＳ８１の処理は、ステップＳ８４に進む。
【０２３１】
ステップＳ８４において、ＣＰＵ１０２は、システムコール回数記憶配列１４２Ｒの各要素が許容回数の範囲内であるか否かを判定する。ＣＰＵ１０２によってシステムコール回数記憶配列１４２Ｒの各要素が許容回数の範囲内でないと判定された場合、ステップＳ８４の処理は、ステップＳ８２の処理に進む。
【０２３２】
なお、システムコール１２２１Ａの呼び出し回数が許容回数の範囲内でなければ、プロセス間通信が無限ループ内で実行されることにより、本来のプロセスの実行が妨害される状態となる。従って、プロセス間通信の実行を回避するために、起動中のプロセスを再起動させる必要がある。そこで、このような場合に該当するプロセスは、異常要因対処処理によって再起動させる。
【０２３３】
一方、ステップＳ８４において、ＣＰＵ１０２によってシステムコール回数記憶配列１４２Ｒの各要素が許容回数の範囲内であると判定された場合、ステップＳ８４の処理は、ステップＳ８５の処理に進む。
【０２３４】
ステップＳ８５において、ＣＰＵ１０２は、内部監視タイムスタンプが許容周期の範囲内であるか否かを判定する。ＣＰＵ１０２によって内部監視タイムスタンプが許容周期の範囲内でないと判定された場合、ステップＳ８５の処理は、ステップＳ８２の処理に進む。
【０２３５】
なお、内部監視タイムスタンプが許容周期の範囲内でなければ、悪意のあるプログラムが車両システムに侵入し、無限ループ等の妨害を実行した可能性がある。そこで、このような場合に該当するプロセスは、異常要因対処処理によって安全確保処理１４１Ｄを実行させる。
【０２３６】
一方、ステップＳ８５において、ＣＰＵ１０２によって内部監視タイムスタンプが許容周期の範囲内であると判定された場合、ステップＳ８５の処理は、ステップＳ８６の処理に進む。
【０２３７】
ステップＳ８６において、ＣＰＵ１０２は、内部監視結果が正常であるか否かを判定する。ＣＰＵ１０２によって内部監視結果が正常でないと判定された場合、ステップＳ８６の処理は、ステップＳ８２の処理に進む。
【０２３８】
なお、内部監視結果が正常でなければ、悪意のあるプログラムが車両システムに侵入し、妨害を実行したために、車両の安全に関わる処理が正しく完了しなかった可能性がある。そこで、このような場合に該当する各プロセスは、異常要因対処処理によって安全確保処理１４１Ｄをプロセス毎に実行させる。
【０２３９】
一方、ステップＳ８６において、ＣＰＵ１０２によって内部監視結果が正常であると判定された場合、ステップＳ８６の処理は、ステップＳ８７の処理に進む。
【０２４０】
ステップＳ８７において、ＣＰＵ１０２は、システムコール回数記憶配列１４２Ｒの要素をゼロに再設定する。次に、ステップＳ８７の処理は、ステップＳ８８の処理に進む。
【０２４１】
ステップＳ８８において、ＣＰＵ１０２は、メッセージ認証コードを更新する。次に、ステップＳ８８の処理は、終了する。
【０２４２】
図１１は、図１０のステップＳ８２における異常要因対処処理を説明するフローチャートである。
【０２４３】
ステップＳ１０１において、ＣＰＵ１０２は、異常要因対処テーブル１３２Ｅを参照する。次に、ステップＳ１０１の処理は、ステップＳ１０２の処理に進む。
【０２４４】
ステップＳ１０２において、ＣＰＵ１０２は、対処の値を判定する。ここで、異常要因対処テーブル１３２Ｅには、対処の値としてＶＡＬが設定されている。ＶＡＬは、対処の値が入力されたパラメータである。
【０２４５】
具体的には、ステップＳ８１の処理からステップＳ８２の処理を経て異常要因対処処理が呼び出された場合には、ＣＰＵ１０２は、プロセスを強制終了させる対処の値としてＶＡＬが１に設定されている処理を選択する。従って、ステップＳ１０２の処理は、ステップＳ１０３の処理に進む。
【０２４６】
ステップＳ１０３において、ＣＰＵ１０２は、該当するプロセスＩＤのプロセスを強制終了する。次に、ステップＳ１０３の処理は、終了する。なお、ＣＰＵ１０２は、強制終了する前に、該当するプロセスＩＤのプロセスに対し、終了を要求し、この要求に一定時間以内に応じない場合に強制終了するようにしてもよい。
【０２４７】
また、ステップＳ８４の処理からステップＳ８２の処理を経て異常要因対処処理が呼び出された場合には、ＣＰＵ１０２は、プロセスを再起動させる対処の値としてＶＡＬが２に設定されている処理を選択する。従って、ステップＳ１０２の処理は、ステップＳ１０４の処理に進む。
【０２４８】
ステップＳ１０４において、ＣＰＵ１０２は、該当するプロセスＩＤのプロセスを強制終了する。次に、ステップＳ１０４の処理は、ステップＳ１０５の処理に進む。
【０２４９】
ステップＳ１０５において、ＣＰＵ１０２は、該当するプロセスＩＤのプロセスを起動する。次に、ステップＳ１０５の処理は、ステップＳ１０６の処理に進む。
【０２５０】
ステップＳ１０６において、ＣＰＵ１０２は、プロセスＩＤ記憶配列１４２Ｌを更新する。具体的には、該当するプロセスＩＤのプロセスを強制終了後に起動させた場合、同じプログラムに対応するプロセスが起動するが、プロセスＩＤはＯＳ１２２により新たに付与される。そこで、新たに付与されたプロセスＩＤをプロセスＩＤ記憶配列１４２Ｌに記憶させることにより、ＣＰＵ１０２は、プロセスＩＤ記憶配列１４２Ｌを更新する。
【０２５１】
次に、ステップＳ１０６の処理は、終了する。
【０２５２】
また、ステップＳ８５の処理からステップＳ８２の処理へ経て異常要因対処処理が呼び出された場合には、以下の処理が実行される。即ち、ＣＰＵ１０２は、プログラムの一部の実行状態に該当するプロセスによって安全確保処理１４１Ｄを実行させる対処の値としてＶＡＬが３に設定されている処理を選択する。従って、ステップＳ１０２の処理は、ステップＳ１０７の処理に進む。
【０２５３】
ステップＳ１０７において、ＣＰＵ１０２は、安全確保処理１４１Ｄを実行する。安全確保処理１４１Ｄの詳細な処理手順は、後述される図１２に示される。
【０２５４】
次に、ステップＳ１０７の処理は、終了する。
【０２５５】
また、ステップＳ８６の処理からステップＳ８２の処理へ経て異常要因対処処理が呼び出された場合には、以下の処理が実行される。即ち、ＣＰＵ１０２は、プログラムに含まれる各命令群の実行状態に該当する各プロセスによって安全確保処理１４１Ｄをプロセス毎に実行させる対処の値としてＶＡＬが４に設定されている処理を選択する。従って、ステップＳ１０２の処理は、ステップＳ１０８の処理に進む。
【０２５６】
ステップＳ１０８において、ＣＰＵ１０２は、ＩＮＤＥＸを０に設定する。ＩＮＤＥＸは、プロセスＩＤ記憶配列１４２Ｌの各要素を参照するときに利用されるパラメータである。次に、ステップＳ１０８の処理は、ステップＳ１０９の処理に進む。
【０２５７】
ステップＳ１０９において、ＣＰＵ１０２は、プロセスＩＤ記憶配列１４２ＬのＩＮＤＥＸ番目の要素のプロセスＩＤを取得する。次に、ステップＳ１０９の処理は、ステップＳ１１０の処理に進む。
【０２５８】
ステップＳ１１０において、ＣＰＵ１０２は、安全確保処理１４１Ｄを実行する。次に、ステップＳ１１０の処理は、ステップＳ１１１の処理に進む。
【０２５９】
ステップＳ１１１において、ＣＰＵ１０２は、ＩＮＤＥＸを＋１だけインクリメントする。次に、ステップＳ１１１の処理は、ステップＳ１１２の処理に進む。
【０２６０】
ステップＳ１１２において、ＣＰＵ１０２は、プロセスＩＤ記憶配列１４２Ｌの要素数にＩＮＤＥＸが到達したか否かを判定する。ＣＰＵ１０２によってプロセスＩＤ記憶配列１４２Ｌの要素数にＩＮＤＥＸが到達したと判定される場合、ステップＳ１１２の処理は、終了する。一方、ＣＰＵ１０２によってプロセスＩＤ記憶配列１４２Ｌの要素数にＩＮＤＥＸが到達していないと判定される場合、ステップＳ１１２の処理は、ステップＳ１０９の処理に戻る。
【０２６１】
なお、ＣＰＵ１０２は、ステップＳ１０２において対処の値を選ぶとき、他のプロセスから受信したデータに異常があり、一時的に自身のプロセスを実行できない状態になっていることがある。この場合には、ステップＳ１０２の処理は、終了する。
【０２６２】
図１２は、図１１のステップＳ１０７及びステップＳ１１０における図３の安全確保処理１４１Ｄを説明するフローチャートである。
【０２６３】
ステップＳ１２１において、ＣＰＵ１０２は、プロセスＩＤ記憶配列１４２Ｌから異常と判定されたプロセスＩＤのＩＮＤＥＸを求める。次に、ステップＳ１２１の処理は、ステップＳ１２２の処理に進む。
【０２６４】
ステップＳ１２２において、ＣＰＵ１０２は、時間がタイムアウト時間に到達したか否かを判定する。タイムアウト時間は、異常が検知されてから安全確保処理１４１Ｄを完了するまでの許容時間である。
【０２６５】
ステップＳ１２２において、ＣＰＵ１０２によって時間がタイムアウト時間に到達したと判定される場合、ステップＳ１２２の処理は、ステップＳ１２３の処理に進む。
【０２６６】
ステップＳ１２３において、ＣＰＵ１０２は、異常停止する。次に、ステップＳ１２３の処理は、終了する。
【０２６７】
一方、ステップＳ１２２において、ＣＰＵ１０２によって時間がタイムアウト時間に到達していないと判定される場合には、ステップＳ１２２の処理は、ステップＳ１２４の処理に進む。
【０２６８】
ステップＳ１２４において、ＣＰＵ１０２は、安全確保処理状態１３２ＳのＩＮＤＥＸ番目の要素が未実施の値であるか否かを判定する。ＣＰＵ１０２によって安全確保処理状態１３２ＳのＩＮＤＥＸ番目の要素が未実施の値であると判定される場合、ステップＳ１２４の処理は、ステップＳ１２５の処理に進む。
【０２６９】
ステップＳ１２５において、ＣＰＵ１０２は、プロセスＩＤ記憶配列１４２Ｌの全要素のプロセスＩＤに安全確保代行要求を通知する。通知は、ＯＳ１２２が提供するプロセス間通信を利用する。次に、ステップＳ１２５の処理は、ステップＳ１２２の処理に戻る。
【０２７０】
一方、ステップＳ１２４において、ＣＰＵ１０２によって安全確保処理状態１３２ＳのＩＮＤＥＸ番目の要素が未実施の値でないと判定される場合、ステップＳ１２４の処理は、ステップＳ１２６の処理に進む。
【０２７１】
ステップＳ１２６において、ＣＰＵ１０２は、安全確保処理状態１３２ＳのＩＮＤＥＸ番目の要素が実施完了の値であるか否かを判定する。ＣＰＵ１０２によって安全確保処理状態１３２ＳのＩＮＤＥＸ番目の要素が実施完了の値であると判定される場合、ステップＳ１２６の処理は、終了する。
【０２７２】
一方、ステップＳ１２６において、ＣＰＵ１０２によって安全確保処理状態１３２ＳのＩＮＤＥＸ番目の要素が実施完了の値でないと判定される場合、ステップＳ１２６の処理は、ステップＳ１２２の処理に戻る。
【０２７３】
なお、図１１のステップＳ１０７又は図１１のステップＳ１１０から安全確保処理１４１Ｄが呼び出された場合には、一つの異常の対処を終えてから次の異常の対処を行う手順となる。従って、後に行われる異常の対処の開始が遅くなる可能性がある。この遅れを小さくするためには、発生する異常毎に、起動監視プログラム１２１ＹがＯＳ１２２の機能を利用してスレッドを新たに作成する。これにより、そのスレッドに安全確保処理１４１Ｄが割り当てられる。
【０２７４】
換言すれば、プロセスは、プログラムの実行状態であって、プログラムの実行単位であるが、スレッドは、ＣＰＵ１０２の割り当て実行単位であるため、スレッドを利用することによりハードウェア資源をさらに効率良く利用することができる。
【０２７５】
図１３は、図８のステップＳ４６における図３のシステムコールテーブル監視処理１４２Ｈを説明するフローチャートである。
【０２７６】
ステップＳ１４１において、ＣＰＵ１０２は、ＩＮＤＥＸを０に設定する。次に、ステップＳ１４１の処理は、ステップＳ１４２の処理に進む。
【０２７７】
ステップＳ１４２において、ＣＰＵ１０２は、システムコールテーブルのＩＮＤＥＸ番目の要素がシステムコール監視処理１４２Ｉの開始アドレスを記憶しているか否かを判定する。ＣＰＵ１０２によってシステムコールテーブルのＩＮＤＥＸ番目の要素がシステムコール監視処理１４２Ｉの開始アドレスを記憶していないと判定される場合、ステップＳ１４２の処理は、ステップＳ１４３の処理に進む。
【０２７８】
ステップＳ１４３において、ＣＰＵ１０２は、異常要因対処処理を実行する。次に、ステップＳ１４３の処理は、終了する。
【０２７９】
一方、ステップＳ１４２において、ＣＰＵ１０２によってシステムコールテーブルのＩＮＤＥＸ番目の要素がシステムコール監視処理１４２Ｉの開始アドレスを記憶していると判定される場合、ステップＳ１４２の処理は、ステップＳ１４４の処理に進む。
【０２８０】
ステップＳ１４４において、ＣＰＵ１０２は、ＩＮＤＥＸを＋１だけインクリメントする。次に、ステップＳ１４４の処理は、ステップＳ１４５の処理に進む。
【０２８１】
ステップＳ１４５において、ＣＰＵ１０２は、システムコールテーブルの要素数にＩＮＤＥＸが到達したか否かを判定する。ＣＰＵ１０２によってシステムコールテーブルの要素数にＩＮＤＥＸが到達したと判定される場合、ステップＳ１４５の処理は、終了する。一方、ＣＰＵ１０２によってシステムコールテーブルの要素数にＩＮＤＥＸが到達していないと判定される場合、ステップＳ１４５の処理は、ステップＳ１４２の処理に戻る。
【０２８２】
なお、システムコールテーブルの各要素にシステムコール監視処理１４２Ｉの開始アドレスが記憶されていない場合には、悪意のあるプログラムが侵入したことが隠蔽されている可能性がある。悪意のあるプログラムが侵入したことを隠蔽するために、特定のシステムコール１２２１Ａの実行結果を偽るプロセスのアドレスがシステムコールテーブルに書き込まれる場合がある。この場合には、異常要因対処処理が呼び出され、該当するプロセスＩＤのプロセスが強制終了される。
【０２８３】
図１４は、図３のシステムコール監視処理１４２Ｉを説明するフローチャートである。ここで、各システムコール１２２１Ａは、システムコール番号が順に関連付けられている。システムコール番号は、例えば、自然数が昇順に割り当てられている。システムコール番号は、ＯＳ１２２の実装によって異なっている。従って、ＯＳ１２２が同一であれば、システムコール番号により任意のシステムコール１２２１Ａを特定することができる。
【０２８４】
ステップＳ１６１において、ＣＰＵ１０２は、システムコール番号をＳＹＳＣＮに設定する。ＳＹＳＣＮは、旧システムコールテーブル記憶配列１４２Ｐ及びシステムコール回数記憶配列１４２Ｒのそれぞれにおいてシステムコール番号により任意のシステムコール１２２１Ａを参照するためのパラメータである。次に、ステップＳ１６１の処理は、ステップＳ１６２の処理に進む。
【０２８５】
ステップＳ１６２において、ＣＰＵ１０２は、システムコール１２２１Ａの呼び出し元のプロセスのプロセスＩＤを取得する。次に、ステップＳ１６２の処理は、ステップＳ１６３の処理に進む。
【０２８６】
ステップＳ１６３において、ＣＰＵ１０２は、プロセスＩＤに対応するシステムコール回数記憶配列１４２Ｒを選択する。次に、ステップＳ１６３の処理は、ステップＳ１６４の処理に進む。
【０２８７】
ステップＳ１６４において、ＣＰＵ１０２は、システムコール回数記憶配列１４２ＲのＳＹＳＣＮ番目の呼び出し回数を＋１だけインクリメントする。次に、ステップＳ１６４の処理は、ステップＳ１６５の処理に進む。
【０２８８】
ステップＳ１６５において、ＣＰＵ１０２は、プロセスＩＤに対応する許容回数領域１３２Ｂを選択する。次に、ステップＳ１６５の処理は、ステップＳ１６６の処理に進む。
【０２８９】
ステップＳ１６６において、ＣＰＵ１０２は、許容回数領域１３２Ｂの許容回数を選択する。次に、ステップＳ１６６の処理は、ステップＳ１６７の処理に進む。
【０２９０】
ステップＳ１６７において、ＣＰＵ１０２は、ＳＹＳＣＮ番目の呼び出し回数が許容回数の範囲内であるか否かを判定する。ＣＰＵ１０２によってＳＹＳＣＮ番目の呼び出し回数が許容回数の範囲内でないと判定される場合、ステップＳ１６７の処理は、ステップＳ１６８の処理に進む。
【０２９１】
ステップＳ１６８において、ＣＰＵ１０２は、異常要因対処処理を実行する。次に、ステップＳ１６８の処理は、終了する。
【０２９２】
一方、ステップＳ１６７において、ＣＰＵ１０２によってＳＹＳＣＮ番目の呼び出し回数が許容回数の範囲内であると判定される場合、ステップＳ１６７の処理は、ステップＳ１６９の処理に進む。
【０２９３】
ステップＳ１６９において、ＣＰＵ１０２は、プロセスＩＤに対応する旧システムコールテーブル記憶配列１４２Ｐを選択する。次に、ステップＳ１６９の処理は、ステップＳ１７０の処理に進む。
【０２９４】
ステップＳ１７０において、ＣＰＵ１０２は、旧システムコールテーブル記憶配列１４２ＰのＳＹＳＣＮ番目に記憶されている開始アドレスを取得する。次に、ステップＳ１７０の処理は、ステップＳ１７１の処理に進む。
【０２９５】
ステップＳ１７１において、ＣＰＵ１０２は、ＰＣに開始アドレスを設定する。ＰＣは、Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒの略称である。次に、ステップＳ１７１の処理は、終了する。これにより、ＣＰＵ１０２は、ＰＣを参照してシステムコール１２２１Ａを呼び出すことができる。
【０２９６】
なお、システムコール監視処理１４２Ｉは、システムコール番号をＯＳ１２２から取得できることを前提としているが、ＯＳ１２２の実装によってはシステムコール番号の取得ができないことがある。この場合には、ＣＰＵ１０２は、システムコール監視処理１４２Ｉが呼び出される前の呼び出し元のプロセスのプロセスＩＤと、ＯＳ１２２の管理情報又はハードウェア資源のコンピュータアーキテクチャから取得可能な情報を参照して特定する。なお、ＯＳ１２２の管理情報又はハードウェア資源のコンピュータアーキテクチャから取得可能な情報は、例えば、システムコール監視処理１４２Ｉが呼び出される前の呼び出し元のプロセスを管理するスタックポインタ又はシステムコールの開始番地である。
【０２９７】
図１５は、図３の主処理１４１Ｂから呼び出される各種処理を説明するフローチャートである。
【０２９８】
ステップＳ１８１において、ＣＰＵ１０２は、内部監視処理１４１Ｃを呼び出す。次に、ステップＳ１８１の処理は、ステップＳ１８２の処理に進む。
【０２９９】
ステップＳ１８２において、ＣＰＵ１０２は、内部監視結果に異常が有るか否かを判定する。ＣＰＵ１０２によって内部監視結果に異常が有ると判定される場合、ステップＳ１８２の処理は、ステップＳ１８３の処理に進む。
【０３００】
ステップＳ１８３において、ＣＰＵ１０２は、内部監視結果を異常値に更新する。次に、ステップＳ１８３の処理は、ステップＳ１８４の処理に進む。
【０３０１】
ステップＳ１８４において、ＣＰＵ１０２は、安全確保処理状態１３２Ｓの要素を実施開始に変更する。次に、ステップＳ１８４の処理は、ステップＳ１８５の処理に進む。
【０３０２】
ステップＳ１８５において、ＣＰＵ１０２は、安全確保処理１４１Ｄを実行する。次に、ステップＳ１８５の処理は、ステップＳ１８６の処理に進む。
【０３０３】
ステップＳ１８６において、ＣＰＵ１０２は、安全確保処理状態１３２Ｓの要素を実施完了に変更する。次に、ステップＳ１８６の処理は、ステップＳ１８７の処理に進む。
【０３０４】
ステップＳ１８７において、ＣＰＵ１０２は、監視必要フラグをＦＡＬＳＥに変更する。次に、ステップＳ１８７の処理は、ステップＳ１８８の処理に進む。
【０３０５】
ステップＳ１８８において、ＣＰＵ１０２は、処理を終了する。次に、ステップＳ１８８の処理は、ステップＳ１８９の処理に進む。
【０３０６】
ステップＳ１８９において、ＣＰＵ１０２は、起動初期化処理１４１Ａを呼び出す。次に、ステップＳ１８９の処理は、終了する。
【０３０７】
一方、ステップＳ１８２において、ＣＰＵ１０２によって内部監視結果に異常が無いと判定される場合、ステップＳ１８２の処理は、ステップＳ１９０の処理に進む。
【０３０８】
ステップＳ１９０において、ＣＰＵ１０２は、内部監視タイムスタンプが許容周期の範囲内であるか否かを判定する。ＣＰＵ１０２によって内部監視タイムスタンプが許容周期の範囲内でないと判定される場合、ステップＳ１９０の処理は、ステップＳ１９１の処理に進む。
【０３０９】
ステップＳ１９１において、ＣＰＵ１０２は、安全確保処理１４１Ｄを呼び出す。次に、ステップＳ１９１の処理は、ステップＳ１９２の処理に進む。
【０３１０】
ステップＳ１９２において、ＣＰＵ１０２は、スリープする。次に、ステップＳ１９２の処理は、ステップＳ１９１に戻る。ここで、スリープは、図８のステップＳ４５のスリープと同様に実行される。
【０３１１】
一方、ステップＳ１９０において、ＣＰＵ１０２によって内部監視タイムスタンプが許容周期の範囲内であると判定される場合、ステップＳ１９０の処理は、ステップＳ１９３の処理に進む。
【０３１２】
ステップＳ１９３において、ＣＰＵ１０２は、内部監視タイムスタンプを更新する。次に、ステップＳ１９３の処理は、終了する。
【０３１３】
図１６は、図５の下位制御プログラム１５０に含まれる起動初期化処理１５１Ａを説明するフローチャートである。なお、マイコン２０にはＯＳ１２２と同等のオペレーティングシステムは搭載しないため、図２のシステムコール１２２１Ａに関する処理は実行されない。また、ＥＣＵ２に接続されているモータ７の電源の遮断をＥＣＵ１から実行できるように配線がされている場合には、安全確保処理１４１Ｄにより一部の動作を代行することができる。
【０３１４】
ステップＳ２０１〜ステップＳ２０８の処理は、ハードウェア資源が異なる以外、図９のステップＳ６１、ステップＳ６２、ステップＳ６５〜ステップＳ６７、ステップＳ７０〜ステップＳ７２の処理と同様である。よって、その詳細な説明は省略される。
【０３１５】
一般的に、ＯＳ１２２は、プロセスが呼び出したシステムコール１２２１Ａ等のＡＰＩ１２２１の機能を提供する場合、プロセスからＡＰＩ１２２１に渡されたパラメータに異常がないか否かをチェックする。この結果、ＯＳ１２２は、パラメータに異常があることを検出した場合、ＡＰＩ１２２１の本来の機能を実行せずに、ＡＰＩ１２２１を呼び出したプロセスに対してパラメータに異常がある旨を伝える。
【０３１６】
しかし、例えば、バッファのオーバーフローを発生させるような悪意のあるプログラムは、ＯＳ１２２によるパラメータのチェックでは検出されない。この結果、バッファのオーバーフローが発生すれば、無限ループ等のように本来の処理とは異なる処理が実行される。これにより、ＣＰＵリソースがなくなるため、ＣＰＵ１０２は、各種プログラムを実行することができない。このため、ＥＣＵ１は、各種プログラムに基づいて車両を適切に制御することできないため、車両は想定通りに動作しなくなる。
【０３１７】
また、例えば、不要なデータを他のＥＣＵに絶え間なく送信するような悪意のあるプログラムも、ＯＳ１２２によるパラメータのチェックでは検出されない。この結果、他のＥＣＵは車両の制御に必要な通信データを受信できない。これにより、複数のＥＣＵによって連係して車両を適切に制御することができなくなる。このため、車両の制御処理が実質的に無効化される。
【０３１８】
このように、悪意のあるプログラムは、システムコール１２２１Ａの呼び出し状況を通常想定される状況と異なる状況に陥れる。不要なデータを他のＥＣＵに絶え間なく送信するような悪意のあるプログラムも同様である。
【０３１９】
そこで、ＣＰＵ１０２は、プログラムの実行状態であるプロセスにより想定されるシステムコール１２２１Ａの呼び出し状況に基づいて、プログラムに悪意があるか否かを判定する。従って、悪意のあるプログラムの実行を事前に回避することができる。これにより、悪意のあるプログラムによって車両システムが妨害された状態でも車両の稼働を継続させることができる。
【０３２０】
また、ＣＰＵ１０２は、プログラムの実行状態であるプロセスにより想定される処理結果に基づいて、プロセスの継続、プロセスの終了及びプロセスの再起動のいずれか１つを実行する。従って、プロセス毎に適した処理が実行される。これにより、プログラムに悪意があると判定される場合に一律に同じ処理をするよりも適した処理を実行することができる。
【０３２１】
また、ＣＰＵ１０２は、複数のプロセスが生成されている場合、各プロセスのうち、悪意があるプロセスを終了する。ＣＰＵ１０２は、複数のプロセスが生成されている場合、各プロセスのうち、悪意がないプロセスを継続する。従って、プログラムにある悪意に応じてプロセスの終了及び継続のいずれか一方を選択することができる。これにより、安全を確保しつつ、車両の運転を継続させることができる。
【０３２２】
また、ＣＰＵ１０２は、複数の電装品が入出力インターフェース１０１に接続されている場合、各電装品に対応するプログラム毎に悪意があるか否かを判定する。従って、各電装品の機能に応じて悪意の有無を判定することができる。これにより、複数のプログラムのうち、悪意のあるプログラムを特定することが容易となるため、強制終了させるべきプログラムを細かく特定することができる。
【０３２３】
また、ＣＰＵ１０２は、予め設定された許容周期内にシステムコール１２２１Ａが呼び出され、システムコール１２２１Ａの呼び出し回数がプロセスの想定通りであって、監視プロセスの戻り値がエラー値以外である場合、プログラムに悪意がないと判定する。従って、プログラムのアルゴリズムが仕様に照らして正しいか否かに基づいて、プログラムに悪意があるか否かが判定される。これにより、プログラムの実行状態であるプロセスが停止することを担保することができる。
【０３２４】
また、ＣＰＵ１０２は、システムコール１２２１Ａの開始アドレスが正しく設定されている場合、プログラムに悪意がないと判定する。従って、ＣＰＵ１０２は、システムコール１２２１Ａの開始アドレスが正しく設定されていない場合、プログラムに悪意があると判定する。これにより、悪意のあるプログラムによって書き換えられたシステムコール１２２１Ａの開始アドレスの参照先におけるプロセスの呼び出しを防ぐことができる。
【０３２５】
また、ＣＰＵ１０２は、システムコール１２２１Ａの呼び出し回数が予め設定された許容回数の範囲内である場合、プログラムに悪意がないと判定する。従って、ＣＰＵ１０２は、システムコール１２２１Ａの呼び出し回数が予め設定された許容回数の範囲外である場合、プログラムに悪意があると判定する。これにより、プロセス間通信が無限ループで実行されることによりシステムコール１２２１Ａの呼び出し回数が異常に増加した場合、プログラムに悪意があると判定して次の処理を進めることができる。
【０３２６】
また、ＣＰＵ１０２は、プロセス毎に想定される呼び出し回数を計測してからシステムコール１２２１Ａを呼び出す。従って、ＣＰＵ１０２は、プロセス毎に想定される呼び出し回数を計測するまではシステムコール１２２１Ａを実際に呼び出さない。これにより、悪意のあるプログラムの実行状態であるプロセスの実行を回避させることができる。
【０３２７】
また、ＣＰＵ１０２は、プログラムに悪意がないと判定する場合、メッセージ認証コードを生成する。従って、ＥＣＵ１とＥＣＵ２との間で各種信号を通信する際、通信される各種信号の改ざん及びなりすましを防止することができる。これにより、通信の安全性を担保することができる。
【０３２８】
また、ＣＰＵ１０２は、プロセスＩＤにメッセージ認証コードを関連付けた状態で、プロセスＩＤとメッセージ認証コードとを共有メモリに記憶させる。従って、プロセスＩＤに対応するプロセスが改ざん及びなりすましが行われていないことを証明することができる。これにより、悪意のないプログラムの実行状態であるプロセスを実行することができる。
【０３２９】
なお、安全確保処理１４１Ｄ及びプログラム監視状態１３２を更新及び参照する本来のプロセスではない、第三者のプロセスによるなりすましに対応する必要がある場合は、安全確保処理１４１Ｄ及びプログラム監視状態１３２の改ざんの検出にメッセージ認証を使用する代わりにデジタル署名を使用してもよく、デジタル署名の公開鍵に危殆化の恐れがある場合は、鍵を定期的に更新しても良い。また、鍵の更新の際に公開鍵証明書及び公開鍵基盤（Ｐｕｂｌｉｃ  Ｋｅｙ  Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ）又はこれに準じた仕組みを利用しても良い。
【０３３０】
また、各実施の形態について、車載制御装置を実行するための処理回路が備えられている。処理回路は、専用のハードウェアであっても、メモリに格納されるプログラムを実行するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサ、ＤＳＰともいう）であってもよい。
【０３３１】
図１７は、ハードウェア構成例を説明する図である。図１７においては、処理回路４０１がバス４０２に接続されている。処理回路４０１が専用のハードウェアである場合、処理回路４０１は、例えば、単一回路、複合回路、プログラム化したプロセッサ、ＡＳＩＣ、ＦＰＧＡ又はこれらを組み合わせたものが該当する。車載制御装置の各部の機能のそれぞれは、処理回路４０１で実現されてもよいし、各部の機能はまとめて処理回路４０１で実現されてもよい。
【０３３２】
図１８は、他のハードウェア構成例を説明する図である。図１８においては、プロセッサ４０３及びメモリ４０４がバス４０２に接続されている。処理回路がＣＰＵの場合、車載制御装置の各部の機能は、ソフトウェア、ファームウェア又はソフトウェアとファームウェアとの組み合わせにより実現される。ソフトウェア又はファームウェアはプログラムとして記述され、メモリ４０４に格納される。処理回路は、メモリ４０４に記憶されたプログラムを読み出して実行することにより、各部の機能を実現する。すなわち、車載制御装置は、処理回路により実行されるときに、ステップが結果的に実行されることになるプログラムを格納するためのメモリ４０４を備えている。また、これらのプログラムは、実行する手順又は方法をコンピュータに実行させるものであるといえる。ここで、メモリ４０４とは、ＲＡＭ、ＲＯＭ、フラッシュメモリ、ＥＰＲＯＭ、ＥＥＰＲＯＭ等の、不揮発性若しくは揮発性の半導体メモリ又は、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等が該当する。
【０３３３】
なお、車載制御装置の各部の機能は、一部が専用のハードウェアで実現され、他の一部がソフトウェア又はファームウェアで実現されるようにしてもよい。例えば、専用のハードウェアとしての処理回路で各機能を実現させることができる。また、処理回路がメモリ４０４に格納されたプログラムを読み出して実行することによって各機能を実現させることが可能である。
【０３３４】
このように、処理回路は、ハードウェア、ソフトウェア、ファームウェア又はこれらの組み合わせによって、上記の各機能を実現することができる。
【０３３５】
実施の形態においては、ＥＣＵ１がＥＣＵ２のみに接続されている一例について説明したが、特にこれに限定されるものではない。例えば、ＥＣＵ１が２つ以上の他のＥＣＵに接続されていてもよい。従って、実施の形態と同様にプログラムに悪意があるか否かを判定することによって、車両の稼働を継続させることができる。
【符号の説明】
【０３３６】
１，２  ＥＣＵ、３  カメラ、４  レーダー、５  ディスプレイ、６  通信線、７  モータ、８  センサ、１０  ＳｏＣ、１０１  入出力インターフェース、１０２  ＣＰＵ、１０３  メモリインターフェース、１０４  ＨＳＭ、１０５  ＲＯＭ、１０６  タイマ、１０７  通信インターフェース、１２  二次記憶装置、１２１  上位制御プログラム、１２２  ＯＳ、１２２１  ＡＰＩ、１２２１Ａ  システムコール、１２２１Ｂ  ライブラリ、１２２２  カーネル、１２２３  カーネルモジュール、１２１Ｂ  カメラデータ取得プログラム、１２１Ｃ  画像変換プログラム、１２１Ｄ  画像認識プログラム、１２１Ｅ  画像状況判定プログラム、１２１Ｆ  総合状況判定プログラム、１２１Ｇ  下位制御指示プログラム、１２１Ｈ  通信プログラム、１２１Ｊ  レーダーデータ取得プログラム、１２１Ｋ  レーダーデータ変換プログラム、１２１Ｌ  レーダーデータ認識プログラム、１２１Ｍ  レーダー状況判定プログラム、１２１Ｎ  ディスプレイ表示プログラム、１２１Ｙ  起動監視プログラム、１２１Ｚ  起動プログラムリスト、１２１ＺＡ  記憶場所、１２１ＺＢ  デジタル署名領域、１３  ＲＡＭ、１３１  異常検知プロセスＩＤ記憶配列、１３２  プログラム監視状態、１３２Ａ  フラグ領域、１３２Ｂ  許容回数領域、１３２Ｃ  監視周期領域、１３２Ｄ  許容周期領域、１３２Ｅ  異常要因対処テーブル、１３２Ｐ  タイムスタンプ領域、１３２Ｑ  内部監視結果領域、１３２Ｒ  安全確保代行領域、１３２Ｓ  安全確保処理状態、１３２Ｚ  認証領域、１４０  上位制御プロセス、１４１  共通処理、１４１Ａ  起動初期化処理、１４１Ｂ  主処理、１４１Ｃ  内部監視処理、１４１Ｄ  安全確保処理、１４１Ｅ  プロセス間通信処理、１４１Ｆ  ＥＣＵ間通信処理、１４２  特有処理、１４２Ｈ  システムコールテーブル監視処理、１４２Ｉ  システムコール監視処理、１４２Ｊ  システムコールテーブル書き換え処理、１４２Ｋ  起動処理リスト、１４２Ｌ  プロセスＩＤ記憶配列、１４２Ｐ  旧システムコールテーブル記憶配列、１４２Ｒ  システムコール回数記憶配列、１５０  下位制御プログラム、１５１Ａ  起動初期化処理、１５１Ｂ  センサデータ取得処理、１５１Ｃ  上位制御値取得処理、１５１Ｄ  下位制御値算出処理、１５１Ｅ  制御指示処理、１５１Ｆ  内部監視処理、１５１Ｇ  安全確保処理、１５１Ｈ  通信処理、２０  マイコン、２０１  ＣＰＵ、２０２  ＲＡＭ、２０３  ＲＯＭ、２０４  入出力インターフェース、２０５  通信インターフェース、２０６  タイマ、２２  入力回路、２３  駆動回路。
【図１】
0006976365.tif 000002
【図２】
0006976365.tif 000003
【図３】
0006976365.tif 000004
【図４】
0006976365.tif 000005
【図５】
0006976365.tif 000006
【図６】
0006976365.tif 000007
【図７】
0006976365.tif 000008
【図８】
0006976365.tif 000009
【図９】
0006976365.tif 000010
【図１０】
0006976365.tif 000011
【図１１】
0006976365.tif 000012
【図１２】
0006976365.tif 000013
【図１３】
0006976365.tif 000014
【図１４】
0006976365.tif 000015
【図１５】
0006976365.tif 000016
【図１６】
0006976365.tif 000017
【図１７】
0006976365.tif 000018
【図１８】
0006976365.tif 000019