尝试在启用分页的情况下访问 VESA LFB 时出现页面错误

Posted

技术标签:

【中文标题】尝试在启用分页的情况下访问 VESA LFB 时出现页面错误【英文标题】:Page fault when trying to access VESA LFB with paging enabled 【发布时间】:2016-09-18 01:01:45 【问题描述】:

每当我尝试将像素写入 VESA 模式的 LFB 时,都会出现页面错误,该页面存在并已被读取。我的分页实现来自 James Molloy 的 OS 系列。我尝试了 LFB 的身份映射,如下所示:

for (unsigned int i = 0xFD000000; i < 0xFE000000; i += 0x1000) 
    page_t* pg = get_page(i, 1, kernel_directory);
    alloc_page(pg, 1, 1);

这些是这些函数的原型:

page_t* get_page(uint32_t address, int make, page_directory_t* dir);
void alloc_frame(page_t* page, int is_kernel, int is_writeable);

禁用分页后,我可以毫无问题地将像素写入 LFB。我的身份映射 LFB 是否不正确?我还需要做些什么来正确识别映射吗?有什么建议吗?

【问题讨论】:

【参考方案1】:

禁用分页时,您的访问地址是物理地址。但是,当启用分页时,您的访问地址是虚拟的,因此您应该首先将您将访问的地址区域映射到物理地址区域。这可以通过 remap_pfn_rangenopage 函数来实现,如 here 介绍的那样。

【讨论】:

原发帖人没有使用 Linux,他们正在创建自己的操作系统 分页是硬件(CPU和MMU)的一种机制,所以不管你在写什么操作系统。开启分页机制时,必须遵守硬件定义的分页规则。 是的,但是 Linux 例程无法帮助他处理来自 James Molloy's OS series 的代码 嗯,不。但我认为从 Linux 实现中学习实现自己的映射功能更容易。

以上是关于尝试在启用分页的情况下访问 VESA LFB 时出现页面错误的主要内容,如果未能解决你的问题,请参考以下文章

在启用分页的情况下使用 UIScrollView

在启用分页的情况下将表格视图添加到滚动视图。

UICollectionView 在启用分页的情况下不会滚动完整的 320 点

在启用分页的情况下使两个 UICollectionView 同步滚动

在启用本机分页的情况下查看 UICollectionView 中的上一个/下一个单元格?

在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化