我想测试monitor / mwait是否在内核中工作。所以我创建了一个模块,其中启动了两个任务,task2将调用monitor / mwait来休眠。 Task1修改武装地址以唤醒task2。但代码似乎不起作用。 mwait就像NOP一样。我使用cpu_has函数检查monitor / mwait的可用性,我的处理器确实支持它。
你能给我一些关于如何在内核空间中使用monitor / mwait的提示或示例代码吗?
#include <linux/module.h>
#include <asm/mwait.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <asm/desc.h>
#include <linux/kthread.h>
/* global varaible */
char msg[200];
struct task_struct *task1;
struct task_struct *task2;
unsigned int addr = 0;
/* print message to console */
int write_console (char *str)
{
struct tty_struct *my_tty;
if((my_tty=current->signal->tty) != NULL)
{
((my_tty->driver->ops->write) (my_tty,str,strlen(str)));
return 0;
}
else return -1;
}
int thread_func1(void *data)
{
msleep(5000);
addr = 1;
while(!kthread_should_stop()){
schedule();
}
return 0;
}
int thread_func2(void *data)
{
while(addr == 0){
clflush(&addr);
__monitor(&addr, 0, 0);
if(addr == 0){
__mwait(0,0);
printk(KERN_INFO "wake up\n");
}
}
while(!kthread_should_stop()){
schedule();
}
return 0;
}
int __init my_test_init(void){
struct cpuinfo_x86 *c = &boot_cpu_data;
write_console("enter module\r\n");
if (cpu_has(c, X86_FEATURE_MWAIT)) {
write_console("monitor/mwait supported\r\n");
}
task1 = kthread_create(&thread_func1, NULL, "thread_func1");
task2 = kthread_create(&thread_func2, NULL, "thread_func2");
if(task1){ wake_up_process(task1); }
if(task2){ wake_up_process(task2); }
return 0;
}
void __exit my_test_exit(void){
kthread_stop(task1);
kthread_stop(task2);
write_console("leave \r\n");
}
module_init(my_test_init);
module_exit(my_test_exit);
MODULE_LICENSE("GPL");