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()
/dev/print
:
将分配内存,dev_open
将不再是一个no op,而是将数据馈送到设备预先分配的内存中(如果print()
将在原子上下文和所有上下文中使用)print()
会抛弃一切dev_release
将为您获取字符串dev_read
可以在屏幕打印系统上执行某些操作dev_write
打印
时,字符串都会插入到链接列表中
我真的不知道你是指print
还是printk
。但是,如果您谈论的是printk()
,那么您需要分配内存,并且您会遇到麻烦,因为printk()
可能在原子上下文中被调用。这使您可以选择使用循环缓冲区(因此,您应该允许删除一些字符串,因为您可能没有足够的内存来保存所有字符串)
每隔X秒,我需要处理列表,并在打印字符串之前对字符串执行一些操作
在这种情况下,我甚至不会执行内核线程:如果不太昂贵,我会在print()
中执行处理
否则,我将创建一个新的系统调用:
或类似的东西,可以将整个链接列表转储到用户空间中(并在复制时从列表中删除条目)sys\u get\u strings()
/dev/print
:
将分配内存,dev_open
将不再是一个no op,而是将数据馈送到设备预先分配的内存中(如果print()
将在原子上下文和所有上下文中使用)print()
会抛弃一切dev_release
将为您获取字符串dev_read
可以在屏幕打印系统上执行某些操作dev_write
但是,同样,您也可以使用自旋锁(及其相关成本),而不使用额外的线程(这基本上就是计时器所做的,使用自旋锁)。这确实是一种折衷。k允许线程睡眠。(然而,并非所有的KThread都向所有客户机提供休眠执行,例如softirqd就不会。) 但是,同样,您也可以使用自旋锁(及其相关成本),而不使用额外的线程(这基本上就是计时器所做的,使用自旋锁)。这真是一种折衷