一个内核线程可以垄断内核吗?

时间:2020-09-11 11:24:41

标签: linux-kernel kernel

尽管通过特定线程抢占一个处理器内核不是一件好事,但我想使一个内核线程在特定内核上运行而不会抢占和中断,从而获得一段时间的性能收益(就像我们将用户进程固定到一芯)

加载内核驱动程序之后,并且通过IOCTL调用内核函数时,它将使用local_irq_disable()函数禁用本地中断。我的期望是因为已禁用了该特定内核的中断,因此不应从该内核中调度内核线程,并且应该在调用local_irq_enble()函数之前运行该线程。

但是,几秒钟后,将调用内核监视程序,并通过一些监视程序消息自动重新引导计算机。尽管我将线程固定在逻辑处理器3上,但看门狗打印出由于另一个逻辑核心被卡住而导致内核无法重新启动,例如4而不是3。

即使已禁用该处理器的本地中断,如何调度内核线程?有什么方法可以暂时禁用该特定内核的中断和抢占?如果看门狗有问题,则必须关闭哪个看门狗?看门狗? nmi-watchdog?

static long unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long argp)
{
        int cpuNum = 0;
        switch (cmd) {
                case MON:
                        printk("Monitoring starts\n");
                        cpuNum = smp_processor_id();
                        printk("Monitor starts to run at core %d\n", cpuNum);
                        local_irq_disable();
                        while(1);
                        break;
                default:
                        return -EINVAL;
                break;
        }
        return 0;
}

我没有在while循环中放入一些逻辑,而是故意使它在无限循环内运行。假设当前在我的驱动程序中运行此ioctl函数的内核在开始时的运行时间是4,但是几秒钟后,内核便开始自动重启,并带有看门狗的消息,例如处理器5 not 4没有响应。

0 个答案:

没有答案