0

プロセスアドレス空間がプロセス/カーネルに分割される方法に関するオンラインスレッド/チュートリアルがあれば、私はたくさん見ました

例:私はprintfとして呼び出しているHelloworldプログラムをいくつか持っています(次に、カーネル空間に入るために書き込みシステム呼び出しを行います)

カーネルが Helloworld プログラム スタックをどのように使用しているかは疑問です。実行全体がどのように行われるか教えていただけますか...

./helloworld -> printf() -> システムコールの書き込み -> ディスプレイドライバー -> 書き込みから戻る -> helloworld に戻る

ありがとう、アマレンダー

4

2 に答える 2

0

この質問に対する詳細な回答は、特定のカーネルとアーキテクチャによって異なります。ただし、一般的な答えは、ユーザー空間がカーネルを呼び出したい場合、トラップ命令を実行し、CPU に特権レベルを変更させてカーネル コードの実行を開始させるというものです。特権レベルの変更の一環として、CPU もカーネル スタックに切り替わります。カーネルが完了すると、トラップからの復帰シーケンスが実行され、ユーザー空間スタックが復元され、中断したところから実行が再開されます。

于 2011-05-27T11:52:26.557 に答える
0

一言で言えば、 write システムコールが行われると、int $80トラップが生成されます。ハンドラーは、現在のプロセス レジスタをカーネル スタック (カーネル アドレス空間に存在) に保存します。次に、セグメント レジスタの CPL を変更して、カーネル ページ テーブルを使用できるようにします。次に、カーネルはシステム コールのテーブルを調べて、目的のルーチンの適切なアドレスを見つけます。次に、実行はルーチンにジャンプし、デバイス ドライバ コードを呼び出すことができます。作業を行った後、カーネルはレジスタの内容と CPL をセグメント レジスタに復元することにより、ユーザー モードに戻ります。

于 2011-06-02T19:12:21.447 に答える