1

私が知っているように、Linuxカーネルスレッドには、ユーザー空間のスレッド/プロセスと比較して、独自のアドレス空間がありません。カーネル スレッドはユーザー空間へのコンテキスト スイッチを行いませんが、カーネル スレッドはスケジュール可能でプリエンプト可能です。私の質問は、カーネル スレッドにアドレス空間がない場合、カーネル スレッドの切り替え/プリエンプションがどのように機能するかということです。

4

1 に答える 1

1

カーネルスレッドは基本的に関数を実行します。これらはkernel_thread()、実行する関数のアドレスを受け取る関数、その関数への引数、およびいくつかのクローン フラグを引数として使用して作成されます。

この関数は基本的に、カーネル スレッドの CPU レジスタの初期値を見つけるdo_fork()カーネル モード スタックのアドレスを渡すコモンを呼び出します。copy_thread()

基本的kernel_thread()に、次の方法でスタックを構築します。

  • ebxedxレジスタはcopy_thread()fnによって設定され、arg
  • eip引数をロードする小さなルーチンに設定され、call fn

このようにして、新しいカーネル スレッドが実行を開始しますfn(arg)

ご覧のとおり、カーネル スレッドは のアドレスによって実行するコードを認識していますfn。この関数は通常、カーネル内のどこかに定義されており、eipそこを指すように設定することで、カーネル スレッドが実行する命令を認識します。text segment実行可能ファイルをメモリ領域にマップする必要がないため、必要ありません。

于 2014-01-29T17:50:57.540 に答える