6

システム コールを使用した HDD へのアクセスなど、ユーザー空間では許可されていない機能へのアクセスを提供するために、システム コールが存在することを理解していread()ます。fread()また、ハードウェア間の互換性を提供するために、これらが などのライブラリ呼び出しの形式でユーザー モード レイヤーによって抽象化されていることも理解しています。

したがって、アプリケーション開発者の観点からは、次のようなものがあります。

//library    //syscall   //k_driver    //device_driver
fread()  ->  read()  ->  k_read()  ->  d_read()

私の質問は; fread()およびread()関数内のすべての命令をプログラムに直接インライン展開するのを妨げているのは何ですか? 命令は同じなので、CPU は同じように動作するはずですか? 試したことはありませんが、何らかの理由でこれが機能しないと思います。そうしないと、アプリケーションが任意のカーネル モードで動作する可能性があります。

TL;DR: アプリケーションがコピーできないカーネル モードに入るシステム コールを許可するのは何ですか?

4

2 に答える 2

8

システム コールは、カーネル自体には入りません。より正確には、たとえば、呼び出した読み取り関数は、アプリケーションに関する限り、ライブラリ呼び出しのままです。内部的には、CPU アーキテクチャとOS に応じて、read(2)何らかの割り込みまたはアセンブリ命令を使用して実際のシステム コールを呼び出しています。syscall(2)

これは、ユーザーランド コードが特権コードを実行できるようにする唯一の方法ですが、間接的な方法です。ユーザーランドとカーネル コードは、異なるコンテキストで実行されます。

つまり、カーネル ソース コードをユーザーランド コードに追加して、クラッシュ以外の有用な動作を期待することはできません。特に、カーネル コードは、ハードウェアとの対話に必要な物理メモリ アドレスにアクセスできます。ユーザーランド コードは、この機能を持たない仮想メモリ空​​間へのアクセスに制限されています。また、ユーザーランド コードが実行できる命令は、CPU がサポートする命令のサブセットです。いくつかの I/O、割り込み、および仮想化関連の命令は、禁止コードの例です。これらは特権命令として知られており、CPU アーキテクチャに応じて下位リングまたはスーパーバイザ モードである必要があります。

于 2013-05-24T13:06:29.353 に答える
0

それらをインライン化できます。から直接システム コールを発行できますsyscall(2)が、すぐに面倒になります。システム コールのオーバーヘッド (前後のコンテキスト スイッチ、カーネル内チェックなど) は、システム コール自体にかかる時間は言うまでもなく、インライン化によるゲインがノイズの中で消えてしまうことに注意してください (ゲインがある場合は、コードが増えると、キャッシュがあまり役に立たなくなり、パフォーマンスが低下します)。*.hlibc/kernel の人々が問題を研究し、実際に測定可能な利益である場合は、背後で (関連ファイルで) インライン化を行ったことを信頼してください。

于 2013-05-24T11:05:17.613 に答える