2

我正在尝试为 Linux 2.4.18 实现一种新的调度机制,作为硬件分配的一部分。我有以下问题:在新机制中我需要在活动队列不为空时更改纪元,为此我需要将所有进程从活动队列转移到过期,然后在过期和活动之间切换. 我怎样才能检查活动队列中的所有进程,以便将它们转移到过期的队列中?

我尝试检查所有 140 个值为 1 的位图,并且在每个位图中我都使用了 for_each_task 并从活动中删除并插入到过期的位图中。

但是由于某种原因,当我更改为新机制(使用系统调用)时,系统会自行重置。

我的想法是,系统在调度功能期间处理这么多进程可能太难了?

有任何想法吗?

这是我在 schedule 函数中写的代码

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

我建议您在虚拟机中执行此操作,并通过串行使用 gdb 进行远程调试。它将帮助您更快地解决硬件中的后续错误——您将能够在代码所在的位置设置断点,并逐步查看内核死机的确切原因。

例如,如果您使用的是 VirtualBox,则可以按照此处的说明进行操作

您还需要在内核中启用 kgdb

于 2012-04-25T19:18:02.807 回答