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;
}
以上宜しくお願いします。
No.1ベストアンサー
- 回答日時:
えーとですね、割込み禁止命令は特権命令ですので、ユーザーモードでは使えません。
普通のアプリケーション内で使おうとすると普通はトラップが掛かってOSがそのプロセスを強制終了すると思います。
割込み禁止を行うプログラムは、カーネルモード・ドライバとして作成して下さい。カーネルモード・ドライバはmainで始まるアプリケーションにはなりません。あとカーネルモード・ドライバはバグっているとOSごと道連れにクラッシュすることがありますので、実行には十分に注意してくださいね。
GCCは詳しくないですが、質問のコードでは割込み禁止命令はコメントアウトされているように思います。コメントを外しても機能しないということで良いですよね。
コメントを外した記述でちゃんと割込み禁止命令がコードに含まれるようになるかは知りませんが、アセンブラ・ソースを生成するなり、実行バイナリをダンプして割込み禁止命令の機械語を探すなり、確認方法はあると思います。この確認を自分でできないレベルだとカーネルモード・ドライバは無理なので止めましょう。
>普通のアプリケーション内で使おうとすると普通はトラップが掛かってOSがそのプロセスを強制終了すると思います。
<ーー了解です。
カーネルドラーバーの情報有難う御座いました。
No.3
- 回答日時:
一体、割り込み禁止する事によって何をしたいのか理由が
判りません。
どういった挙動を期待しているのでしょうか?
ちなみにLinuxはプリエンプティブ・マルチタスクOSなので、
時間の掛かる処理の実行中であっても、一定時間内(タイム
スライス)に強制的にオペレーティングシステム(以下、OS)
に制御が移り、他のタスク・プロセスを実行します。
No.2
- 回答日時:
割り込み禁止がユーザーモードで使えるかどうかは知りません. ただ, FDISI, FENI についてはちゃんと Intel のドキュメントに書かれている通りに実行されているようですよ.
というか, なんで FDISI や FENI なんだろ. CLI や STI じゃダメなの?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの表にヘンな枠が・・・
-
SONYの音楽ソフト「x-アプリ」...
-
バッチファイル内の各コマンド...
-
LD_LIBRARY_PATHって?
-
pingは正常なのにtracerouteで...
-
エクセルからアクセスのプロシ...
-
shutdownコマンド実行の残り時...
-
linuxサーバーのキャッシュをク...
-
python IDLEで訂正、削除のやり...
-
taskkill をバッチ処理できない。
-
Mac de プログラム
-
コマンドプロンプト Windows
-
英語版での表示
-
sudoで実行したコマンドの実行...
-
ROBOCOPY cmdで正常に処理され...
-
エクセル時間毎ごとにマクロを...
-
拡張子(wsf)の実行
-
apacheの起動
-
windows10のごみ箱をrd /s /q C...
-
複数のバッチを同時並行で起動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SONYの音楽ソフト「x-アプリ」...
-
エクセルの表にヘンな枠が・・・
-
pingは正常なのにtracerouteで...
-
ファイルサイズが小さくなりま...
-
windows10のごみ箱をrd /s /q C...
-
LD_LIBRARY_PATHって?
-
バッチファイル内の各コマンド...
-
linuxサーバーのキャッシュをク...
-
最初の一度しか実行されないロ...
-
Linux のシェルスクリプトの強...
-
エクセルからアクセスのプロシ...
-
python IDLEで訂正、削除のやり...
-
SPI非言語の問題 解説お願いします
-
shutdownコマンド実行の残り時...
-
ROBOCOPY cmdで正常に処理され...
-
taskkill をバッチ処理できない。
-
Openイベントを開始させないで...
-
ACCESSレポートをPDFに出力したい
-
sudoで実行したコマンドの実行...
-
信頼済みサイト登録をbatファイ...
おすすめ情報