我正在开发一个爱好者操作系统,但在身份映射和启用分页方面遇到了麻烦。我正在使用 Bochs 模拟器,我收到以下错误消息:=
00691299602e[CPU0] 中断():门描述符无效 sys seg(向量 = 0x0e)
00691299602e[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
00691299602i[CPU0] | IOPL=0 id vip vif ac vm RF nt of df if tf SF zf af PF cf
00691299602i[CPU0] | SEG 选择器基本限制 GD
00691299602i[CPU0] | SEG sltr(index|ti|rpl) 基本限制 GD
00691299602i[CPU0] | CS:0008(0001|0|0)00000000 ffffffff 1 1
00691299602i[CPU0] | DS:0018(0003|0|0)00000000 ffffffff 1 1
00691299602i[CPU0] | SS:0018(0003|0|0)00000000 ffffffff 1 1
00691299602i[CPU0] | ES:0018(0003|0|0)00000000 ffffffff 1 1
00691299602i[CPU0] | FS:0018(0003|0|0)00000000 ffffffff 1 1
00691299602i[CPU0] | GS:0018(0003|0|0)00000000 ffffffff 1 1
00691299602i[CPU0] | EIP=00102764 (00102764)
00691299602i[CPU0] | CR0=0xe0000011 CR2=0xe0000011
00691299602i[CPU0] | CR3=0x00014000 CR4=0x00000000
00691299602i[CPU0] 0x00102764>> 添加字节 ptr ds:[eax], al : 0000
00691299602e[CPU0] exception():第 3 (13) 个异常,无解决,关机状态为 00h,正在重置
我正在尝试做的是标识整个可用内存的映射,而我用来执行此操作的代码是:=
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);
与 PT_SET_ATTRIB 和 PT_SET_FRAME 类似。我认为映射是错误的,Bochs 停止的实际行看起来像是引用了一个空指针:=
add byte ptr ds:[eax], al : 0000
但它看起来也像 CPU 试图加载页面错误和双重错误处理程序并最终导致三重错误导致 CPU 重置。我希望有人可以帮助指出错误。
谢谢