2010-06-13 4 views
0

В Windows я могу настроить близость процессора к коду драйвера с помощью KeSetSystemAffinityThread и проверить, какой процессор работает над моим кодом, используя KeGetCurrentProcessorNumber.Настройки настройки процессора для модулей ядра Linux?

Я пытаюсь сделать что-то подобное в модуле ядра Linux, но единственные вызовы сродства, которые я вижу, относятся к процессам пользовательской области. Есть ли способ сделать это, чтобы я мог запускать код сборки на конкретном процессоре? (Т.е. СГДТ)

Edit:

Я думаю, что я понял, как получить текущий процессор. smp_processor_id() кажется, что он должен работать.

ответ

3

Думаю, вам, вероятно, придется изменить ядро, но это изменение не слишком грубо. Просто экспортировать sched_setaffinity в sched.c к модулям:

long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) 
    { 
    ... 
    } 
+ EXPORT_SYMBOL_GPL(sched_setaffinity); // Exported, now callable from your code. 
+0

Я видел это раньше и предполагал, что он предназначен только для пользовательских процессов, однако, если я установил аргумент pid равным 0, он действительно работает. Мне удалось сделать это, не перекомпилировав ядро ​​с помощью указателя на функцию и просмотрев sched_setaffinity в /boot/System.map, просто для его проверки. long (* extern_sched_setaffinity) (pid_t pid, const struct cpumask * in_mask) = (void *) 0xffffffff81066a70; в моей системе. Спасибо. –

+3

Это вряд ли будет хорошей идеей, если вы просто не устанавливаете близость потока ядра, созданного специально вашим драйвером. В противном случае код драйвера может выполняться в контексте многих разных процессов в разное время, каждый из которых имеет свою собственную * близость планировщика. Если вы просто хотите выполнить короткий раздел кода, не будучи отброшенным на другой ЦП, вы можете использовать 'preempt_disable()' и 'preempt_enable()' для создания критического раздела с отключением преемственности. – caf

+0

@caf: Я предположил, что вы описали это, потому что он говорит «мой код». Хороший совет в любом случае. –

1

smp_processor_id() должен вам сказать, что логический процессор вы работаете на.

Некоторые архитектуры также поддерживают функцию ядра smp_call_function_single, которая будет использовать межпроцессорное прерывание для запуска функции на другом процессоре.

 Смежные вопросы

  • Нет связанных вопросов^_^