システムコールは呼び出しプロセス内で実行され、割り込みはすべてのプロセス内で実行できますが(割り込みが発生すると現在実行中のプロセス内で割り込みハンドラが実行されます)、kthreadはどこで実行されますか?一部の関数呼び出しが現在カーネルモードで実行されているとしますkthreads_create
。これは新しいカーネルスレッドを作成する必要がありますが、実行コンテキストは何ですか?私の質問が仮想だと思ったらすみません。私は間違いなくLinuxカーネルに初めて触れる人です。
答え1
カーネルスレッドには独自のプロセスコンテキストがあります。カーネルスレッドは次のようにリストされていますps
。
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May29 ? 00:00:44 /sbin/init
root 2 0 0 May29 ? 00:00:00 [kthreadd]
root 3 2 0 May29 ? 00:00:05 [ksoftirqd/0]
root 5 2 0 May29 ? 00:00:00 [kworker/0:0H]
root 7 2 0 May29 ? 00:00:01 [migration/0]
root 8 2 0 May29 ? 00:02:57 [rcu_preempt]
root 9 2 0 May29 ? 00:00:00 [rcu_bh]
root 10 2 0 May29 ? 00:00:00 [rcu_sched]
root 11 2 0 May29 ? 00:00:00 [watchdog/0]
root 12 2 0 May29 ? 00:00:00 [watchdog/1]
...
[角括弧]内のすべてのプロセス名はカーネルスレッドを表します。
また、見ることができますhttps://lwn.net/Articles/65178/。kthread_create
データ構造を作成するだけです。その後、このデータ構造はwake_up_process
プロセスを実行するプロセスに渡されます。
そうだカーネル文書使用される用語プロセス、ワイヤーそして仕事むしろ緩く、ある程度の交換が可能です。
答え2
カーネルスレッドは通常のプロセスに似ていますが、2つの違いがあります。 (1) カーネルスレッドはカーネルモードで実行され、(2) 独自のアドレス空間はありません。名前が示すように、カーネルスレッドはユーザー空間に切り替えられませんが、カーネルモードで実行され続けます。各カーネルスレッドには独自のスタックがありますが、アドレス空間は残りのカーネルと共有されます。この点で、これらはユーザー空間スレッドに似ていますが、もちろん違いがありますが、ユーザー空間スレッドは自分が開始したユーザーレベルのプロセスのアドレス空間にあります。