本(Linuxカーネルプログラミング)を読んで、次のような興味深くて混乱した詩mm_segment_t addr_limit
(メンバーの一人)を見つけました。struct_task
mm_segment_t addr_limit;
以前のカーネルとは異なり、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によって生成されたスレッドまたはプロセスと考えられることを示します。ユーザーモードで実行され、カーネルサービスが必要なときにシステムコールを実行します。ここで言う表現は少し奇妙です。もちろん、カーネルはこれらのタスクについて知っていて、CPUでタスクをスケジュールできるように、そのタスクに関する情報(struct_taskなど)を保持しているからです。
(2)の場合、「これ」は具体的には「カーネルスレッド」を意味する。私はカーネルスレッドがカーネルと同じアドレス空間を共有していると思います。