Monitor / Mwait无法在内核空间中工作

时间:2014-10-12 16:47:28

标签: kernel

我想测试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");

0 个答案:

没有答案