Мне нужно создать модуль ядра, который позволяет использовать счетчики ARM PMU на каждом ядре на компьютере. У меня проблемы с настройкой cpu. Ive попробовал sched_get_affinity
, но, видимо, он работает только для процессов пользовательского пространства. Мой код ниже. Есть идеи?Установить привязку cpu на загружаемом модуле ядра Linux
#define _GNU_SOURCE
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void){
unsigned reg;
/* enable user-mode access to the performance counters*/
asm volatile("MRC p15, 0, %0, C9, C14, 0\n\t" : "=r"(reg));
reg |= 1;
asm volatile("MCR p15, 0, %0, C9, C14, 0\n\t" :: "r"(reg));
printk(KERN_INFO "User mode Performance Counters are enabled.\n",reg);
return 0;
}
void cleanup_module(void){
unsigned reg;
/* disable user-mode access to the performance counters*/
asm volatile("MRC p15, 0, %0, C9, C14, 0\n\t" : "=r"(reg));
reg &= (~0 << 1);
asm volatile("MCR p15, 0, %0, C9, C14, 0\n\t" :: "r"(reg));
printk(KERN_INFO "User mode Performance Counters are disabled.\n");
}
'for_each_cpu», хотя, только индексирует процессоры, а это означает, что для каждого цикла, инструкции, которые я использую, будет использоваться на ядре по умолчанию, который используется в настоящее время. i.e i дважды включит счетчики на сердечнике 0. Если я не включу его на обоих ядрах, тогда, когда я пытаюсь использовать другие инструкции в отношении счетчиков производительности, есть вероятность, что я получу «ошибку незаконной инструкции», если инструкции перейдут на другое ядро, где счетчики не включен. –
ОК, я вижу, похоже, что это начало on_each_cpu (_mask) в начале и что-то от сотрудников hotplug для каждого процессора, выходящего онлайн. – user4536444
для каждого процессора становится онлайн, извините ну, правило 34: [Как запустить код на каждом CPU] (http://stackoverflow.com/questions/17456812/how-to-run-code-on-every-cpu) – user4536444