В Windows я могу настроить близость процессора к коду драйвера с помощью KeSetSystemAffinityThread и проверить, какой процессор работает над моим кодом, используя KeGetCurrentProcessorNumber.Настройки настройки процессора для модулей ядра Linux?
Я пытаюсь сделать что-то подобное в модуле ядра Linux, но единственные вызовы сродства, которые я вижу, относятся к процессам пользовательской области. Есть ли способ сделать это, чтобы я мог запускать код сборки на конкретном процессоре? (Т.е. СГДТ)
Edit:
Я думаю, что я понял, как получить текущий процессор. smp_processor_id() кажется, что он должен работать.
Я видел это раньше и предполагал, что он предназначен только для пользовательских процессов, однако, если я установил аргумент pid равным 0, он действительно работает. Мне удалось сделать это, не перекомпилировав ядро с помощью указателя на функцию и просмотрев sched_setaffinity в /boot/System.map, просто для его проверки. long (* extern_sched_setaffinity) (pid_t pid, const struct cpumask * in_mask) = (void *) 0xffffffff81066a70; в моей системе. Спасибо. –
Это вряд ли будет хорошей идеей, если вы просто не устанавливаете близость потока ядра, созданного специально вашим драйвером. В противном случае код драйвера может выполняться в контексте многих разных процессов в разное время, каждый из которых имеет свою собственную * близость планировщика. Если вы просто хотите выполнить короткий раздел кода, не будучи отброшенным на другой ЦП, вы можете использовать 'preempt_disable()' и 'preempt_enable()' для создания критического раздела с отключением преемственности. – caf
@caf: Я предположил, что вы описали это, потому что он говорит «мой код». Хороший совет в любом случае. –