1

私はこの分野の初心者であり、クロック サイクルでコードのセクションのベンチマーク (実行時間を測定) する C++/アセンブリ コードを書いています。コードでプリエンプションとハード割り込みを無効にする必要があります。Linux カーネル開発でpreempt_disable()の使用が許可されていることは知っています。&raw_local_irq_save(flags) 関数を使用して同じことを行います。

私の質問は、カーネル モジュールではなく、ユーザー空間の通常の C/C++ プログラムを書いているということです。これらのシステム コールを C++ コードで使用できますか (つまり、ユーザー スペースから/カーネル モジュールなしで使用できますか?)、どのヘッダー ファイルを含める必要がありますか? もし、そうなら。参考文献や例を読んでもらえますか?

ありがとう!!

4

2 に答える 2

2

ユーザーランド アプリケーションからこれを行うことはできません。特に、ハードウェア割り込みを無効にすることはできません。これは、計時などの多くの基本的なカーネル機能の基礎を提供します。

代わりにできることは、たとえばリアルタイムの優先度sched_setscheduler(2)を設定するために使用することです。つまり、自発的に CPU を解放する (通常はシステム コール) までアプリをプリエンプトしないようにカーネルに依頼します。SCHED_FIFOただし、注意してください。そのようにすると、システムが簡単にロックアップしてしまう可能性があります。

于 2012-12-02T18:12:40.013 に答える
1

通常、それは不可能です。カーネルは割り込みをブロックさせません。

しかし、自分自身に非常に高いプライオを割り当てることで、通常は十分です。さらに、たとえばループで 10000 回実行するなどして、ベンチマーク コードが十分長く実行されることを確認します。そうすれば、一部の割り込みは、全体的なサイクル カウントでは問題になりません。私の経験では、自作のベンチマークでは、1 秒のコード実行時間で十分です (システムに負荷がかかっていない場合)。

于 2012-12-02T18:06:35.113 に答える