Multithreading 我们可以在多核CPU的特定核上运行linux内核吗?

Multithreading 我们可以在多核CPU的特定核上运行linux内核吗?,multithreading,linux-kernel,embedded-linux,multicore,Multithreading,Linux Kernel,Embedded Linux,Multicore,我在做一个脑波探测装置。 我将使用一个八核ARM处理器进行软件处理。 对于CPU内核的管理,我可以对Linux内核进行编码,使其严格地在特定的一组内核上运行吗?假设核心1、2和3。 但它不应该太严格,因为我还需要在一个单独的核心上生成设备驱动程序(让我们以核心4为例)。 那么有可能做到这一点吗?其中一种方法是使用设备树。正如您所知,内核对硬件一无所知,因此在引导时,它从描述硬件的设备树中检索信息。 ,你可以找到一些基本信息。但是,在设备树中,应该有如下部分: /dts-v1/; / {

我在做一个脑波探测装置。 我将使用一个八核ARM处理器进行软件处理。 对于CPU内核的管理,我可以对Linux内核进行编码,使其严格地在特定的一组内核上运行吗?假设核心1、2和3。 但它不应该太严格,因为我还需要在一个单独的核心上生成设备驱动程序(让我们以核心4为例)。
那么有可能做到这一点吗?

其中一种方法是使用设备树。正如您所知,内核对硬件一无所知,因此在引导时,它从描述硬件的设备树中检索信息。 ,你可以找到一些基本信息。但是,在设备树中,应该有如下部分:

/dts-v1/;

/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };
};

尝试通过添加/删除设备树中的节点来描述要使用的硬件。

不完全清楚您要的是什么

保留未使用的核心?

虽然您可能只使用机器中的一部分内核就可以让Linux启动,但这样做毫无意义。它回避了这样一个问题:未使用的内核将要做什么?它们不适用于您在Linux上运行的软件(应用程序或驱动程序代码),因为您启动的Linux没有使用它们

请记住,核心只是一个CPU,它恰好与其他核心位于同一内存地址空间中。它必须运行一些东西,在上面运行大量的操作系统是很正常的。必须在核心上运行一些东西来管理它(安排在上面运行的内容)。你不能仅仅将一个应用程序线程转储到一个CPU上,而不向它提供操作系统服务

核心亲和力?

如果您对控制核心关联感兴趣,那么可以使用一些函数来控制哪些线程在哪些核心上运行。尽管我对它们提出了警告——对于您希望支持的每种CPU型号,都需要做大量的工作,而且无论如何,您都很难打败Linux内核。我已经尝试过了,并且只比Linux自动完成的功能做了一点小小的改进。这不值得

实时调度?

你真的在寻找实时性能吗?使用Linux最好的方法是使用PREEMPT\u RT补丁集(我认为它正在成为主流)

在这个版本的Linux中,设备驱动程序变成了线程,因此和其他任何东西一样是可抢占的。因此,如果您给应用程序/驱动程序线程一个高实时优先级,它将(几乎)总是赢得内核将要做出的“下一步计划”决策。PREEMPT\u RT还将解决优先级反转问题,因此,如果您的线程被争夺相同资源的低优先级线程阻塞,内核将尽最大努力解决问题


如果抢占的延迟对您来说不够低,那么Linux是错误的选择。我想到了VxWorks。

你必须更明确地说明在特定的一组内核上运行的“Linux”是什么意思(你说的是内核还是用户空间?),或者在特定的内核上“生成设备驱动程序”。是否只想设置默认处理器关联?是的,这是可能的!其中一种可能是使用设备树,其中描述了要使用的硬件。我的意思是,Linux内核将在特定的内核集上运行。特定于设备的主驱动程序将在单独的内核(内核内核除外)上生成。其余的核心将用于用户空间。有一篇关于此主题的论文:。它不包含太多关于实际工作的信息,但更具可能性。驱动程序可以在独立的内核上运行。有没有办法将内核限制在一组特定的内核中?同样的方法,没有?如果您只想使用这3个CPU,请尝试指定CPU 0-1和6,如果可以,请告诉我们。谢谢。上述过程与驾驶员相关。但是整个Linux内核可以在CPU上运行吗?例如,CPU 0-2。有什么建议吗?好的,你使用的是哪个平台?给我们更多的细节:工具,框架,你如何生成你的devicetree blob等等。我承认这个问题有点让人困惑,因为我在一个问题中提出了更多。道歉。内核将在我们自己的微控制器上运行。最重要的设备驱动程序将在一组专用的内核上运行。我的问题是,我们能否严格地将CPU内核划分为用户空间和内核空间?将有大量并行信号处理来解释脑电波。那么划分CPU核心是否可行?@MiteshG,不,你不能。内核调度器将在每个内核上运行。调度器将在他们认为最好的内核上调度任何准备好运行的东西(应用程序和设备驱动程序线程)。您可以玩弄控制应用程序线程的核心亲和力,但您很难做出比内核更好的决策。在抢占内核上,最好将线程设置为实时优先级,并且优先级高于驱动线程。如果延迟仍然不够低,那么说明您使用了错误的操作系统。因此,基本上,对于流程管理所做的一切,都必须在调度程序中完成。先生,你做过内存管理吗?我有一些不同的信号处理策略(脑波)。最后,先生,我们能保持联系吗?堆栈溢出上没有您的联系方式。