时隔近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了。
接下来就是内存分页处理了。
分享到:
相关推荐
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-...
Java-EE-Project1:Java EE
Daniels-Project:https://khadijaserag.github.ioDaniels-Project
hive 开发UDF 使用maven工程 引发jar包缺失 hive 开发UDF 使用maven工程 引发jar包缺失
RSE-Project5:Udacity Robotics软件工程师Nanodegree-项目5-家庭服务机器人
ncpi-project-forge::light_bulb::notebook:Project Forge的材料和计划
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 固定资产信息系统项目....
TodoList-Project-:PHP-OPP-Todolist项目
MEng-Y3-Group-Project-:医学教育的人眼3D动力学模型
iat339-project2:iat339-project2-蔡妍公园和王Ceyao团队
HTML-CSS-Project1:HTML&CCS firt项目
cs32-project4:代码编辑器
JAVA-Project2:JAVA项目
CS-347-Project1:CS 347 Web开发项目1
431-Project1:RIT CSCI 431
composer create-project drupal-composer/drupal-project:9.x-dev some-dir --no-interaction 使用composer require ...您可以将新的依赖项下载到您的安装中。 cd some-dir composer require drupal/devel ...
joshford-project0:Joshua Ford的Project 0存储库
webpro-project2:Web编程项目2
td-project2:技术学位项目2