解决ucore实验qemu不断重启问题

解决 ucore 实验 qemu 不断重启问题

做清华大学操作系统 ucore 实验 (x86版本),实验一编译后运行 qemu 发现系统不断重启,无法正常运行 kernel。实验环境是 ubuntu 22.04gcc 11.4.0ld 2.38。最终查证是链接脚本 kernel.ld 导致代码运行错误。解决方法需要小小修改 kernel.ld

问题查证

使用 gdb 单部跟踪,发现运行到下面的 lgdt 函数后,系统就重启了。怀疑是否是传入的 gdt_pd 参数有问题,导致触发了 CPU 保护异常机制。打印该变量发现其数值不正常。
在这里插入图片描述
代码里是这样设置参数的,上面打印的操作有明显问题。

static struct segdesc gdt[] = {SEG_NULL,[SEG_KTEXT] = SEG(STA_X | STA_R, 0x0, 0xFFFFFFFF, DPL_KERNEL),[SEG_KDATA] = SEG(STA_W, 0x0, 0xFFFFFFFF, DPL_KERNEL),[SEG_UTEXT] = SEG(STA_X | STA_R, 0x0, 0xFFFFFFFF, DPL_USER),[SEG_UDATA] = SEG(STA_W, 0x0, 0xFFFFFFFF, DPL_USER),[SEG_TSS]    = SEG_NULL,
};static struct pseudodesc gdt_pd = {sizeof(gdt) - 1, (uint32_t)gdt
};

于是怀疑是代码出现了内存覆写问题,把这个变量写坏了。重新调试 kernel,发现在刚进入 kern_init 时变量还是好的,结果紧接下面一句 memset(edata, 0, end - edata) 后,数值就被修改了。
在这里插入图片描述
于是查找 edataend 是什么。在 kernel.ld 中是这样写的,意思是希望用 edataend 来标记 bss 段的范围,然后在代码中将其清 0。

	/* The data segment */.data : {*(.data)}PROVIDE(edata = .);.bss : {*(.bss)}PROVIDE(end = .);

gdt_pd 变量是有初始化值的,不应该在 bss 范围内,使用 readelf -s 来查看符号地址就可以看到 gdt_pd 确实是被 edataend 包住了,所以是错误的。

在这里插入图片描述
使用 readelf -S 查看段信息
在这里插入图片描述

edata 标记的位置是 0x10f90,而 .got.plt 的起始地址也是 0x10f950。而在 0x10f950 后,bss 前还包含了 .got.plt, .data.rel.local, .data.rel.ro.local,这部分内容也会被错误清 0。由于 gdt_pd 是个 static 变量,他就位于 data.rel.local 里,所以就被修改了。

解决方法

需要 edataend 精确标记 .bss 的范围,不能包含其他的段,kernel.ld 修改如下
在这里插入图片描述

结果验证

修改完后再编译,就能看到正确结果了
在这里插入图片描述由于中断向量表尚未设置好,此时发生定时器中断还是错误重启。所以先注释掉启用中断的代码再运行,就不会再重启了。

int
kern_init(void) {// ....clock_init();               // init clock interrupt// intr_enable();              // enable irq interruptwhile(1);

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

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

相关文章

MySQL 基础知识(五)之数据增删改

目录 1 插入数据 2 删除数据 3 更改数据 创建 goods 表 drop table if exists goods; create table goods ( id int(10) primary key auto_increment, name varchar(14) unique, stockdate date )charsetutf8; 1 插入数据 当要插入的数据为日期/时间类型时,如果…

【AI视野·今日NLP 自然语言处理论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 17 Jan 2024 (showing first 100 of 163 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…

MATLAB|基于改进二进制粒子群算法的含需求响应机组组合问题研究(含文献和源码)

目录 主要内容 模型研究 1.改进二进制粒子群算法(BPSO) 2.模型分析 结果一览 下载链接 主要内容 该程序复现《A Modified Binary PSO to solve the Thermal Unit Commitment Problem》,主要做的是一个考虑需求响应的机组组合…

【RT-DETR有效改进】利用FasterNet的FasterBlock改进特征提取网络(高效的推理速度和FPS)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用FasterNet的FasterBlock改进特征提取网络,将其用来改进ResNet网络,其旨在提高计算速度而不牺牲准确性,特别是在视觉任务中。它通过一种称为部分卷积(PConv)的新技术来减少冗…

机器学习3----决策树

这是前期准备 import numpy as np import pandas as pd import matplotlib.pyplot as plt #ID3算法 #每个特征的信息熵 # target : 账号是否真实,共2种情况 # yes 7个 p0.7 # no 3个 p0.3 info_D-(0.7*np.log2(0.7)0.3*np.log2(0.3)) info_D #日志密度…

【从0到1学Python】第四讲:Python中的各种“量”(三)

不要着急!我们在下一讲就会开始编写如假包换的程序了。 这一讲我们了解一下六种常见类型的量的常用方法,以及不同类型之间的关系。 所谓“方法(methods)”,我的理解是对于某一个类型的量的某种操作或判断。比如说&…

JS如何判断普通函数与异步(async)函数

这里可以先打印一下普通函数和异步(async)函数的结构,如下图 可以看出两者原型链,普通函数的原型链指向的是一个函数,异步(async)函数原型链指向的是一个AsyncFunction,这时就会想到…

顶级思维方式——认知篇五(思想的觉醒)

目录 1、 女性的地位觉醒 2、电视剧《天道》之高人思维:丁元英为什么讲“人间黑白颠倒”? 3、 创业公司, 更应该大胆的创新. 4、 做到一定职务的时候, 你一定想到在你这个地位上你要做什么 1、 女性的地位觉醒 过去引以为鉴的例子&…

Ubuntu如何设置成中文

1、右上角点击(音量图标和电池图标位置),选择“Settings”(设置)。 2、左侧选择“Region & Language”(区域与语言),然后选择“Manage Installed Languages”(管理已…

JavaWeb学习|Filter与ThreadLocal

学习材料声明 所有知识点都来自互联网,进行总结和梳理,侵权必删。 引用来源:尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 Filter 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Liste…

专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。

今年考研顺利上岸,被东北大学通信工程录取,其中专业课841通信专业基础140,数二140,总分420,整体每门课都还是比较均衡,刚开始考研前也和大家一样,焦虑,紧张,面对考研怕失…

人工智能时代

一、人工智能发展历史:从概念到现实 人工智能(Artificial Intelligence,简称AI)是计算机科学领域中一门旨在构建能够执行人类智能任务的系统的分支。其发展历程充满曲折,从概念的提出到如今的广泛应用,是技术、理论和实践相互交织的产物。 1. 起源(20世纪中期) 人工智…