如何在linux上使用gcc汇编在x86-64中设置控制寄存器0(cr0)位

san*_*ana 8 linux gcc x86-64 inline-assembly

我使用以下代码将cr0位设置为禁用缓存.当我编译这个

#include <stdio.h>

int main()
{
        __asm__("pushl  %eax\n\t"
                "mov    %cr0,%eax;\n\t"
                "orl    $(1 << 30),%eax;\n\t"
                "mov    %eax,%cr0;\n\t"
                "wbinvd\n\t"
                "popl   %eax"
);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误说操作数对mov无效.

谁能指点我做一个好的gcc x86-64指南来做这些事情?以上代码究竟出了什么问题呢?

san*_*ana 8

好的,最后我写了以下内核模块.我不确定它是否正确,因为我没有观察到禁用缓存时应该伴随的急剧减速.但是这会正确编译和插入.

任何指针都会有所帮助.

谢谢!

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
        printk(KERN_ALERT "Hello, world\n");
        __asm__("push   %rax\n\t"
                "mov    %cr0,%rax;\n\t"
                "or     $(1 << 30),%rax;\n\t"
                "mov    %rax,%cr0;\n\t"
                "wbinvd\n\t"
                "pop    %rax"
);
        return 0;
}
static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
        __asm__("push   %rax\n\t"
                "mov    %cr0,%rax;\n\t"
                "and     $~(1 << 30),%rax;\n\t"
                "mov    %rax,%cr0;\n\t"
                "wbinvd\n\t"
                "pop    %rax"
);
}
module_init(hello_init);
module_exit(hello_exit);
Run Code Online (Sandbox Code Playgroud)