プロが教える店舗&オフィスのセキュリティ対策術

Ubuntu17.10を使用しています。

下記のコード(t_sinCal.c )は、下記のインラインASMコードにより
『asm volatile("FDISI;");』で割込み禁止にし
『asm volatile("FENI;");』で割込み可にしていますが、
機能してないようです。

Q1)GCCアセンブラー64ビットに対応した、割込み禁止と割込み可
のコードはありますか?

プログラムコード:t_sinCal.c
//file name: wkC_inlineAsm/t_sinCal.c
//compile: gcc -o t_sinCal t_sinCal.c
#include <stdio.h>
#include <math.h>
//#include <time.h>
#include <sys/time.h>

int main() {
int i, j;
double wk;
struct timeval tvA, tvB;
int usec;

// asm volatile("FDISI;"); <ーーここです
gettimeofday(&tvA, NULL);

//============================
for(j=0; j<100; j++){
for(i=0; i<100; i++){
wk=(double)(i+j)/1000.0;
wk=sin(wk );
}
}
//============================
gettimeofday(&tvB, NULL);

//============================
// asm volatile("FENI;"); <ーーここです。
usec=(tvB.tv_sec - tvA.tv_sec) * 1000000 +
(tvB.tv_usec-tvA.tv_usec);

printf("j=%d i=%d usec=%f\n",j,i, (double)usec/1e6);

return 0;
}

以上宜しくお願いします。

A 回答 (3件)

えーとですね、割込み禁止命令は特権命令ですので、ユーザーモードでは使えません。


普通のアプリケーション内で使おうとすると普通はトラップが掛かってOSがそのプロセスを強制終了すると思います。
割込み禁止を行うプログラムは、カーネルモード・ドライバとして作成して下さい。カーネルモード・ドライバはmainで始まるアプリケーションにはなりません。あとカーネルモード・ドライバはバグっているとOSごと道連れにクラッシュすることがありますので、実行には十分に注意してくださいね。

GCCは詳しくないですが、質問のコードでは割込み禁止命令はコメントアウトされているように思います。コメントを外しても機能しないということで良いですよね。
コメントを外した記述でちゃんと割込み禁止命令がコードに含まれるようになるかは知りませんが、アセンブラ・ソースを生成するなり、実行バイナリをダンプして割込み禁止命令の機械語を探すなり、確認方法はあると思います。この確認を自分でできないレベルだとカーネルモード・ドライバは無理なので止めましょう。
    • good
    • 0
この回答へのお礼

>普通のアプリケーション内で使おうとすると普通はトラップが掛かってOSがそのプロセスを強制終了すると思います。
<ーー了解です。

カーネルドラーバーの情報有難う御座いました。

お礼日時:2018/01/24 20:05

一体、割り込み禁止する事によって何をしたいのか理由が


判りません。
どういった挙動を期待しているのでしょうか?

ちなみにLinuxはプリエンプティブ・マルチタスクOSなので、
時間の掛かる処理の実行中であっても、一定時間内(タイム
スライス)に強制的にオペレーティングシステム(以下、OS)
に制御が移り、他のタスク・プロセスを実行します。
    • good
    • 0

割り込み禁止がユーザーモードで使えるかどうかは知りません. ただ, FDISI, FENI についてはちゃんと Intel のドキュメントに書かれている通りに実行されているようですよ.



というか, なんで FDISI や FENI なんだろ. CLI や STI じゃダメなの?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!