【发布时间】:2013-07-01 15:55:49
【问题描述】:
我正在尝试在运行 mako 内核的 Nexus 4 上的所有 CPU 上设置性能监视器用户模式启用寄存器。
现在我正在一个可加载模块中设置寄存器:
void enable_registers(void* info)
{
unsigned int set = 1;
/* enable user-mode access to the performance counter*/
asm volatile ("mcr p15, 0, %0, c9, c14, 0\n\t" : : "r" (set));
}
int init_module(void)
{
online = num_online_cpus();
possible = num_possible_cpus();
present = num_present_cpus();
printk (KERN_INFO "Online Cpus=%d\nPossible Cpus=%d\nPresent Cpus=%d\n", online, possible, present);
on_each_cpu(enable_registers , NULL, 1);
return 0;
}
问题在于 on_each_cpu 只在 Online cpus 上运行该函数,如 printk 语句所示:
Online Cpus=1
Possible Cpus=4
Present Cpus=4
当我调用 on_each_cpu 时,四个中只有一个在线。所以我的问题是,我如何强制一个cpu在线,或者如何强制某个cpu执行代码? 谢谢
【问题讨论】:
-
您应该从“多线程编程”或称为“并发”开始,具体取决于您的目标,但核心始终相同,在 Android 下,您可以使用 posix 线程库来完成所有工作低级例程,就像任何其他 GNU/Linux 发行版一样。
-
"所以我的问题是,如何强制某个cpu在线,或者如何强制某个cpu执行代码?" -- 我不知道这是可能的,因为芯片组可以并且会在它认为合适的时候关闭内核。
标签: android linux linux-kernel multicore cpu-registers