为什么英特尔 x64 处理器中 GDT(全局描述符表)的基址不同?

逆向工程 内核模式 分割 英特尔
2021-06-27 23:12:06

我创建了一个简单的 linux 内核模块来获取 GDT 表的基地址:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/const.h>
#include <linux/errno.h>

// try changing segment selector to  null 3.4.2
// try swapg in 64 bit 3.4.4


static inline uint64_t get_gdt_base1(void)
{
    struct desc_ptr gdt;
    __asm__ __volatile__("sgdt %[gdt]"
                 : /* output */ [gdt]"=m"(gdt));
    return gdt.address;
}


int __init start_init(void)
{

    uint64_t gdt_base = get_gdt_base1();
    printk(KERN_INFO "Address of gdt is %llx\n", (long long)gdt_base);
}

static void __exit end_exit(void)
{
    printk(KERN_INFO "Unloading the driver\n");
    return;
}

module_init(start_init);
module_exit(end_exit);


MODULE_LICENSE("GPL V3");
MODULE_AUTHOR("Shubham Dubey");
MODULE_DESCRIPTION("CRO register ");


当我加载和卸载模块几次时。是我得到的输出如下:
第1轮:Address of gdt is ffff88024f249000
第二次运行:Address of gdt is ffff88024f2c9000
第三个运行:Address of gdt is ffff88024f249000
4运行:Address of gdt is ffff88024f2c9000
...
...

从技术上讲,GDT 基数应该是恒定的。但我收到两个不同的地址,这不是正常行为。任何人都可以对此有一个很好的解释吗?

PS:在 64 位英特尔处理器中运行 debian

1个回答

Linux GDT 上的 IIRC 对于每个处理器都是独立的,因此您可能会看到不同处理器的地址。