1

I have some doubt regarding GDT in linux. I try to get GDT info in kernel space (Ring0), and my test code called in system call context. In the test code, I try to print ss register (Segment Selector), and get ss segment descriptor by GDTR and ss-segment-selector.

 77 void printGDTInfo(void) {
 78         struct desc_ptr pgdt, *pss_desc;
 79         unsigned long ssr;
 80         struct desc_struct *ss_desc;
 81 
 82         // Get GDTR
 83         native_store_gdt(&pgdt);
 84         unsigned long gdt_addr = pgdt.address;
 85         unsigned long gdt_size = pgdt.size;
 86         printk("[GDT] Addr:%lu |Size:%lu\n", gdt_addr, gdt_size);
 87 
 88         // Get SS Register
 89         asm("mov %%ss, %%eax"
 90                 :"=a"(ssr));
 91         printk("SSR In Kernel:%lu\n", ssr);
 92         unsigned long desc_index = ssr >> 3;    // SHIFT for Descriptor Index
 93         printk("SSR Shift:%lu\n", desc_index);
 94         ss_desc = (struct desc_struct*)(gdt_addr + desc_index * sizeof(struct desc_struct));
 95         printk("SSR:Base0:%lu, Base1:%lu,Base2:%lu\n", ss_desc->base0, ss_desc->base1, ss_desc->base2);
 96 }

What confused me most is the "base" fields in ss-descriptor are all zero (line95 print). I try to print __USER_DS segment descriptor, the "base" fields are also zero.

Is that true? All the segment in Linux use same Base Address(zero)? I want to check the GDT initialization in Linux Source Code but I am not sure where and when Linux setup GDT?

I find codes in "arch/x86/kernel/cpu/common.c"like this, the second parameter(zero) of GDT_ENTRY_INIT is zero, which means the base0/base1/base2 fields in segment descriptor are all zero.

 125         [GDT_ENTRY_KERNEL32_CS]         = GDT_ENTRY_INIT(0xc09b, 0, 0xfffff),
 126         [GDT_ENTRY_KERNEL_CS]           = GDT_ENTRY_INIT(0xa09b, 0, 0xfffff),
 127         [GDT_ENTRY_KERNEL_DS]           = GDT_ENTRY_INIT(0xc093, 0, 0xfffff),

If that is true, all the segment has same base address(zero). As a result, same virtual address in Ring0 and Ring1 will mapping to the same linear address?

I am appreciate for your help :)

wywan
  • 11
  • 2

0 Answers0