解决 ucore lab3 无法触发 page fault 的问题

问题描述

完成清华大学操作系统实验课 ucore(x86) lab3 时,发现无法触发 page fault 异常,具体来说时 check_pgfault() 函数会在执行如下代码时报错

static void
check_pgfault(void) {// ......uintptr_t addr = 0x100;assert(find_vma(mm, addr) == vma);int i, sum = 0;for (i = 0; i < 100; i ++) {*(char *)(addr + i) = i;sum += i;}for (i = 0; i < 100; i ++) {sum -= *(char *)(addr + i);}assert(sum == 0);page_remove(pgdir, ROUNDDOWN(addr, PGSIZE));free_page(pde2page(pgdir[0]));// .......
}

这段代码的意思是,通过往 0x100 附近写入数据时,触发 page fault 异常,然后异常处理例程为 pgdir 第一个目录项分配一个页表,于是执行完后,pgdir[0] 应该指向了第一个页表的物理地址才对。

在代码中对 trap_dispatch() 函数添加断点,当执行到 *(char *)(addr + i) = i 时,代码并没有触发异常,并且此时 pgdir[0] = 0,可见结果不符合预期。

在这里插入图片描述

联想到在 lab2pmm_init() 函数,最后页目录取消了对 0~4M 地址空间的映射,而上面的代码中访问的地址正好也位于 0~4M,所以可能和该原因有关。

void
pmm_init(void) {// ....//disable the map of virtual_addr 0~4Mboot_pgdir[0] = 0;check_boot_pgdir();print_pgdir();
}

pmm_init() 看到,执行 boot_pgdir[0] = 0 后没有执行 tlb_invalidate 函数,此时如果页表被缓存了,那么再次访问的时候就不会触发 page fault 了。

解决方法

pmm_init() 函数的结尾添加一句 tlb_invalidate(boot_dir, 0)

void
pmm_init(void) {// ....//disable the map of virtual_addr 0~4Mboot_pgdir[0] = 0;check_boot_pgdir();print_pgdir();
++  tlb_invalidate(boot_dir, 0);

再次编译运行,可以看到输出信息里包含了触发 page fault 的日志了。

--------------------- END ---------------------
check_vma_struct() succeeded!
page fault at 0x00000100: K/W [no page found].
check_pgfault() succeeded!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/523013.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器“地域”怎么选择?2024新版教程

阿里云服务器地域选择方法&#xff0c;如何选择速度更快、网络延迟更低的地域节点&#xff0c;地域指云服务器所在的地理位置区域&#xff0c;地域以城市划分&#xff0c;如北京、杭州、深圳及上海等&#xff0c;如何选择地域&#xff1f;建议根据用户所在地区就近选择地域&…

蓝桥杯2017年第八届真题-分巧克力

目录 题目描述 输入格式 输出格式 样例输入 样例输出 原题链接 代码实现 题目描述 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见&#xff0c;小明需…

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】&#xff08;底层operator【】函数&#xff09; ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

git fatal: detected dubious ownership in repository at ‘xxx‘ 彻底解决方法

前言 在 windows 重置后&#xff0c; git 仓库无法正常使用 git 的所有 命令&#xff0c;运行任何 git 命令&#xff0c;都会提示如下&#xff1a; $ git log fatal: detected dubious ownership in repository at D:/rk/rk3568/nanopi/uboot-rockchip D:/rk/rk3568/nanopi/u…

SpringBoot学习之自定义注解和AOP 切面统一保存操作日志(二十九)

一、定义一个注解 这个注解是用来控制是否需要保存操作日志的自定义注解(这个类似标记或者开关) package com.xu.demo.common.anotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; i…

FTP服务器中文环境引起润日下载不了附件问题解析

FTP服务器中文环境引起润日下载不了附件问题解析 一、问题背景&#xff1a; 20240229日某农商行因为FTP下载功能有问题&#xff0c;导致当天所有涉及FTP文件下载的交易都不能正常使用&#xff0c;对于银行来说影响还是比较大。现将当天出问题的原因及处理过程解析如下&#x…

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动&#xff0c;使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”&#xff0c;查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

优先完善功能测试,再考虑其他事项

软件测试是对项目研发过程产物&#xff08;文档、代码、程序等&#xff09;进行审查&#xff0c;保障产品质量的过程。 测试人员应具备从用户角度、开发角度和业务角度审查研发过程产物的能力&#xff0c;从而促使最终的产品达到用户、开发和业务三方要求。 测试人员的价值是…

(C语言)字符分类函数

目录 字符分类函数 1. iscntrl 2. isspace 3. isdigit 4. isxdigit 5. islower 6. isupper 7. isalpha 8. isalnum 9. ispunct 10. isgraph 11. isprint 字符分类函数 C语言中有一系列的函数是专门做字符分类的 &#xff0c;也就是一个字符是属于什么类型的字符的。…

安泰ATG-3090功率信号源的输出信号是什么意思

功率信号源是指能够提供电能输出的设备&#xff0c;其输出信号通常以功率的形式存在。功率信号源在各种应用中发挥着重要作用&#xff0c;涵盖了广泛的领域&#xff0c;包括电力系统、通信、电子设备等。以下是关于功率信号源输出信号的详细介绍。 功率信号源是一种能够将输入能…

操作系统:进程优先级

目录 1.进程优先级 1.1.基本概念 1.2.其他概念 1.3.进程切换 2.解读Linux2.6内核进程的调度队列 1.进程优先级 1.1.基本概念 我们在日常生活中的经验&#xff0c;排队的本质就是确认优先级&#xff0c;排队的原因就是资源不足&#xff0c;需要进行分配。那么在内存资源有…

【Spring知识体系】1.1 Java 注解(Annotation)

文章目录 1.1 注解&#xff08;Annotation&#xff09;1.1.1 什么是注解1.1.2 内置注解1.1.3 元注解&#xff08;5种&#xff09;1.14 自定义注解1.15 注解使用场景介绍※ 本文小结 1.1 注解&#xff08;Annotation&#xff09; 1.1.1 什么是注解 注解的定义&#xff1a;它提…