我有一项任务是为linux进程调度添加总优先级并添加一个系统调用,以便调用此系统调用的每个进程获得总优先级。 (总优先级意味着只要系统中存在具有toal优先级的进程,就会始终选择它来运行)。
为了实现这一点,我向has_abs_prio
添加了一个名为task_struct
的新字段:
...
#if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE)
unsigned int sequential_io;
unsigned int sequential_io_avg;
#endif
#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
unsigned long task_state_change;
#endif
int pagefault_disabled;
int has_abs_priority; //<-----------------------------
/* CPU-specific state of this task */
struct thread_struct thread;
/*
* WARNING: on x86, 'thread_struct' contains a variable-sized
* structure. It *MUST* be at the end of 'task_struct'.
*
* Do not put anything below here!
*/
};
我还修改了INIT_TASK
宏,用0初始化了这个值。
我已修改了pick_next_task
中的sched/core.c
功能:
static inline struct task_struct *
pick_next_task(struct rq *rq, struct task_struct *prev)
{
const struct sched_class *class = &fair_sched_class;
struct task_struct *p;
if (prev->has_abs_priority){
return prev;
}
...
(我知道这并不是作业所要求的,因为为了这个工作,这个过程必须选择一次,然后它具有绝对的优先权,但我认为它足够接近。)
并添加了一个基本上这样做的系统调用:
current->has_abs_priority = 1;
但每当我调用系统调用时,系统崩溃。我认为问题必须在pick_next_task的修改中,因为如果我在return prev;
中评论pick_next_task
,则不会发生崩溃。另外我在VirtualBox VM上运行它,我不知道如何捕获崩溃输出(shift + pageup不起作用)
but here is a screenshot of the final part。
如果有帮助,内核版本为4.2.5,操作系统为archlinux。
知道问题是什么吗?