X86 英特尔32位保护模式启用分页导致三重故障

X86 英特尔32位保护模式启用分页导致三重故障,x86,kernel,paging,intel,protected-mode,X86,Kernel,Paging,Intel,Protected Mode,我在一个业余操作系统上工作,在身份映射和启用分页方面遇到了问题。我正在使用Bochs emulator,出现以下错误消息:= 0069129962E[CPU0]中断():门描述符不是有效的sys seg(向量=0x0e) 0069129962E[CPU0]中断():门描述符不是有效的sys seg(向量=0x08) 00691299602i[CPU0]CPU处于保护模式(活动) 00691299602i[CPU0]CS.d_b=32位 00691299602i[CPU0]SS.d_b=32位 0

我在一个业余操作系统上工作,在身份映射和启用分页方面遇到了问题。我正在使用Bochs emulator,出现以下错误消息:=

0069129962E[CPU0]中断():门描述符不是有效的sys seg(向量=0x0e)

0069129962E[CPU0]中断():门描述符不是有效的sys seg(向量=0x08)

00691299602i[CPU0]CPU处于保护模式(活动)

00691299602i[CPU0]CS.d_b=32位

00691299602i[CPU0]SS.d_b=32位

00691299602i[CPU0]| EAX=e0000011 EBX=00000209 ECX=00000f9f EDX=00000f9f

00691299602i[CPU0]| ESP=0000ff5c EBP=00000001 ESI=00000209 EDI=0001d000

0069129962i[CPU0]| IOPL=0 id vip vif ac vm RF nt df如果tf SF zf af PF cf

00691299602i[CPU0]| SEG选择器基本限位G D

00691299602i[CPU0]| SEG sltr(指数| ti | rpl)基准极限G D

00691299602i[CPU0]| CS:0008(0001 | 0 | 0)00000000 FFFFFFFF11

00691299602i[CPU0]| DS:0018(0003 | 0 | 0)00000000 FFFFFF1 1

00691299602i[CPU0]| SS:0018(0003 | 0 | 0)00000000 FFFFFFFF11

00691299602i[CPU0]| ES:0018(0003 | 0 | 0)00000000 FFFFFF1 1

00691299602i[CPU0]| FS:0018(0003 | 0 | 0)00000000 FFFFFFFF11

00691299602i[CPU0]| GS:0018(0003 | 0 | 0)00000000 FFFFFFFF11

00691299602i[CPU0]| EIP=00102764(00102764)

00691299602i[CPU0]| CR0=0xe0000011 CR2=0xe0000011

00691299602i[CPU0]| CR3=0x0001400CR4=0x00000000

0069129962I[CPU0]0x00102764>>添加字节ptr ds:[eax],al:0000

0069129962E[CPU0]异常():第三(13)个未解决的异常,关机状态为 00小时,重置

我试图做的是标识映射整个可用ram,以及我正在使用的代码 要做到这一点,需要:=

printk(" page_limit [%d]\n",page_limit);
for(i=0,virt=0; i < NR_PAGES; ++i,virt += PAGE_SIZE) {
    frame = (PAGE_SIZE * (i % 1024));
    if(i < page_limit) {
        page = 0;
        PT_SET_ATTRIB(page, PTE_PRESENT);
        PT_SET_ATTRIB(page, PTE_READ_WRITE);
        PT_SET_FRAME(page, frame);
        KERNEL_PAGE_TABLE[i] = page;
    } else {
        page = 0;
        PT_SET_ATTRIB(page, PTE_PRESENT);
        PT_SET_ATTRIB(page, PTE_READ_WRITE);
        PT_SET_ATTRIB(page, PTE_USER);
        PT_SET_FRAME(page, frame);
        KERNEL_PAGE_TABLE[i] = page;
    }
}

printk(" page_limit [%d]\n",page_limit);
for(i = 0, frame = (unsigned)KERNEL_PAGE_TABLE; 
        i < NR_PAGE_TABLES; ++i, frame += PAGE_SIZE) {
    if(i < page_limit) {
        page = 0;
        PD_SET_ATTRIB(page, PDE_PRESENT);
        PD_SET_ATTRIB(page, PDE_READ_WRITE);
        PD_SET_FRAME(page, frame);
        KERNEL_PAGE_DIR[i] = page;
    } else {
        page = 0;
        PD_SET_ATTRIB(page, PDE_PRESENT);
        PD_SET_ATTRIB(page, PDE_READ_WRITE);
        PD_SET_ATTRIB(page, PDE_USER);
        PD_SET_FRAME(page, frame);
        KERNEL_PAGE_DIR[i] = page;
    }
}

Where the following macros are defined :=

#define PD_SET_ATTRIB(entry, attrib) \
    (entry) |= (attrib);

#define PD_SET_FRAME(entry, addr) \
    (entry) = ((entry) & ~0xFFFFF000) | (addr << 12);
但看起来CPU也试图加载页面错误和双重错误处理程序 最终三重故障导致CPU复位。我希望有人能帮忙 指出错误


谢谢

您是否处于用户模式?最小工作分页示例:
add byte ptr ds:[eax], al : 0000