Linux kernel 内核线程与计时器

Linux kernel 内核线程与计时器,linux-kernel,kernel,Linux Kernel,Kernel,我正在编写一个内核模块,它使用定制的屏幕打印系统。基本上,每次涉及打印时,字符串都会插入到链接列表中。 每隔X秒,我需要处理列表,并在打印字符串之前对字符串执行一些操作 基本上,我有两种选择来实现这样的过滤器: 1) 计时器(最后自动重启) 2) 休眠X秒的内核线程 当过滤器执行其功能时,其他任何东西都不能使用链表,当然,当插入字符串时,过滤器函数将等待 AFAIK计时器在中断上下文中运行,所以它无法睡眠,但内核线程呢?他们能睡觉吗?如果是,有什么理由不在我的项目中使用它们吗?还可以使用什么其他

我正在编写一个内核模块,它使用定制的屏幕打印系统。基本上,每次涉及
打印
时,字符串都会插入到链接列表中。 每隔X秒,我需要处理列表,并在打印字符串之前对字符串执行一些操作

基本上,我有两种选择来实现这样的过滤器:

1) 计时器(最后自动重启)

2) 休眠X秒的内核线程

当过滤器执行其功能时,其他任何东西都不能使用链表,当然,当插入字符串时,过滤器函数将等待

AFAIK计时器在中断上下文中运行,所以它无法睡眠,但内核线程呢?他们能睡觉吗?如果是,有什么理由不在我的项目中使用它们吗?还可以使用什么其他解决方案

总而言之:我的过滤功能只有3个要求:

1) 必须能够
printk

2) 使用列表时,尝试访问列表的所有其他内容都必须阻塞,直到筛选器函数完成执行

3) 必须每X秒运行一次(不是实时要求)

每次涉及到
打印
时,字符串都会插入到链接列表中

我真的不知道你是指
print
还是
printk
。但是,如果您谈论的是
printk()
,那么您需要分配内存,并且您会遇到麻烦,因为
printk()
可能在原子上下文中被调用。这使您可以选择使用循环缓冲区(因此,您应该允许删除一些字符串,因为您可能没有足够的内存来保存所有字符串)

每隔X秒,我需要处理列表,并在打印字符串之前对字符串执行一些操作

在这种情况下,我甚至不会执行内核线程:如果不太昂贵,我会在
print()
中执行处理

否则,我将创建一个新的系统调用:

  • sys\u get\u strings()
    或类似的东西,可以将整个链接列表转储到用户空间中(并在复制时从列表中删除条目)
这样,整个行为由用户空间控制。您可以创建一个deamon,它每X秒调用一次系统调用。您还可以在用户空间中进行所有代价高昂的处理

您还可以创建一个新设备,在屏幕上显示
/dev/print

  • dev_open
    将分配内存,
    print()
    将不再是一个no op,而是将数据馈送到设备预先分配的内存中(如果
    print()
    将在原子上下文和所有上下文中使用)
  • dev_release
    会抛弃一切
  • dev_read
    将为您获取字符串
  • dev_write
    可以在屏幕打印系统上执行某些操作
每次涉及到
打印
时,字符串都会插入到链接列表中

我真的不知道你是指
print
还是
printk
。但是,如果您谈论的是
printk()
,那么您需要分配内存,并且您会遇到麻烦,因为
printk()
可能在原子上下文中被调用。这使您可以选择使用循环缓冲区(因此,您应该允许删除一些字符串,因为您可能没有足够的内存来保存所有字符串)

每隔X秒,我需要处理列表,并在打印字符串之前对字符串执行一些操作

在这种情况下,我甚至不会执行内核线程:如果不太昂贵,我会在
print()
中执行处理

否则,我将创建一个新的系统调用:

  • sys\u get\u strings()
    或类似的东西,可以将整个链接列表转储到用户空间中(并在复制时从列表中删除条目)
这样,整个行为由用户空间控制。您可以创建一个deamon,它每X秒调用一次系统调用。您还可以在用户空间中进行所有代价高昂的处理

您还可以创建一个新设备,在屏幕上显示
/dev/print

  • dev_open
    将分配内存,
    print()
    将不再是一个no op,而是将数据馈送到设备预先分配的内存中(如果
    print()
    将在原子上下文和所有上下文中使用)
  • dev_release
    会抛弃一切
  • dev_read
    将为您获取字符串
  • dev_write
    可以在屏幕打印系统上执行某些操作

k允许线程休眠。(然而,并非所有的KThread都向所有客户机提供休眠执行,例如softirqd就不会。)
但是,同样,您也可以使用自旋锁(及其相关成本),而不使用额外的线程(这基本上就是计时器所做的,使用自旋锁)。这确实是一种折衷。

k允许线程睡眠。(然而,并非所有的KThread都向所有客户机提供休眠执行,例如softirqd就不会。) 但是,同样,您也可以使用自旋锁(及其相关成本),而不使用额外的线程(这基本上就是计时器所做的,使用自旋锁)。这真是一种折衷