2015-03-02 20 views
0

我想限制rdtsc指令的使用,使其只能在環0中執行。根據英特爾手冊,可以通過設置CR4.TSD來完成這項工作。以下內核模塊: 設置CR4中的TSD位導致崩潰

#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信息:

所有的
$ uname -r | cat /etc/debian_version - 
7.8 
3.2.0-4-amd64 
+0

也許還有其他部分的操作系統(內核/庫/守護進程)依賴於能夠使用'rdtsc' ... – twalberg 2015-03-02 21:00:31

回答

0

首先,你的方法是種族與計算機上運行的其他線程。我建議看看arch/x86/kernel/process.c中的代碼,或多或少地以適當的方式做到這一點。

檢查宏SET_TSC_CTL(),系統調用prctl以及。