__doi_softirq大概讲讲这个函数内部每一行什么意思
时间: 2023-06-27 17:04:56 浏览: 91
`__do_softirq` 是一个内核函数,用于处理软中断(softirq)。下面是每一行的解释:
```c
notrace void __do_softirq(void)
```
这是函数的声明,表示这是一个无返回值的函数,同时也禁止对该函数进行跟踪。
```c
struct softirq_action *h;
unsigned long flags;
```
定义了两个变量,`h` 是一个指向 `softirq_action` 结构体的指针,`flags` 是一个无符号长整型数。
```c
local_irq_save(flags);
```
保存当前中断状态并关闭中断。
```c
__local_bh_disable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
```
禁用软中断。
```c
h = softirq_vec;
```
将 `softirq_vec` 赋值给变量 `h`,`softirq_vec` 是一个 `softirq_action` 类型的数组,存储了系统支持的软中断处理函数。
```c
do {
```
开始一个循环。
```c
struct softirq_action *this = READ_ONCE(*h);
```
将 `h` 指向的地址处的值读取出来,赋值给变量 `this`。`READ_ONCE` 是一个宏,用于安全地读取一个变量的值。
```c
if (this) {
```
判断 `this` 是否为空。
```c
this->action(this);
```
如果不为空,则执行 `this` 中存储的函数指针,也就是调用该软中断的处理函数。
```c
} else {
```
如果为空,则说明该软中断处理函数已经被移除,跳过本次循环。
```c
h++;
```
指向下一个 `softirq_action` 结构体。
```c
} while (this);
```
循环直到 `this` 为空。
```c
local_bh_enable();
```
启用软中断。
```c
local_irq_restore(flags);
```
恢复原来的中断状态。
阅读全文