Чтобы дать вам полный контекст, мое обсуждение началось с наблюдения за тем, что я запускаю SMP linux (3.0.1-rt11) на ARM-коре Основанный на A8 SoC, который является однопроцессорным. Мне было интересно узнать, будет ли какое-либо преимущество в производительности, отключив поддержку SMP. И если да, какое влияние это окажет на мои драйверы и обработчики прерываний.Понимание связи между CONFIG_SMP, Spinlocks и CONFIG_PREEMPT в последнем (3.0.0 и выше) ядре Linux
Я прочитал несколько разных разделов: прядильные блоки и ядро. Я немного поработал в поисковых системах и читал, но на этот раз все, что у меня есть, - это несколько устаревших и противоречивых ответов. Поэтому я подумал, что позвольте мне попробовать stackoverflow.
Происхождение моих сомнений/вопросов этот пункт из драйверов устройств Linux третьей главы издания 5:
Спина-блокировка, по своей природе, предназначенной для использования на многопроцессорных системах хотя однопроцессорная рабочая станция с prefixive , как и SMP,. Если бы невосприимчивая однопроцессорная системавошла во вращение на замке, то она закрутилась бы навсегда; никакая другая нить никогда не сможет получить CPU , чтобы освободить замок. По этой причине операции спин-блокировки на однопроцессорных системах без предварительного включения оптимизированы, чтобы сделать ничего, за исключением тех, которые изменяют маскирование IRQ . Из-за предохранения, даже если вы никогда не ожидаете, что ваш код будет запущен в системе SMP, , вам все равно необходимо реализовать правильную блокировку.
Мои сомнения/вопросы:
а) Является ли Linux ядро Преимущественное в пространстве ядра по умолчанию? Если да, является ли это ограничение преимуществом только процессами или обработчиками прерываний также могут быть вытеснены?
b) Поддерживает ли ядро Linux (на ARM) вложенное прерывание? Если да, будет ли каждый обработчик прерывания (верхняя половина) иметь собственный стек или они будут использовать один и тот же стек режима ядра 4k/8k?
c) Если отключить SMP (Config_SMP) и preemption (Config_preempt), будут ли прядильные блокировки в моих драйверах и обработчиках прерываний иметь какой-то смысл?
d) Как прерывания дескриптора ядра возникают при выполнении верхней половины i.e будут ли они отключены или замаскированы?
Через некоторое Googling я нашел это:
Для ядер, собранных без CONFIG_SMP и без CONFIG_PREEMPT спин-блокировки не существует. Это отличное дизайнерское решение: , когда никто другой не может работать одновременно, нет причин для блокировки .
Если ядро компилируется без CONFIG_SMP, но CONFIG_PREEMPT является множества, то Взаимные блокировки просто отключить упреждение, что является достаточным для предотвращения любых гонок. Для большинства целей мы можем думать о преимуществе как , эквивалентном SMP, и не беспокоиться об этом отдельно.
Но нет версии ядра или датой на source.Может ли кто-нибудь подтвердить, что он все еще действителен для последних ядер Linux?
Это четыре вопроса, поэтому разделите их так, как они могут не ответить вместе. –