我创建了一个简单的 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