Из пользовательского пространства мы можем использовать 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, который устанавливается при загрузке. Я хотел бы просто загрузить модуль, а потом изолировать.
- (Точнее, я хочу, чтобы его потоки ядра выполнялись в ядрах изолированных. Я знаю, что я могу использовать аффинность для привязки потоков к конкретным ядрам, но это не гарантирует мне, что ядра идут быть изолированным другими процессами, запущенными на них.)