Из пользовательского пространства мы можем использовать cpuset для фактического изолировать конкретное ядро в нашей системе и выполнить только один конкретный процесс для этого ядра.
Я пытаюсь сделать то же самое с модулем ядра. Поэтому я хочу, чтобы модуль выполнялся в изолированном ядре. Другими словами: Как использовать cpuset
изнутри модуля ядра? *
Использование linux/cpuset.h в моем модуле ядра не работает. Итак, у меня есть такой модуль:
#include <linux/module.h>
#include <linux/cpuset.h>
...
#ifdef CONFIG_CPUSETS
printk(KERN_INFO, "cpusets is enabled!");
#endif
cpuset_init(); // this function is declared in cpuset.h
...
При попытке загрузить этот модуль я получаю (в dmesg
) следующее сообщение cpusets is enabled!
. Но я также получаю сообщение Unknown symbol cpu_init (err 0)
.
Аналогично, я попытался использовать sched_setaffinity
из linux/sched.h
, чтобы переместить все запущенные procceses в определенное ядро, а затем запустить мой модуль в изолированное ядро. Я получил ту же ошибку: Unknown symbol sched_setaffinity (err 0)
. Наверное, у меня есть "неизвестные символы", потому что эти функции не имеют EXPORT_SYMBOL
в ядре. Поэтому я пошел и попытался вызвать системный вызов sys_sched_setaffinity
(на основе этого question), но снова получил это сообщение: Unknown symbol sys_sched_setaffinity (err 0)
!
Кроме того, я не ищу решение, которое использует isolcpus
, который устанавливается при загрузке. Я хотел бы просто загрузить модуль, а потом изолировать.
- (Точнее, я хочу, чтобы его потоки ядра выполнялись в ядрах изолированных. Я знаю, что я могу использовать аффинность для привязки потоков к конкретным ядрам, но это не гарантирует мне, что ядра идут быть изолированным другими процессами, запущенными на них.)