LINUX.ORG.RU

Запуск отдельной программы на отдельном ядре.

 ,


0

1

Вот, нпример, есть у меня 2-ядерный проц. И я использую линукс. оба ядра исполняют линукс и программы для него. Но вот мне, например, потребовалось что-то в реалтайме обрабатывать. Логично было бы оставить исполнять линукс, обрабатывать прерывания, итд только 1 ядро, а на 2-м запустить мою программу, которая будет делать то, что надо в реальном времени.

При этом ей понадобится область памяти, которую следует запретить использовать 1-му ядру, и отдельная область памяти для общения моей программы и управляющей системы (мониторинг, взаимодействие с пользователем, обращения к линуксовым драйверам итп), запущенной на линуксе.

Это как-то делается штатными средствами линукса, или же нужно самому много модифицировать ядро?

Т.е.: одно ядро оставляем как есть, в линуксе помечаем область физической памяти как зарезервированную, в другом ядре устанавливаем таблицу страниц на использование этой области физической памяти, загружаем в зарезервированную область программу, и передаем ей исполнение. После этого на этом ядре крутится в уровне 0 (или, если надо, 3) уже не линукс, а другая программа.

Которая, если накосячит, может запороть всю память.

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 6)
Ответ на: комментарий от wakuwaku

Время доступа будет со случайными задержками.

время доступа к чему?

К оборудованию, обращение к которму должно происходить за фиксированное время, разумеется надо обращаться не через линуксовые драйвера.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 2)

логично бы рт-ядро установить или хард-рт.

darkenshvein ★★★★★
()

Работа софта на голом железе осталась во временах DOS. Linux, как многопользовательская и многозадачная система, позволить такое себе не может.

Логичнее копать в сторону того, чтобы Linux не кидал на второе ядро никаких задач кроме твоей. И я думаю это возможно каким-нибудь образом.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Linux, как многопользовательская и многозадачная система, позволить такое себе не может.

Так я про то говорю, что пускай линукс исполняется только одним ядром. А второе пускай исполняет мой код.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

К памяти и любым разделяемым устройствам. Шины-то в 1 экземпляре. О таком можно задумываться специализированных на многопроцессорных системах, хотя что-то подсказывает мне, и там быть ограничения, которые придётся учитывать. Но никак не на 2х ядрах.

wakuwaku ★★★★
()
Ответ на: комментарий от cvs-255

И да, в таких случаях нормальные люди, ставят рядом с ЦПУ дополнительный чип (микроконтроллер или FPGA), который и выполняет RT-обработку. А то что нереалтаймовое (например, загрузка настроек или учёт статистики) уже идёт на ЦПУ по USART/USB/PCI/etc.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

ставят рядом с ЦПУ дополнительный чип

А ровно это я и написал, только в роли этого дополнительного чипа используется одно из ядер. А вместо тормозного usart или чуть менее тормозного PCI используется внутренняя шина.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от i-rinat

pthread_setaffinity_np()/sched_setaffinity()

Мы закинули поток на отдельное ядро. Осталось выкинуть с этого ядра все остальное.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

У ядер общий кеш, общая шина данных, так что Linux всё равно испортит тебе всю реалтаймовость. Да и вообще жёсткий RT на x86 сделать нельзя. Тут и SMM есть, который может вносить совершенно рандомные задержки, которые даже обнаружить проблематично. И недокументированный микрокод, и сложная система кешей, конвееров и предсказания ветвлений, которые не позволяют даже предполагать сколько тактов займёт каждая инструкция. В общем, x86 это для того чтобы окошки рисовать. Ну или для мягкого риалтайма типа воспроизведения звука (у звуковой карты есть буфер, так что не обязательно точно угадывать, когда отправить следующий блок данных).

Если тебе не хватает быстродействия микроконтроллеров, учи FPGA.

KivApple ★★★★★
()
Ответ на: комментарий от cvs-255

Что будет если поставить приоритет для задачи realtime? Разве она не вытеснит всё остальное с этого ядра? Обработку прерываний или исключений в любом случае придётся оставить, смирись.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Да и вообще жёсткий RT на x86 сделать нельзя.

я более с прицелом на многоядерные ARM интересуюсь.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от KivApple

И тут случится повышенная нагрузка на кэш ввода вывода, и ядро решит, что его обработка важнее.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Вроде как в Linux процессы ядра тоже имеют приоритет и участвуют в диспетчеризации. Соответственно, их можно вытеснить. Чтобы внешние прерывания всегда шли на одно ядро скорее всего тоже можно реализовать, либо в крайнем случае пропатчить ядро. Останутся только исключения, но ими можно не пользоваться (просто отключи подкачку и не дели на ноль). Зато в качестве плюшки останется возможность связи с другими процессами через всякие пайпы.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Тут и SMM есть, который может вносить совершенно рандомные задержки, которые даже обнаружить проблематично.

Он не везде есть, а где есть, то через MSR можно отключить. Правда, лучше взять такую мат.плату, где SMM не используется.

mv ★★★★★
()

Память выделить можно: memmap=, mem=, hotplug-память в статусе offline... С процессора всё линуксовое скинуть нельзя, всякие per-core queue и RCU будет ломаться, но в последних ядрах хотя бы RCU можно убрать. В принципе, если помучаться, то что-то толковое получить можно, с неплохим средним лейтенси, но лучше отдельный сопроцессор и/или FPGA.

mv ★★★★★
()

Попробуй просто поставить высокий приоритет. Командой

nice
к примеру.

rezedent12 ☆☆☆
()
Ответ на: комментарий от cvs-255

А в чем отличие такого?

В том, что он не под управлением Линукса. Конечно, не подойдёт, если с ним надо много и быстро общаться, тут задержки шины всё съедят.

mv ★★★★★
()
Ответ на: комментарий от KivApple

Что будет если поставить приоритет для задачи realtime? Разве она не вытеснит всё остальное с этого ядра? Обработку прерываний или исключений в любом случае придётся оставить, смирись.

Обработкчики прерываний можно смигрировать через /proc/irq/NN/smp_affinity. Realtime-таски, жадные до процессора, могут и будут оставлять обычные таски без процессора, если подкрутить kernel.sched_rt_period_us и kernel.sched_rt_runtime_us. В конце-концов, их шедуллер перебросит на другие ядра.

Основная проблема в тех тасках, которые прибиты на это ядро и не могут быть перенесены на другие ядра. Ну и всякие IPI могут поломаться. Но если всё, что можно, раскидать по другим ядрам и в своём таске время от времени отдавать процессор системе, то работать будет.

mv ★★★★★
()

так можно cgroup сделать с биндингом к cpu. на одно ядро - систему и все-все-все, на другое - только твоя софтина.

TOXA ★★
()
Ответ на: комментарий от cvs-255

если в конфигурации одно ядро под linux, другое под что-то другое - тут только виртуализация поможет.

TOXA ★★
()
Ответ на: комментарий от TOXA

почему же? У каждого ядра свой набор регистров, так что одно может быть в 64 bit long mode, а другое в real mode, например. И на каждом будет работать свой код, главное, чтобы по памяти пересечения не было

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от mv

лучше взять такую мат.плату, где SMM не используется.

Есть простые способы определить использование SMM для конкретной машины?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Есть простые способы определить использование SMM для конкретной машины?

Прочитать MSR, в котором количество обработанных SMI содержится. Номер регистра не помню, и он зависит от микроархитектуры (есть в «Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes: 1, 2A, 2B, 3A and 3B»).

mv ★★★★★
()
Ответ на: комментарий от mv

сказать линуксу не использовать это ядро. И самому запустить на нем то, что надо. Вопрос лишь в том, насколько ядро допускает это штатными средствами

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

в части плат есть возможность прочитать smm

Там, же где не прочитать - он точно используется.

Там, где при старте в биосе работает usb клавиатура - он используется. Как на матплатах с efi не знаю, может там без smm реализовано.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 2)
Ответ на: комментарий от cvs-255

сказать линуксу не использовать это ядро. И самому запустить на нем то, что надо. Вопрос лишь в том, насколько ядро допускает это штатными средствами

Вот интересует как раз этот вопрос. Операционной системы у вас там не будет. Вообще. И код из операционной системы туда штатно не переместить.

mv ★★★★★
()

можно ж ядру передать maxcpus=<n>
taskset'ом для всех процессов поменяй маску, irqbalance для прерываний, но эт не то, наверн

ii343hbka ★★★
()

Посмотри на seL4. Оно не умеет в SMP, а умеет грузить по экземпляру микроядра каждое со своим root-task на ядро процессора, делит память пополам, с возможностью выделить расшаренную область. При этом доступ к железу через IOMMU имеет и прерывания обрабатывает только boot-ядро. На нём можешь пустить паравиртуализованный linux, а на втором ядре свою задачу.

kike
()
Ответ на: комментарий от kike

Но наверное делать как в статье на хабре лучше. С паравиртуализациями и микроядрами слишком много возни.

kike
()
Ответ на: комментарий от cvs-255

Память то доступна из обоих ядер

Ну вот покажи, как ты средствами Линукса переносишь твою программу на ядро, не существующее для Линукса? Покажи, как этот маленький, но очень важный момент собрался делать?

mv ★★★★★
()
Ответ на: комментарий от mv

Вот как раз я и спрашиваю, есть ли штатные средства, или нужно немножко C?

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Уже ответили, а я как раз замахнулся писать о всяких bare metal гипервизоров, что по сути и есть то чо тебе надоть...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от KivApple

Память тоже можно изолировать, правда не совсем штатными средствами. 1. Грузить ядро со спецпараметрами, чтобы видна была часть памяти 2. Использовать специальные ядреные модули для доступа по аппаратным адресам из свое приложения.

Такой подход, например, применяется в некоторых ti платах. С голой памятью там работают аудио/видео кодеки.

Reset ★★★★★
()

Вроде как вот так можно запретить обработку прерываний на более чем одном ядре:

echo -n 1 > /proc/irq/*/smp_affinity

Если это поможет хоть как-то.

sbar
()
16 октября 2015 г.

linux-rt именно об этом

anonymous
()

Царя уже звали?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.