1

私は linux-3.7.6/kernel/sched/core.c に取り組んでいます。ここでは、schedule() 関数でプロセスの pid と tgid を記録し、記録された値をユーザー空間に表示する必要があります。tgid と pid を格納しているカーネル空間で構造体のグローバル配列を取得し、配列のアドレスをユーザー空間に渡してから、ユーザー空間で tgid と pid の値にアクセスできるかどうかを考えていました。

typedef struct process{
int pid;
int tgid;
}p;

p proc[100];

構造体の配列に格納されているすべてのデータを一度にユーザー空間に送信する方法はありますか? 以前にcopy_to_userを使用したことがありますが、copy_to_userがデータをブロックの形でコピーするときに、これらの値のセット全体を送信する方法としてここで立ち往生していますか? 誰かが先に進む方法を教えていただければ幸いです。ありがとう!

4

1 に答える 1

1

配列をユーザーレベルにコピーしている間、原子性を維持したいと思います。

簡単な方法は次のとおりです。

 p local_array[100];

preemption_disable();   //disable preemption so you array content will not change,
                        //because no schedule() can be executed at this time.

memcpy(local_array, array, sizeof(array));   //then we get the consistent snapshot of
                                             //array.
preemption_enable();

copy_to_user(user_buff_ptr, local_array, sizeof(array));
于 2013-03-28T08:16:39.297 に答える