Linuxカーネルのプロセスは、カーネルモードで異なるスレッドに対して別々のスタックをどのように割り当てますか?

Linuxカーネルのプロセスは、カーネルモードで異なるスレッドに対して別々のスタックをどのように割り当てますか?

プロセスがシステムコールを行い、カーネルモードにある場合、2つのスレッドが作成されます。

a) カーネル内の各スレッドのスタックはどのように生成されますか?

b)スレッドの1つがユーザーモードに戻り、他のスレッドがカーネルモードに残った場合、親スレッドが割り当てたカーネルデータ(ローカル)は失われますか?

c)生成された2つのスレッドのPIDが異なるのはなぜですか?

答え1

カーネルをたくさん調査し、同じトピックに関連するプロジェクトを進めた後、次のことがわかりました。

a) はい、各 kthread には 8k、4k などのアーキテクチャに依存するスタックがあります。

b)はい、カーネルスタックが空のときにユーザースペースに戻すと、スレッドの1つのローカル権限が失われます。ただし、グローバル変数を宣言してその変数を実行すると、そのスレッドを別のスレッドで使用できるようになります。 。もう1つ注目すべき点は、カーネル全体に1つのデータセグメントしかないことです。

c) 2 つのスレッドはカーネルのコンテキストで異なる 2 つのプロセスであり、ps で [] で表されるため、2 つのスレッドの pid が異なります。

関連情報