首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CR4中设置TSD位会导致崩溃

在CR4中设置TSD位会导致崩溃
EN

Stack Overflow用户
提问于 2015-03-02 17:30:24
回答 1查看 378关注 0票数 0

我希望限制rdtsc指令的使用,使其只能在环0中执行。根据Intel手册,这可以通过设置CR4.TSD来实现,这是由以下内核模块完成的:

代码语言:javascript
复制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");

#define TSD_BIT 2

static inline uint64_t getcr4(void) {
    register uint64_t ret = 0;

    asm volatile (
        "movq %%cr4, %0\n"
        :"=r"(ret)
    );

    return ret;
}

static inline void setcr4(register uint64_t val) {
    asm volatile (
        "movq %0, %%cr4\n"
        :
        :"r"(val)
    );
}

static void settsd(void* info) {
    uint64_t cr4 = getcr4();

    cr4 |= (1 << TSD_BIT);
    setcr4(cr4);
}

static void cleartsd(void* info) {
    uint64_t cr4 = getcr4();

    cr4 &= ~(1 << TSD_BIT);
    setcr4(cr4);
}

static int __init init_routine(void) {
    on_each_cpu(settsd, NULL, 0);
    printk(KERN_INFO "CR4.TSD set: %u!\n", (int)(getcr4() >> TSD_BIT) & 1);

    return 0;
}

static void __exit exit_routine(void) {
    on_each_cpu(cleartsd, NULL, 0);
    printk(KERN_INFO "CR4.TSD cleared: %u!\n", (int)(getcr4() >> TSD_BIT) & 1);
}

module_init(init_routine);
module_exit(exit_routine);

但是,加载这个模块会立即使操作系统崩溃。有什么办法可以避免吗?

OS信息:

代码语言:javascript
复制
$ uname -r | cat /etc/debian_version -
7.8
3.2.0-4-amd64
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-02 20:22:52

首先,您的方式是与机器上运行的其他线程进行竞争。我建议您看一下arch/x86/kernel/process.c中的代码,如何或多或少地以正确的方式做到这一点。

检查宏SET_TSC_CTL(),系统调用prctl以及。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28815929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档