Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 中断上下文下半部分(Softirq或Tasklet)_Linux_Linux Kernel_Interrupt Handling - Fatal编程技术网

Linux 中断上下文下半部分(Softirq或Tasklet)

Linux 中断上下文下半部分(Softirq或Tasklet),linux,linux-kernel,interrupt-handling,Linux,Linux Kernel,Interrupt Handling,softirq/tasklet被认为是在中断上下文中执行的,关于中断上下文,我有以下问题 q1)如果我们试图把睡眠放在任务表中(中断上下文下半部分)(如果任务程序是由中断处理程序安排的),会发生什么情况。 [我的理解] 正如我所知,当调用tasklet_schedule时,从中断处理程序出来时,它将获取tasklet_vec结构指针,如果当前没有其他中断/高优先级softirq在进行中,它将调度ksoftirqd,它将运行处理程序(tasklet handler)如果tasklet处理程序使用

softirq/tasklet被认为是在中断上下文中执行的,关于中断上下文,我有以下问题

q1)如果我们试图把睡眠放在任务表中(中断上下文下半部分)(如果任务程序是由中断处理程序安排的),会发生什么情况。 [我的理解] 正如我所知,当调用tasklet_schedule时,从中断处理程序出来时,它将获取tasklet_vec结构指针,如果当前没有其他中断/高优先级softirq在进行中,它将调度ksoftirqd,它将运行处理程序(tasklet handler)如果tasklet处理程序使用sleep,那么ksoftirqd将移动到等待队列,除非调用另一个tasklet,否则我的中断tasklet处理程序将在此点上继续

我们说“中断上下文代码不能休眠”(若我在中断处理程序中使用休眠,考虑到我并没有使用spint lock或我并没有禁用定时器中断,那个么后果会是什么)


(如果我的理解有误,请纠正我)

睡眠仅在进程上下文中有效,而不是在中断上下文中。在中断上下文中,“current”不是一个有效的任务,所以我们可以将其置于睡眠状态,稍后将其唤醒。如果您想在tasklet中睡眠,请使用线程如果您试图在tasklet中睡眠,则会出现一个内核错误,指示在原子上下文中切换上下文。 在下半部分,它是中断上下文,在ksoftirqd中是进程上下文。
不管处理下半部分或ksoftirqd中的tasklet,
thread\u info->preempt\u count
都不是零,这意味着原子上下文。

我不是说睡眠,我指的是任何允许睡眠的Linux调用(如信号量、互斥),在这种情况下会发生什么。睡眠不仅仅意味着“睡眠”调用,而是任何睡眠的api。您只能调度“调度程序实体”,如进程和线程。中断不在进程(或线程lwp)上下文中运行。