4

task_struct があるかどうかはわかっていますが、含まれている sched_entity を取得できるのは、それが task 構造体の 1 つのフィールドであるためです。しかし、shed_entity から task_struct へのポインターを取得できますか? 以下は、sched_entity 構造体です。

struct sched_entity {
    struct load_weight  load;       /* for load-balancing */
    struct rb_node      run_node;
    struct list_head    group_node;
    unsigned int        on_rq;

    u64         exec_start;
    u64         sum_exec_runtime;
    u64         vruntime;
    u64         prev_sum_exec_runtime;

    u64         nr_migrations;


#ifdef CONFIG_SCHEDSTATS
    struct sched_statistics statistics;
#endif

#ifdef CONFIG_FAIR_GROUP_SCHED
    struct sched_entity *parent;
    /* rq on which this entity is (to be) queued: */
    struct cfs_rq       *cfs_rq;
    /* rq "owned" by this entity/group: */
    struct cfs_rq       *my_q;
#endif
};

task_struct を取得できる場所がないようです。私の最終的な目標は、この shed_entity を持つタスクを含むタスク group_leader の sched_entity を取得することです:>

4

1 に答える 1

6

Linux カーネル コードは、構造内に含まれる要素へのポインターを取得し、それを含む構造へのポインターを取得する標準的な方法を提供しcontainer_ofます。これは、カーネル全体で広く使用されているマクロです。

この場合、 がある場合はstruct sched_entity *foo、次のように囲むことができますtask_struct

struct task_struct *task = container_of(foo, struct task_struct, se);

(明らかに、これは、元のポインターが a内にあるstruct sched_entity *a を指していることが確実にわかっている場合にのみ安全なので、注意してください...)struct sched_entitystruct task_struct

于 2012-07-01T16:48:03.313 に答える