时隔近20天,终于搞定了一个问题。使用linker script设置内核起始地址为0xC0000000后,在没有启用分页的情况下,终于让加载到0x100000的内核成功运行起来了。内核代码正常运行,时钟中断正常。
ucore lab2 project5中首先设置了一个临时gdt,将base地址设置为-0xC0000000,这样在后续所有地址访问中,地址都会与这个base地址相加,相当于减去了0xC0000000,应该可以正常运行。
开始时qemu虚拟机直接宕掉,原因是把DS、ES、FS、GS、CS的内容都改了,忘了改SS,而ESP的值设置了一个0xC0xxxxxx的值,从而执行出错。
将SS也改为用新段地址后,虚拟机的确是正常运行了,不过一运行cpu就不断重启。为此使用gdb调试跟踪。调试过程中发现gdb处理这种情况会有些问题:段基地址不再是0了,也就意味着EIP中的地址不再是下一条指令的物理地址了。此时看后续汇编指令必须用如下gdb命令看:
x/10i $pc - 0xC0000000
另外,断点仍然有用,但断点停下来后,continue命令就再也不起作用了,怀疑continue时gdb没有正确把trap指令去掉。而nexti指令的效果也变得和stepi一样,对于call指令总会跳进去。
不过除了这些问题,gdb仍然不可或缺,通过gdb仍然发现了问题的出处:初始化内存时出错。
初始化内存时重新设置gdt,然后重新更新了各个段寄存器。把段寄存器的基址改为-0xC0000000,cpu仍然重启。调试时发现gdt中加载出来的数据可能是错的,记起来lgdt命令中,gdt的基址指针是一个线性指针,而非逻辑指针。这就意味着gdt的基址指针不会进行段运算,所以gdt基址指针应该减去0xC0000000。
减去后,终于成功初始化内存了,但sti恢复中断后,又开始不断出错。不恢复中断时都是好的,说明中断执行出错了。想了好几天,才想起lidt命令中,idt的基址指令也是线性地址。将idt基址指针减去0xC0000000后,终于一切ok了。
接下来就是内存分页处理了。
分享到:
相关推荐
hive 开发UDF 使用maven工程 引发jar包缺失 hive 开发UDF 使用maven工程 引发jar包缺失
Version : 5.7 Vendor : Fedora Project Release : 2.20090207.fc11 Date : 2009-02-26 09:37:30 Group : Development/Libraries Source RPM : ncurses-5.7-2.20090207.fc11.src.rpm Size : 1.71 MB Packager :...
Root project 'Almost-Famous' +--- Project ':famous-cloud' +--- Project ':famous-config' \--- Project ':famous-unique' +--- Project ':famous-common' +--- Project ':famous-login' +--- Project ':famous-...
gEDA homepage: http://www.geda-project.org -----gschem.exe 1.9.2 (g9e1f72c) -----pcb.exe Compile Time Options ----- GUI: gtk : Gtk - The Gimp Toolkit Exporters: bom : Exports a Bill of Materials ...
Udacity-前端网页开发纳米学位-项目3-经典街机游戏克隆-欢迎来到游戏:《蛙人》 -直播版本链接: ://tulysg.github.io/Front-End-NanoDegree-Project3/ -支持课程:Object Oriented JavaScript, ...
2006-03-11 15:26 122,880 关键路径分析.mpp 2005-10-06 00:21 339,456 固定资产信息系统项目.mpp 2005-11-17 16:56 622,592 固定资产信息系统项目.多比较基准.mpp 2005-11-17 16:56 637,440 固定资产信息系统项目....
llvm-project_13.0.1-5.src.tar.gzllvm-project_13.0.1-5.src.tar.gzllvm-project_13.0.1-5.src.tar.gzllvm-project_13.0.1-5.src.tar.gzllvm-project_13.0.1-5.src.tar.gzllvm-project_13.0.1-5.src.tar.gzllvm-...
使用步骤:使用Keil打开Project--》RVMDK(uv5)--》iSO-STM32.uvprojx,对MCU进行代码烧录 二、My_TemAndHumCollection:上位机程序源码 ----->build:编译输出文件目录 ----->My_TemAndHumCollection.pro:QT ...
项目结构multi-module-project是我们的项目名称,其中包含多个模块:mmp-dal模块:数据访问层,提供对原始数据(主要指数据库)的操作mmp-integration模块:提供对第三方服务的调用mmp-commons模块:提供工具类、...
5. **Problem 5: 2的幂次方的和** - 知识点:幂运算,循环结构,数组操作,位运算(可选)。 - 解决方法:计算2的幂次方直到它们的和大于等于4000000,然后相加所有偶数的幂次方。 6. **Problem 6: 平方和与平方...
431-Project1:RIT CSCI 431
来自emule-project的原版emule,里面没有关键字过滤,可以自由的下载一切资源,不可多得啊~
composer create-project drupal-composer/drupal-project:9.x-dev some-dir --no-interaction 使用composer require ...您可以将新的依赖项下载到您的安装中。 cd some-dir composer require drupal/devel ...
WebUml-ProjectManager WebUml项目管理器后端。 职责: 用于元模型和表示模型元素的CRUD 要求: GIT 1.9( ) Java 8( ) Maven 3.0.5( ) heroku-toolbelt 3.6.0( ) MongoDB的 推荐工具: jq( ) 在...
《Project横道图很容易》这份参考资料,主要针对的是Microsoft Project软件在项目管理中的应用,特别是如何轻松绘制横道图(甘特图)这一核心功能。横道图是项目管理中常用的一种图形化工具,用于清晰地展示项目的...
Lesson 4 - Variables and expressions: giving names and values to things Lesson 5 - Object types and statements of code 46 Lesson 6 - Capstone project: your first Python program-convert hours to ...
在这个项目中,"fireworx-streamline-project-master"可能包含源代码、配置文件和其他相关资源,以改善MATLAB的默认设置,提供更加智能化的代码提示功能。 MATLAB的快捷键通常分为两类:基本编辑器快捷键和特定功能...
4. **开源软件**:"ncpi-project-forge-master" 提示这是一个开源项目,意味着源代码对公众开放,允许用户自定义、扩展和贡献代码,以满足特定需求。 5. **版本控制**:“master”分支是版本控制系统中的一个概念,...
midterm-project-aagamsh1:GitHub Classroom创建的midterm-project-aagamsh1
:gear: 自行设定# Clone repo$ git clone https://github.com/marcorichetta/cs50-project1.git$ cd cs50-project1# Create a virtualenv (Optional but reccomended)$ python3 -m venv myvirtualenv# Activate the...