首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在linux内核中定义和触发我自己的新软件?

如何在linux内核中定义和触发我自己的新软件?
EN

Stack Overflow用户
提问于 2013-01-13 06:49:05
回答 2查看 2.2K关注 0票数 7

我想在linux内核中创建自己的softirq。这是正确的方法吗?

在模块的init中,我想从其中触发softirq,我将添加一个调用到:

代码语言:javascript
复制
394 void open_softirq(int nr, void (*action)(struct softirq_action *))
395 {
396         softirq_vec[nr].action = action;
397 }

在这个片段中,我想要提高softirq,我将添加一个对raise_softirq函数的调用:

代码语言:javascript
复制
379 void raise_softirq(unsigned int nr)
380 {
381         unsigned long flags;
382 
383         local_irq_save(flags);
384         raise_softirq_irqoff(nr);
385         local_irq_restore(flags);
386 }

并将我的新softirq添加到:

代码语言:javascript
复制
411 /* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
412    frequency threaded job scheduling. For almost all the purposes
413    tasklets are more than enough. F.e. all serial device BHs et
414    al. should be converted to tasklets, not to softirqs.
415  */
416 
417 enum
418 {
419         HI_SOFTIRQ=0,
420         TIMER_SOFTIRQ,
421         NET_TX_SOFTIRQ,
422         NET_RX_SOFTIRQ,
423         BLOCK_SOFTIRQ,
424         BLOCK_IOPOLL_SOFTIRQ,
425         TASKLET_SOFTIRQ,
426         SCHED_SOFTIRQ,
427         HRTIMER_SOFTIRQ,
428         RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */
429         MY_NEW_SOFTIRQ
430         NR_SOFTIRQS
431 };

在这里:

代码语言:javascript
复制
 60 char *softirq_to_name[NR_SOFTIRQS] = {
 61         "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "BLOCK_IOPOLL",
 62         "TASKLET", "SCHED", "HRTIMER", "RCU", "MY_NEW_SOFTIRQ"
 63 };

问题如下:

  • 我是对的还是错过了什么?
  • 这样做对吗?还有其他选择吗?
EN

回答 2

Stack Overflow用户

发布于 2013-01-14 14:32:22

如果您想修补内核并重新编译它,您可能做得很正确(除了应该在RCU_SOFTIRQ之前移动它)。

否则,IOW如果要在内核模块中执行此操作,则必须使用基于SoftIRQ的tasklet在SoftIRQ上下文中执行以下操作:

tasklet_init()用来插入你的钩子。

tasklet_schedule()来安排您注册的任务。

票数 1
EN

Stack Overflow用户

发布于 2015-05-21 07:27:37

静态声明Softirq

通过将软to (MY_NEW_SOFTIRQ)添加到enum

char *softirq_to_name[NR_SOFTIRQS]。重新编译内核。

动态注册Softirq

在静态声明之后,我们自己的softirq应该在运行时使用open_softirq()在内核模块中注册。通过raise_softirq()在中断处理程序的退出路径中引发它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14301331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档