mm_segment_t addr_limit
ある本(Linux カーネル プログラミング)を読んでいたとき、 (のメンバーの 1 人struct_task
)について、以下に示すような興味深い/わかりにくい段落を見つけました。
mm_segment_t アドレス制限;
以前のカーネルとは異なり、2.4 以降ではタスク (スレッド) もカーネル内に配置できます。これらは、ユーザー空間のタスクよりも大きなアドレス空間にアクセスできます。アドレス制限タスクのカーネルを使用してアクセスできるアドレス空間を記述します。
質問:
最初のポイントでは、「(タスク)スレッドまた、「カーネル内」というものがあります。これはどういう意味ですか? スレッドは必ずしもカーネル内にあるとは限りませんか?
2番目の文では、「これらユーザー空間のタスクよりも大きなアドレス空間にアクセスできます。"これらどういう意味ですか? スレッドについて話しているのなら、スレッドはタスクよりも大きなアドレス空間を持つことができるのはなぜですか?
答え1
「カーネル内」というフレーズは、おそらくカーネルスレッドこれらはカーネル自体が非同期に実行できる作業に使用します。プロセス ツリーでこれらのスレッドの例を確認できます。
# ps aux | grep '\[.*\]$' | head
root 2 0.0 0.0 0 0 ? S May05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S May05 0:03 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S May05 0:00 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S May05 0:00 [kworker/u:0]
root 6 0.0 0.0 0 0 ? S May05 0:00 [migration/0]
root 7 0.0 0.0 0 0 ? S May05 0:00 [watchdog/0]
root 8 0.0 0.0 0 0 ? S May05 0:00 [migration/1]
root 9 0.0 0.0 0 0 ? S May05 0:00 [kworker/1:0]
root 10 0.0 0.0 0 0 ? S May05 0:02 [ksoftirqd/1]
root 11 0.0 0.0 0 0 ? S May05 0:00 [watchdog/1]
このようなスレッドは、kthread_create() を呼び出すカーネル コードによって作成されます。これらのスレッドはカーネル モードで実行され、カーネルから期待されるさまざまなタスクを実行します。
一方、「ユーザー空間のタスク」は、通常考えられているように、fork+exec または pthread_create によって作成されたスレッドまたはプロセスを表します。これらはユーザー モードで実行され、カーネルからのサービスが必要なときにシステム コールを実行します。ここでの表現は少し奇妙です。もちろん、カーネルはこれらのタスクを認識しており、それらに関する情報 (struct_task など) を維持して、CPU 上でそれらの時間をスケジュールできるためです。
(2)に関して、「これら」は具体的には「カーネルスレッド」を指します。カーネルスレッドはカーネルと同じアドレス空間を共有するものと考えています。