2

ハードウェア割り当ての一部として、Linux 2.4.18 用の新しいスケジューリング メカニズムを実装しようとしています。次の問題があります:新しいメカニズムでは、アクティブキューが空でないときにエポックを変更する必要があります。そのためには、すべてのプロセスをアクティブキューから期限切れに転送し、期限切れとアクティブを切り替える必要があります. それらを有効期限切れに転送するために、アクティブなキュー内のすべてのプロセスを調べるにはどうすればよいですか?

値が 1 の 140 個のビットマップすべてを調べてみました。それぞれのビットマップで for_each_task を使用し、アクティブから削除して期限切れに挿入しました。

しかし、何らかの理由で (システム コールを使用して) 新しいメカニズムに変更すると、システムがリセットされます。

スケジュール機能中にシステムが多くのプロセスを実行するのは難しすぎるのではないかと思いましたか?

何か案は?

これは私がスケジュール機能で書いたコードです

for(int i=0;i<140;i++)
{

    if(this_rq()->active->bitmap[i])
    {
        list_t* iterator;
        list_t* queue=this_rq()->active->queue;
        list_for_each(iterator, queue + i)
        {
            task_t* p = list_entry(iterator,task_t,run_list);
            dequeue_task(p,this_rq()->active);
            enqueue_task(p,this_rq()->expired);
        }   

    }
}

ありがとう

4

1 に答える 1

1

これは仮想マシンで実行し、gdboverserialを使用してリモートデバッグすることをお勧めします。それはあなたがあなたのハードウェアのその後のバグをはるかに速く解決するのを助けます-あなたはあなたのコードがあるところにブレークポイントを設定し、そしてカーネルが死ぬ理由を正確に見るためにステップスルーすることができます。

たとえば、VirtualBoxを使用している場合は、こちらの手順に従うことができます

また、カーネルでkgdbを有効にする必要があります。

于 2012-04-25T19:18:02.807 に答える