linux内核打印"BUG: scheduling while atomic"和"bad: scheduling from the idle thread"错误的时候, 通常是在中断处理函数中调用了可以休眠的函数,如semaphore,mutex,sleep之类的可休眠的函数, 而linux内核要求在中断处理的时候,不允许系统调度,不允许抢占,要等到中断处理完成才能做其他事情. 因此,要充分考虑中断处理的时间,一定不能太久. 另外一个能产生此问题的是在idle进程里
问题背景 一个内核模块中,需要通过d_path接口获取文件的路径,然后与目标文件白名单做匹配. 在生产环境中,获取的文件是存在的,但是与文件白名单中的文件总是匹配失败. 问题定位: 通过打印d_path返回的字符串,发现获得的路径后面多了一个" (deleted)"字符串,在做完全匹配时不通过. 看了d_path函数说明:如果entry被删除了,会添加" (deleted)"字符串. * Convert a dentry into an ASCII path nam
一些内核调用可以用来方便标记bug,提供断言并输出信息.最常用的两个是BUG()和BUG_ON(). 当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印.为什么这些声明会导致 oops跟硬件的体系结构 是相关的.大部分体系结构把BUG()和BUG_ON()定义成某种非法操作,这样自然会产生需要的oops.你可以把这些调用当作断言使用,想要断言某种情况不该发生: if (bad_thing)BUG(); //需要linux 内核开启General setup->Configure s