- 论坛徽章:
- 0
|
问:
taskset -c 1 cat /proc/scull_current
//SMP(4核)
local_irq_save(flags);
while( jiffies == j1 )
{
index++;
}
local_irq_restore(flags);
自己理解相关的知识点:jiffies是全局的,local_irq_save只关闭本cpu的中断,处理jiffies的时钟程序是绑定在cpu0上的.
local_irq_save关闭的只是本地中断,那么定时器的中断信号在其他处理器上应该是可以被激活的.
那么在多核上应该可以由其他核心激活定时器的中断而修改jiffies的值,
从而达到在cpu1上的任务访问jiffies的时候jiffies已经改变.
环境 :Linux ubuntu 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux
直接导致ubuntu无响应了。
答:
if(f)
{
return -1;
}
printk(KERN_ALERT "preempt_disable\n");
local_irq_save(flags);
while( jiffies == j1 )
{
//printk(KERN_ALERT "\n%x %x\n",jiffies,index);
//cpu_relax();
index++;
}
local_irq_restore(flags);
f++;
在UP(单核)和SMP(双核)进行测试
UP(单核) :执行了cat /proc/scull_current直接卡死了
SMP(双核) :执行了cat /proc/scull_current,只执行了一次就推出了,证明其他核心确实可以更新jiffies全局变量。
而出现问题中的情况可能是,xwindow可能正好调度到 cat /proc/scull_current所在的核心,而此时,因为没有加if(f)的判断,此核心正在疯狂循环,根本抽不空闲的时间片来执行xwindow的程序,导致了卡死的假象。 |
|