gpt4 book ai didi

assembly - 如何设置 x86 分页?出现三重故障错误

转载 作者:行者123 更新时间:2023-12-02 14:41:43 25 4
gpt4 key购买 nike

我有一个玩具内核,正在 bochs 上的 x86 下运行。当我启用分页时,bochs 会重置并出现三重故障错误。似乎每次内存访问都会触发错误。因此,我假设我在设置分页时出错,并且问题不在于我的中断处理程序。这是代码。

分页.c

#include "paging.h"
#include "lib.h"
#include "screen.h"
#include "descriptor_tables.h"

typedef struct page_dir_entry_s{
bool present:1;
bool writeable:1;
bool user_access:1;
bool write_through:1;
bool cache_disabled:1;
bool accessed:1;
bool unused0:1;
bool use_mb:1;//makes pages 4MB not 4KB
bool unused1:4;
u32 frame:20;
} page_dir_entry_t;

typedef struct page_table_entry_s{
bool present:1;
bool writeable:1;
bool user_access:1;
bool write_through:1;
bool cache_disabled:1;
bool accessed:1;
bool dirty:1;
bool unused0:1;
bool global:1;
bool unused1:3;
u32 phys_page_addr:20;
} page_table_entry_t;

extern u32 end;//as declared in the linker script

static u32 next_addr=0;
static page_dir_entry_t* page_dir=NULL;
static page_table_entry_t* page_table=NULL;

extern void enable_paging(u32);

void InitPaging(){
next_addr=end;
while((next_addr%4096)!=0)
++next_addr;
page_dir=(void*)next_addr;
next_addr+=4*1024;
memset(page_dir,0,4*1024);
page_table=(void*)next_addr;
next_addr+=4;
u32 addr=0;
u32 i=0;
*(((u32*)page_table)+i)=0;//zero it out
while(addr<next_addr){
page_table[i].present=true;
page_table[i].writeable=true;
page_table[i].phys_page_addr=addr;
++i;
*(((u32*)page_table)+i)=0;//zero it out
addr+=(1024*4);//4KB
next_addr+=4;
}

page_dir[0].writeable=true;
page_dir[0].present=true;
page_dir[0].frame=(u32)page_table;

enable_paging((u32)page_dir);
}

paging_asm.s

[global enable_paging]
enable_paging:
mov eax,[esp+4]
mov cr3,eax
mov eax,cr0
or eax,0x80000000
mov cr0,eax
ret

最佳答案

“frame”和“phys_page_addr”字段是物理地址的第 32 位到第 12 位(在此分页模式下)。

分页不会对偏移量 (0 - 4K) 执行任何操作。

至少,你需要:

page_table[i].phys_page_addr=addr >> 12;

page_dir[0].frame=((u32)page_table) >> 12;

由于“addr”和“page_table”都与 4096 对齐,因此这只是删除了多余的零。

关于assembly - 如何设置 x86 分页?出现三重故障错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7182978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com