5

Task_struct は、カーネルによってプロセスに関する必要な情報を保持するために使用されます。その構造のおかげで、カーネルはプロセスを一時停止し、しばらくするとその実装に進むことができます。しかし、私の質問は次のとおりです。この task_struct はメモリのどこに格納されていますか (カーネルスタックについて読んだことがありますが、それは仮想アドレス空間のカーネル空間にありますか?)? プロセスを中断した後、カーネルはその構造体とその構造体へのポインターをどこに保持しますか?

説明されているリソースへの参照をいくつか提供していただければ幸いです。

PS。質問は Linux カーネルに関するものだと言い忘れていました。

4

4 に答える 4

6

Linux カーネルは、kmem_cache 機能を介して task_struct を割り当てます。たとえば fork.c には、タスク構造体の割り当てを担当するコードがあります。

#define alloc_task_struct_node(node) \
             kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node)
static struct kmem_cache *task_struct_cachep;

現在のスレッドへのポインタが格納される場所は、アーキテクチャに依存します。たとえば、x86 (arch/x86/include/asm/current.h) では次のように動作します。

static __always_inline struct task_struct *get_current(void)
{
    return percpu_read_stable(current_task);
}

PowerPC (arch/powerpc/include/asm/current.h) の場合:

static inline struct task_struct *get_current(void)
{
    struct task_struct *task;

    __asm__ __volatile__("ld %0,%1(13)"
        : "=r" (task)
        : "i" (offsetof(struct paca_struct, __current)));

    return task;
}

カーネル ソースを簡単に調べるために、 Elixir クロス リファレンスを使用できます。

于 2012-05-15T17:11:17.473 に答える
0

The kernel structures that handle thread and process context are OS-dependent. Typically, they would be allocated from a non-paged pool, as will be the collection/s of pointers to them that are used to manage them.

于 2012-05-15T16:10:59.053 に答える