(примечание редактора: AFAICT не регистрирует никаких обратных вызовов или API-интерфейсов пользовательского пространства или любого другого способа запуска своего кода из чего-либо, кроме процесса начальной загрузки. Когда в этом вопросе говорится о «работающих модулях», я думаю, что это означает функции инициализации и выхода.)
Контекст: я знаю, что в ядре счетчики обычно защищаются атомарными операциями. Однако, поскольку мои знания о блокировках и связанных с ними темах недостаточны, я решил копнуть глубже, а не просто делать то, что мне сказали.
Вот что я исследовал:
- Ядро Linux (это) работает в многоядерной среде;
- Этот пример модуля не является многопоточным;
- Однако планировщик может переключить текущий ЦП для выполнения других задач, а затем назначить другой ЦП для продолжения выполнения этой задачи (модуль ядра);
В псевдосборке и в порядке временной метки:
Код: Выделить всё
thread 1 thread 2
mov rax, [memory_of_counter]
inc rax
(CPU context switches)
mov rax, [memory_of_counter]
inc rax
mov [memory_of_counter], rax
mov [memory_of_counter], rax
Однако я НЕ думаю, что это относится к этому модулю ядра. AFAIK, он не запускается одновременно (если только по умолчанию все модули ядра Linux не запускаются одновременно, но я не нашел ссылки на это), поэтому, когда происходит переключение контекста, следующий процессор продолжит выполнять следующую инструкцию:
Код: Выделить всё
CPU 1 CPU 2
mov rax, [memory_of_counter]
inc rax
(CPU context switches)
mov [memory_of_counter], rax
Подробнее здесь: https://stackoverflow.com/questions/798 ... module-whi
Мобильная версия