在看内核log时,发现有一个misc_register注册失败的warning。一开始以为配置的参数有误,看代码也使用了参数MISC_DYNAMIC_MINOR,不太可能出现注册失败的情况。
int misc_register(struct miscdevice * misc)
{
dev_t dev;
int err = 0;
bool is_dynamic = (misc->minor == MISC_DYNAMIC_MINOR);
if (is_dynamic) {
struct miscdevice *c;
int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);
if (i >= DYNAMIC_MINORS) {
err = -EBUSY;
goto out;
}
list_for_each_entry(c, &misc_list, list) {
if (c == misc) {
err = -EEXIST;
goto out;
}
}
misc->minor = DYNAMIC_MINORS - i - 1;
set_bit(i, misc_minors);
} else {
...
}
...
}
加打印发现is_dynamic为0,但有使用参数MISC_DYNAMIC_MINOR,不应该为0。出问题的代码如下,能看出哪里有问题没
static int xxx_img_probe(struct platform_device *pdev)
{
int ret = 0;
ret = misc_register(&image_dev);
if (ret) {
pr_err("cannot register miscdev on minor=%d (%d).\n",IMAGE_MINOR, ret);
r

探讨了在内核log中遇到的misc_register注册失败警告,深入分析代码后发现是由于设备驱动程序被意外调用了两次,且存在一个括号错误导致野指针问题。最终定位到某CPU厂商代码中的bug并提出修复建议。
最低0.47元/天 解锁文章
1222





