在 linux 设备驱动程序中允许和不允许做什么?

What are allowed and not allowed to do in a linux Device Driver?

我有一个关于 linux 设备驱动程序的一般性问题。我经常感到困惑的是,在 linux 设备驱动程序中允许或不允许执行哪些操作?

是否有任何规则或某种查找列表可遵循?

例如下面的例子,哪些是不允许的?

msleep(1000);
al = kmallock(sizeof(val));
printk(KERN_ALERT "faild to print\n";
ret = adc_get_val()*0.001;

在linux设备驱动程序编程中,这取决于您所处的环境。有两个上下文需要区分:

  • 进程上下文
  • IRQ 上下文。

睡眠只能在进程上下文中完成,或者您安排工作以供稍后执行(有多种机制可用于执行此操作)。这是一个复杂的话题,无法用一段话来描述。

分配内存可以休眠,这取决于调用parameters/flags kmalloc。

print 总是可以被调用(一旦内核被调用),否则使用 early_printk.

我不知道 add_get_val 函数的作用。它不是 linux 内核的一部分。正如已经评论过的,在内核中不能轻易使用浮点值。