SilverRainZ / OS67

An unix-like toy kernel
GNU General Public License v3.0
723 stars 124 forks source link

gdt初始化问题(gdt initialization problem) #30

Closed colorglass closed 1 year ago

colorglass commented 2 years ago

最近参考了本项目一些部分来构建自己的操作系统,但是发现在gdt的初始化有问题。如下是 /kern/gdt.c:gdt_init() 中的内容:

    /* null descriptor */
    gdt_install(0, 0, 0, 0, 0);  
    /* kernel code segment type: code addr: 0 limit: 4G gran: 4KB sz: 32bit */
    gdt_install(SEL_KCODE, 0, 0xfffff, AC_RW|AC_EX|AC_DPL_KERN|AC_PR, GDT_GR|GDT_SZ);
    /* kernel data segment type: data addr: 0 limit: 4G gran: 4KB sz: bit 32bit */
    gdt_install(SEL_KDATA, 0, 0xfffff, AC_RW|AC_DPL_KERN|AC_PR, GDT_GR|GDT_SZ); 
    /* user code segment type: code addr: 0 limit: 4G gran: 4KB sz: 32bit */
    gdt_install(SEL_UCODE, 0, 0xfffff, AC_RW|AC_EX|AC_DPL_USER|AC_PR, GDT_GR|GDT_SZ); 
    /* user code segment type: data addr: 0 limit: 4G gran: 4KB sz: 32bit */
    gdt_install(SEL_UDATA, 0, 0xfffff, AC_RW|AC_DPL_USER|AC_PR, GDT_GR|GDT_SZ); 

这4个段描述符都没有设置 S 位,其对应的都是属于系统段,而非代码段或数据段。 个人的系统在采用该初始化程序初始化gdt后,后续的初始化失败,直接重置到0x7c00。将其设置 S 位后,系统正常运行。如下:

/* null descriptor */
    gdt_install(0, 0, 0, 0, 0);  
    /* kernel code segment type: code addr: 0 limit: 4G gran: 4KB sz: 32bit */
    gdt_install(SEL_KCODE, 0, 0xfffff, AC_RW|AC_EX|AC_DPL_KERN|AC_PR|**AC_RE**, GDT_GR|GDT_SZ);
    /* kernel data segment type: data addr: 0 limit: 4G gran: 4KB sz: bit 32bit */
    gdt_install(SEL_KDATA, 0, 0xfffff, AC_RW|AC_DPL_KERN|AC_PR|**AC_RE**, GDT_GR|GDT_SZ); 
    /* user code segment type: code addr: 0 limit: 4G gran: 4KB sz: 32bit */
    gdt_install(SEL_UCODE, 0, 0xfffff, AC_RW|AC_EX|AC_DPL_USER|AC_PR|**AC_RE**, GDT_GR|GDT_SZ); 
    /* user code segment type: data addr: 0 limit: 4G gran: 4KB sz: 32bit */
    gdt_install(SEL_UDATA, 0, 0xfffff, AC_RW|AC_DPL_USER|AC_PR|**AC_RE**, GDT_GR|GDT_SZ); 
SilverRainZ commented 1 year ago

可有相关参考链接?

如果你愿意贡献一个 pull request 来修正这个问题就好了 :D

colorglass commented 1 year ago

抱歉,在参考时遗漏的部分代码,现在回过头来审视发现是自己搞错了。X (