Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

RX631スタック領域等を保護するには?

IKUZOと申します、お伺いしたいのですが、
RX631でスタック領域を保護したいのですが、
MPUを使用するのでしょうか?
特権命令例外を使用するのでしょうか?
スタック領域というのは保護可能なんでしょうか?
スタック領域というのは簡単に壊すことができるので、
保護することができれば、安全ではないかと

  • IKUZOさん、こんにちは。NoMaYです。

    スタック領域は実行禁止にするぐらいしか出来ないと思います。文面からライト禁止にすることを考えているのだと思われますが、そうしてしまうと、そもそもC言語のauto変数(関数内の通常のスタック変数)へのライトがユーザモードになっている通常処理(割り込み処理(スーパバイザモード)外)ではニッチモサッチモ行かなくなってしまいますよね。

  • こんにちは

    以下はプロフェッショナル版のみの機能ですが参考までにご紹介します。

    CS+オンラインヘルプ

    スタックの保護はソフトウェア的に行うものかと。上記のオプション説明がその手法の参考になるのではないでしょうか。

  • 何がスタックを壊すと考えてますか?
    1.もともとの設定で必要なスタックサイズを取らない。
    2.ソフトエラー。
    3.プログラムが予定以外でスタックエリアを書き換えに行く。
    4.ヒープエリアが浸食してくる。
    他にありますかね?

    1ならCallWalkerでチェックして十分なサイズを取っておけば割り込みスタック領域がオーバーフローしてユーザスタック領域を壊す様なことはないと思います。
    2は特別な場所でなければ気にしなくても良いと思います。高所など宇宙線が無視できない場所なら金属ケースが必須と思います。
    3はバグだと思ってます。プログラムを直した方が良いと思います。意図的にバグは作らないので発生させないような対処はできないと思います。発生してしまった場合はデータの検証機能やフローの検証機能でリセットと思います。
    4は難しいと思います。制限するとダイナミックなデータの良さが無くなってしまうように感じます。私はマイコンでmalloc、realloc、calloc、newを使いません。ダイナミックなデータを使うならメモリー管理機能の付いたOSが必須に思えます。

    >MPUを使用するのでしょうか?
    から、IKUZOさんの欲しい答えはまったく違うような感じもします。

  • In reply to NoMaY:

    NoMaYさんいつもお世話になっています
    「スタック領域は実行禁止にするぐらいしか出来ないと思います。」
    MPUを使用するのですね、特権命令例外とかは関係ないですよね?
  • In reply to じま:

    じまさんいつもお世話になっています

    「プロフェッショナル版のみの機能」として__stack_chk_fail関数を利用できるということですね、

    バージョン情報を見るとプロフェッショナル版?

    「スタックの保護はソフトウェア的に行う」なるべく早くテストしまして

    ご報告いたします

  • In reply to kijo:

    kijoさんいつもお世話になっています
    「スタックを壊す」原因はなにかということですよね
    項目で指定されましたとうりで、いろいろあると思うので、ここで何を想定してるの?
    ということだと思います、これはC言語の場合ポインターが使用できたりしますので
    うっかり他のアドレスを書き換えることはないのかということです、
    Windows等の場合使用できるアドレス範囲が決まっているので、比較的安心です、
    大きなファイルをロードしてしまったり、そんなのサイズチェックすればいいのですが、
    忘れることもありますし、プログラム品質の問題なのかもしれませんが、例外や検出の仕組み
    を入れておくことで、逆方向からプログラム品質を向上させることにもなると思いますので。
  • IKUZOさん、こんにちは。NoMaYです。

    今回の「保護」は間口が広いのですね。まず、私の前の投稿に関しては、以下の通りに考えました。

    >特権命令例外とかは関係ないですよね?
    ハードウェアマニュアルを見たところ、以下の画面コピーの通り、例外事象の優先順位としては命令アクセス例外の方が特権命令例外や未定義命令例外より高くなっていましたので、実行禁止にすることで充分かと思います。

    14.7 例外事象の優先順位 (赤枠は私が書いたものです)
    resource.renesas.com/resource/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?Exceptions#TOC_14_7


    それで、以下に関しては、そもそもC言語ではスタック上に取った変数を扱うことが圧倒的に多いので、スタック領域は簡単に壊すことが出来る、というようなイメージが出来ているのではないでしょうか。また、スタック上にはリターンする時の「戻り番地」が格納されていますが、これが壊されてしまうとプログラムが暴走するので、そのイメージが更に強くなるのかも、と思います。あと、スタックオーバーフローが発生したりすることも、そのイメージが強くなる要因かも、と思います。(先程、別スレッド『RX610 1MからRX610 1.5Mへの置き替え』を読んでいて、そう思いました。)(そういえば、スタックオーバーフローでプログラムが暴走するのも、結局、戻り番地が壊されてしまうから(あるいはIRAMの下限を突き抜けてしまって戻り番地が滅茶苦茶になるから)、ということに帰着されるケースが多そうですね。)

    >これはC言語の場合ポインターが使用できたりしますので
    >うっかり他のアドレスを書き換えることはないのかということです、
    そういう間違ったプログラムで壊してしまう割合(というか危険性)は、スタックも他の領域も同程度ではないかと思うのです。

    そういえば、じまさんが紹介された機能ですが、CS+オンラインヘルプの文面からすると、スタックオーバーフローのチェックは行われないようですね。将来、そういうチェックをするオプションが追加されたりするかも知れないですね。

    ちょっと思ったのですが、この機能では、スタック上の「戻り番地」の直下(0x00000000方向)あたりに固定32ビット整数値を埋め込んでおいて、それが書き換わっているかどうかチェックしているのですが、固定値を埋め込むのではなくて「戻り番地のビット反転」を埋め込むようにする、というのもアリではないだろうか、と思いました。

    [追記]

    ああっ、でも、UスタックオーバーフローならMPUを使っても出来そうですね。例えば、以下のようにセクションをレイアウトしてMPUを適切に設定すれば良さそうな気がしてきました。

    0x00000000~0x0000000F  未使用                 リード/ライト/実行禁止 (つまり全禁止のBAC領域とする)
    0x00000010~0x0000LLLF  Uスタック              リード/ライト許可,実行禁止
    0x0000MMM0~0x000NNNNF  Iスタック,DATA,BSS,等  リード/ライト許可,実行禁止

    0xFFFPPPP0~0xFFFQQQQF  CONST,等               リード許可,ライト/実行禁止
    0xFFFRRRR0~0xFFFSSSSF  プログラム             実行許可,リード/ライト禁止
    0xFFFTTTT0~0xFFFFFFFF  未使用,固定ベクタ      リード/ライト/実行禁止 (つまり全禁止のBAC領域とする)

    注)
    ・0x0000MMM0 = (0x0000LLLF + 1) としています
    ・0xFFFRRRR0 = (0xFFFQQQQF + 1) としています
    ・0xFFFTTTT0 = (0xFFFSSSSF + 1) としています
    ・RX62N,RX621グループ用のアプリケーションノートを見た感じでは固定ベクタは全禁止のBAC領域で良さそうです

    [追記]

    他方、Iスタックオーバーフローは、少し手間を掛けられる且つオーバーフローしたタイミングから幾らか検出されるのが遅れることを大目にみられるなら、以下のような手もありそうです。

    (1) スタートアップルーチンかmain()の始め辺りでIスタックの底にシグネチャを書いておく
    (2) 例外ハンドラの入口ではISPの値がIスタックの底を突き抜けていないかチェックする
    (3) 例外ハンドラの出口ではIスタックの底に書いたシグネチャが書き換わっていないかチェックする

  • In reply to NoMaY:

    CallWalkerでチェックして必要なサイズを取っておけばスタックオーバーフローは発生しないと思います。
    これは誤りなのでしょうか?
    少し心配になってます。
  • In reply to NoMaY:

    NoMaYさんいつもアドバイスありがとうございます、
    例外事象の優先順位をみると
    1 リセット
    2 ノンマスカブル割り込み
    3 割り込み
    4 命令アクセス例外
    5 未定義命令例外 特権命令例外
    6 無条件トラップ
    7 オペランドアクセス例外
    8 浮動小数点例外
    になっていますね「実行禁止にすることで充分」これでもかなり安全性が高くなると思います、
    「スタックオーバーフローでプログラムが暴走するのも、結局、戻り番地が壊されてしまうから」
    そうですよね、それで今回は128K Byte (64K 64K)をまるまるスタックに割り当てるようにはしたのですが、
    「UスタックオーバーフローならMPUを使っても出来そうですね。」そう言われればという気がします
    ただ小刻みに簡単にMPUに設定する方法というか、
  • In reply to kijo:

    kijoさんいつもアドバイスありがとうございます、
    CallWalkerでチェックするということは大切なことですね、先の
    それで今回は128K Byte (64K 64K)をまるまるスタック
    というのですが、こんなバカチョン的な考えではいけませんよね
    実際どのくらい使用しているのかチェックするということは大切なことですね、
    現状では実行させてみておかしい動作するとき、スタック変数が多すぎはしないか
    ネストが多すぎはしないか等考えますが、全てが「おかしい動作」をするとは
    限らず、プログラムでどの程度使用するのかという情報を元に
    スタックを確保すべきだと思います、
    解析手法にもよると思いますが再帰的な処理でそれが受信状態によって変わるような
    処理の場合は、最大の見積もりで違ってくることも考えられます
  • In reply to IKUZO:

    __stack_chk_fail関数を利用しようとするのですが、動作できないみたいです

    #ifdef __cplusplus

    extern "C" {

    #endif

    void __stack_chk_fail(void)

    {

    printf("スタックオーバーフロです!");

    sys_beep(0xFFFF);

    sr_reset

    }

    #ifdef __cplusplus

    }

    #endif

    テストのモジュール

    int cmd_test(char *str)

    {

    int t[5];

    int i;

    for(i=0; i<20; i++){

    t[i]=0;

    (void)t[i];

    }

    return CMD_OK;

    }

    何が原因であるのか、アドバイスいただけないでしょうか?

    -------------------

    C:\>T

    C:\>T

    C:\>

    -------------------

    なにも表示されなく、__stack_chk_fail(void)を実行しているようなそぶりをみせない?

  • In reply to IKUZO:

    P以外のセクションを「実行禁止」に設定しました、以下
    #define protection_start ((_UDWORD)(__sectop("P")))
    #define protection_end ((_UDWORD)(__secend("P")))
    MPU.RSPAGE0.LONG=0x00000000;
    MPU.REPAGE0.BIT.REPN=protection_start >>4;
    MPU.REPAGE0.BIT.UAC=6;
    MPU.REPAGE0.BIT.V=1;
    MPU.RSPAGE1.LONG=protection_start;
    MPU.REPAGE1.BIT.REPN=protection_end >>4;
    MPU.REPAGE1.BIT.UAC=5;//R*X 書き込みは禁止
    MPU.REPAGE1.BIT.V=1;
    MPU.RSPAGE2.LONG=protection_end;
    MPU.REPAGE2.BIT.REPN=0xFFFFFFFF >>4;
    MPU.REPAGE2.BIT.UAC=6;
    MPU.REPAGE2.BIT.V=1;
    調子よく動作しております。
  •  IKUZOさん、こんにちは。NoMaYです。

    >__stack_chk_fail関数を利用しようとするのですが、動作できないみたいです
    >。。。
    >何が原因であるのか、アドバイスいただけないでしょうか?
    コンパイラのリストファイルでは、cmd_test()に対して、どういうコードが生成されているでしょうか?
    (RTSの1命令だけだったりするかも、、、)

  • In reply to NoMaY:

    NoMaYさんいつもアドバイスありがとうございます、違反部分のソースコードになります

    int cmd_test(char *str)

    {

    int t[5];

    int i;

    for(i=0; i<20; i++){

    t[i]='A';

    printf("%c\r",t[i]);

    }

    return CMD_OK;

    }

    コンパイラーのその部分のリストです

    RX631スタック領域等を保護するには?.txt
    000017DB                         _cmd_test:
                                     		.STACK	_cmd_test=24
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",871
    000017DB 6E67                    		PUSHM R6-R7
    000017DD FBE2CCCCADDE            		MOV.L #0DEADCCCCH, R14
    000017E3 7EAE                    		PUSH.L R14
    000017E5 754614                  		MOV.L #00000014H, R6
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",877
    000017E8 FB72rrrrrrrr            		MOV.L #_L87, R7
    000017EE                         L1040:	; bb
    000017EE 6080                    		SUB #08H, R0
    000017F0 E307                    		MOV.L R7, [R0]
    000017F2 3E0141                  		MOV.L #00000041H, 04H[R0]
    000017F5 05rrrrrr             A  		BSR _printf
    000017F9 6280                    		ADD #08H, R0
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",875
    000017FB 6016                    		SUB #01H, R6
    000017FD 21rr                    		BNE L1040
    000017FF                         L1041:	; bb21
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",880
    000017FF EC0E                    		MOV.L [R0], R14
    00001801 6601                    		MOV.L #00000000H, R1
    00001803 740ECCCCADDE            		CMP #0DEADCCCCH, R14
    00001809 18                   S  		BNE L1043
    0000180A                         L1042:	; bb21
    0000180A 3F6703                  		RTSD #0CH, R6-R7
    0000180D                         L1043:	; bb21
    0000180D 04rrrrrr             A  		BRA ___stack_chk_fail
    00001811                         _cmd_test2:
                                     		.STACK	_cmd_test2=8
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",883
    00001811 FBE2CCCCADDE            		MOV.L #0DEADCCCCH, R14
    00001817 7EAE                    		PUSH.L R14
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",886
    00001819 EC0E                    		MOV.L [R0], R14
    0000181B 6601                    		MOV.L #00000000H, R1
    0000181D 740ECCCCADDE            		CMP #0DEADCCCCH, R14
    00001823 18                   S  		BNE L1046
    00001824                         L1045:	; entry
    00001824 6701                    		RTSD #04H
    00001826                         L1046:	; entry
    00001826 04rrrrrr             A  		BRA ___stack_chk_fail
    0000182A                         _cmd_test3:
                                     		.STACK	_cmd_test3=8
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",888
    0000182A FBE2CCCCADDE            		MOV.L #0DEADCCCCH, R14
    00001830 7EAE                    		PUSH.L R14
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",891
    00001832 EC0E                    		MOV.L [R0], R14
    00001834 6601                    		MOV.L #00000000H, R1
    00001836 740ECCCCADDE            		CMP #0DEADCCCCH, R14
    0000183C 18                   S  		BNE L1049
    0000183D                         L1048:	; entry
    0000183D 6701                    		RTSD #04H
    0000183F                         L1049:	; entry
    0000183F 04rrrrrr             A  		BRA ___stack_chk_fail
    00001843                         _rtc_init:
                                     		.STACK	_rtc_init=12
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\rtc.c",61
    00001843 7EA6                    		PUSH.L R6
    00001845 FBE2CCCCADDE            		MOV.L #0DEADCCCCH, R14
    0000184B 7EAE                    		PUSH.L R14
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\rtc.c",64
    0000184D FB6E22C408              		MOV.L #0008C422H, R6
    00001852 F16806                  		BCLR #00H, 06H[R6].B
    00001855 FBEEFE0308              		MOV.L #000803FEH, R14
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\rtc.c",66
    0000185A F8E90BA5                		MOV.W #0A50BH, [R14]
    0000185E FBFE330008              		MOV.L #00080033H, R15
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\rtc.c",67
    00001863 F0F0                    		BSET #00H, [R15].B
    00001865                         L1051:	; bb1
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\rtc.c",68
    00001865 F4F0                    		BTST #00H, [R15].B
    00001867 20rr                    		BEQ L1051
    00001869                         L1052:	; bb7

  • IKUZOさん、こんにちは。NoMaYです。

    先程のはソースが変わってしまっています。まず、その前のソースの時の生成コードを確認したいです。。。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page