Можем ли мы запустить ядро ​​Linux на определенных ядрах в многоядерном процессоре? - PullRequest
0 голосов
/ 13 мая 2018

Я делаю устройство обнаружения мозговых волн.Я возьму процессор Octa-Core ARM для обработки программного обеспечения.Могу ли я кодировать ядро ​​Linux для управления ядрами Linux строго для работы с определенным набором ядер?Скажем, ядро ​​1, 2 и 3. Но оно не должно быть слишком строгим, поскольку мне также нужно порождать драйвер устройства на отдельном ядре (давайте возьмем ядро ​​4).Так можно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Не совсем понятно, о чем вы просите.

Оставление ядер неиспользованными?

Хотя вы можете загрузить Linux, используя только подмножествоядра в машине, нет смысла делать это.Напрашивается вопрос, что будут делать неиспользуемые ядра?Они не будут доступны для программного обеспечения (приложения или кода драйвера), которое вы используете в Linux, потому что загруженный вами Linux их не использует.

Имейте в виду, что ядро ​​- это просто процессор, который находится в том же адресном пространстве памяти, что и другие ядра.Он должен что-то запускать, и это нормально, когда на нем работают части ОС.На ядре должно быть что-то, управляющее этим (планирование того, что на нем работает).Вы не можете просто вывести поток приложения в ЦП, если у него нет чего-то, что могло бы предоставить ему службы ОС.

Core Affinity?

Если вы заинтересованы в получении контроля над сродством ядра, есть функции для управления тем, какой из ваших потоков работает на каких ядрах.Хотя я предостерегаю против них - это тонна работы для каждой модели процессора, которую вы хотите поддерживать, и вам все равно придется побороться с тем, что делает ядро ​​Linux в любом случае.Я попробовал и сделал лишь небольшое улучшение по сравнению с тем, что Linux достиг автоматически.Это того не стоило.

Планирование в реальном времени?

Вы действительно ищете какую-то производительность в реальном времени?Лучшее, что вы можете сделать с Linux, это что-то вроде набора патчей PREEMPT_RT (я думаю, он становится все более распространенным).

В этой версии Linux драйверы устройств превращаются в потоки и, следовательно, имеют приоритет перед загрузкой, как и все остальное.Поэтому, если вы дадите потоку приложения / драйвера высокий приоритет в реальном времени, он (почти) всегда выиграет решение «что будет запланировано следующим», которое примет ядро.PREEMPT_RT также решит инверсию приоритетов, поэтому, если ваш поток заблокирован потоком с более низким приоритетом, конкурирующим за тот же ресурс, ядро ​​сделает все возможное, чтобы разобраться.

Если задержка PREEMPT_RT недостаточно мала для васLinux - неправильный выбор.На ум приходит VxWorks.

0 голосов
/ 13 мая 2018

Один из способов сделать это - использовать дерево устройств.Как вы знаете, ядро ​​ничего не знает об оборудовании, поэтому во время загрузки оно извлекает информацию из дерева устройств, где описано оборудование. Здесь , вы можете найти основную информацию.Однако в дереве устройств должен быть следующий раздел:

/dts-v1/;

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

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

Попробуйте описать используемое оборудование, добавив / удалив узлы в дереве устройств.

...