当前位置: 技术问答>linux和unix
为什么在scheduler中使用printk就死机???
来源: 互联网 发布时间:2016-08-23
本文导语: 本帖最后由 piaopiaolanghua 于 2010-04-30 16:49:35 编辑 我在task_struct中增加了group_flag 标记位,使用系统调用设置了group_flag=1。 在内核中,进程切换的时候输出调试信息: printk("[MYINFO][STOP ]n"); //为什么么加上这句就死机...
在内核中,进程切换的时候输出调试信息:
printk("[MYINFO][STOP ]n"); //为什么么加上这句就死机,注释掉就没问题了。
死机的现象是,输出了两句“[MYINFO][STOP ]”之后,
cpu占有率就接近100%了,用户界面就没响应了。
是不是那个位置不能使用printk呢,还是引起死锁,或者其他什么原因呢?
我使用的内核是2.6.20.21。
希望大家多给指点指点啦:-),要是你也碰到那就最好,没碰到过的,给点建议也好!
schuler()函数中修改的地方如下:
switch_tasks:
if (next == rq->idle)
schedstat_inc(rq, sched_goidle);
prefetch(next);
prefetch_stack(next);
clear_tsk_need_resched(prev);
rcu_qsctr_inc(task_cpu(prev));
update_cpu_clock(prev, rq, now);
prev->sleep_avg -= run_time;
if ((long)prev->sleep_avg sleep_avg = 0;
prev->timestamp = prev->last_ran = now;
sched_info_switch(prev, next);
if (likely(prev != next)) {
next->timestamp = next->last_ran = now;
rq->nr_switches++;
rq->curr = next;
++*switch_count;
/* ===================[Added]===================== */
if ((prev->group_flag == 1) {
//printk("[MYINFO][%d][STOP ] at %lldn", prev->pid, now);
printk("[MYINFO][STOP ]n"); //为什么么加上这句就死机
}
/* ===================[Added]===================== */
prepare_task_switch(rq, next);
prev = context_switch(rq, prev, next);
barrier();
// 省略了……
用户态调用如下:
#include
/*
#define __NR_get_group_id 320
#define __NR_set_group_id 321
#define __NR_get_group_flag 322
#define __NR_set_group_flag 323
#define __NR_testcall 324
*/
int main()
{
syscall(323, getpid());
int i;
for(i = 0; i