私が知っているように、Linuxカーネルスレッドには、ユーザー空間のスレッド/プロセスと比較して、独自のアドレス空間がありません。カーネル スレッドはユーザー空間へのコンテキスト スイッチを行いませんが、カーネル スレッドはスケジュール可能でプリエンプト可能です。私の質問は、カーネル スレッドにアドレス空間がない場合、カーネル スレッドの切り替え/プリエンプションがどのように機能するかということです。
1397 次
1 に答える
1
カーネルスレッドは基本的に関数を実行します。これらはkernel_thread()
、実行する関数のアドレスを受け取る関数、その関数への引数、およびいくつかのクローン フラグを引数として使用して作成されます。
この関数は基本的に、カーネル スレッドの CPU レジスタの初期値を見つけるdo_fork()
カーネル モード スタックのアドレスを渡すコモンを呼び出します。copy_thread()
基本的kernel_thread()
に、次の方法でスタックを構築します。
ebx
edx
レジスタはcopy_thread()
値fn
によって設定され、arg
eip
引数をロードする小さなルーチンに設定され、call fn
このようにして、新しいカーネル スレッドが実行を開始しますfn(arg)
。
ご覧のとおり、カーネル スレッドは のアドレスによって実行するコードを認識していますfn
。この関数は通常、カーネル内のどこかに定義されており、eip
そこを指すように設定することで、カーネル スレッドが実行する命令を認識します。text segment
実行可能ファイルをメモリ領域にマップする必要がないため、必要ありません。
于 2014-01-29T17:50:57.540 に答える