2

I am learning to write an OS, and was trying to update GDT in kernel code, therefore i defined some structs in C

typedef unsigned int   u32;
typedef          int   s32;
typedef unsigned short u16;
typedef          short s16;
typedef unsigned char  u8;
typedef          char  s8;

typedef struct{
    u16 low_limit;
    u16 low_base;
    u8 mid_base;
    u8 type; // access type
    u8 flags; // high 4 bits(flags) low 4 bits (limit 4 last bits)
    u8 high_base;
} __attribute__((packed)) gdt_gate_t;

typedef struct{
    u16 limit;
    u32 base;
}__attribute__((packed)) gdt_register_t;

typedef struct{
    u8 RPL : 2; // Request Privilege Level
    u8 TI : 1; // Table Indicator (GDT or LDT)
    u16 index : 13;
}__attribute__((packed)) gdt_selector_t;

gdt_gate_t gdt[128];
gdt_register_t gdt_reg;

As you can see, i am aming to create GDT with 128 entries.

After i initialized GDT entries, i told gdt_reg where is the base of the new GDT and it's limit using

gdt_reg.base = (u32)&gdt;
gdt_reg.limit = sizeof(gdt) - 1;
__asm__ __volatile__("lgdt (%0)" : : "r"(&gdt_reg));

In my environment, memory address of variable gdt beginns at 0x00004820, so the value stored in gdt_reg.base should be as expected 0x00004820. But actually in the memory, the value is 00 00 20 48(little endian), then the regester gdtr has value 48200000(3ff), which means the gdtr points to an illegal address.

So the question is, why the value of gdt_reg.base was reversed. Many thanks for any help

hfie A
  • 21
  • 2
  • 1
    instead of weird `u32` typedef-ed non portable way, I would use the standard `uint32_t` – 0___________ Oct 06 '22 at 13:55
  • `typedef char s8;` This bug is exactly why we don't make our own rotten non-standard types. Use `stdint.h`. – Lundin Oct 06 '22 at 14:04
  • Thank you all for the help. But that is not the reason. The reason is that the compiler didn't recognized `__attribute__((packed))`, so the memory for struct `gdt_register_t` is aligned, which turns out `u16 limit` occupys 4 bytes in the memory. – hfie A Oct 07 '22 at 17:48

0 Answers0