gpt4 book ai didi

android - 如何在 linux 内核中定义和触发我自己的新 softirq?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:12:56 34 4
gpt4 key购买 nike

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

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

394 void open_softirq(int nr, void (*action)(struct softirq_action *))
395 {
396 softirq_vec[nr].action = action;
397 }

在我想引发软中断的代码 fragment 中,我将添加对 raise_softirq 函数的调用:

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添加到:

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 };

在这里:

 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 };

问题:

  • 我是对的还是我漏掉了什么?
  • 这样做正确吗?还有其他选择吗?

最佳答案

如果您想修补内核并重新编译它,您可能做对了(除非您应该将它移到 RCU_SOFTIRQ 之前)。

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

tasklet_init() 用于初始化您的钩子(Hook)。

tasklet_schedule() 调度您注册的 tasklet。

关于android - 如何在 linux 内核中定义和触发我自己的新 softirq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14301331/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com