测试 orange 中代码产生的问题
2009-10-19 21:20
232 查看
自己动手写操作系统 第二版 orange 测试
环境:
1 windows: 系统平台
2 windows版nasm: 用来编译代码
3 source insight: 编辑代码
4 beyond compare: 代码比较
5 vritual pc 2007: 虚拟出操作系统,使用virtual pc的原因主要是因为 virtual pc 中的msdos71虚拟机能使用share folders特性与windows方便的共享文件
6 msdos7: 虚拟操作系统,学习保护模式时需要
7 windows版 dd: 用来写虚拟磁盘,常用命令 dd if=xxx.bin of=yyy.img count=1 (windows下好像没有 conv=notrunc)
记得将 nasm、dd加入 path 环境变量中
在 source insight中添加一个options -> custom comand命令:cmd,并绑定到F12,用来快速打开 命令行窗口,custom command简单写为: cmd /k cd /d f:/my_os (其中f:/my_os为我的代码存放路径)
问题1: 测试pmtest1.asm时,msdos71虚拟机上出现 emm386 ... 提示信息,并且之后虚拟机无反应
解决:msdos71虚拟机启动后,使用edit 命令打开 config.sys文件,将其中的emm行使用 REM 注释掉。重启后此问题解决
问题2:在自己DispReturn的电脑上将 pmtest2.asm 敲了一遍进行测试,在virtual pc 2007 上进行测试的时候出现了虚拟机立即重启问题
解决:过程还有点曲折。对保护模式不太熟,看不出什么问题来,只得在代码中一次一次的添加 jmp $ 代码测试,却发现代码排错太慢,故先运行光盘上原始的代码测试,又发现了显示的信息 只是 FF FF FF ...,与书上描述不符。经过分析,发现是因为我创建虚拟机时,为了节约资源,只给虚拟机分配了4m的内存,而代码里面的 LABEL_DESC_TEST 的开始位置为 0500000h,即5m,我将代码改为 0300000h后,原始代码运行正确了。为免再发生内存过小问题,我将虚拟机的内存调高为24m。再回到我自己敲的pmtest2.asm,此时虚拟机仍然重启,jmp $,进行测试,发现在
这行时开始有问题: 运行发现下一行输出覆盖了上一行输出,这可以推断是回车符没有效果,即 DispReturn 函数有问题,我仔细查看了我敲的pmtest2.asm与原始的区别,眼睛看花了,都没找出不同,但我将原始DispReturn拷贝到我的pmtest2.asm上时又有回车效果了,这说明肯定是我敲的代码的问题。没办法,我安装了 beyond compare 进行比较,我马上发现了问题所在: 我把 and 敲成了 add ,直接导致了问题,我把所有的代码都查了一遍,发现了几处上面的问题,修改完后,程序运行正确了
问题3:在测试pmtest3.asm时,自己敲入的代码编译后运行导致虚拟机操作系统重启
解决:同样使用 jmp $ 一部分、一部分的查询问题所在,最后测出是
出的问题,但错误所在与上次不一样,这次是堆栈操作错误:进函数时将 eax、ebx入栈了,在出函数时却只将ebx出栈了,看来是漏敲了一行代码,添加后 pop eax 后继续测试,发现问题继续。哎,继续 jmp $,发现问题已经不在 call DispReturn, 而在 LABEL_SEG_CODE16 中,看了下,又是少敲了一行代码:mov ax, SelectorNormal,这引起了程序在返回16代码段时的ds,es,fs,ss,gs全部为未知数据,从而导致意外发生
环境:
1 windows: 系统平台
2 windows版nasm: 用来编译代码
3 source insight: 编辑代码
4 beyond compare: 代码比较
5 vritual pc 2007: 虚拟出操作系统,使用virtual pc的原因主要是因为 virtual pc 中的msdos71虚拟机能使用share folders特性与windows方便的共享文件
6 msdos7: 虚拟操作系统,学习保护模式时需要
7 windows版 dd: 用来写虚拟磁盘,常用命令 dd if=xxx.bin of=yyy.img count=1 (windows下好像没有 conv=notrunc)
记得将 nasm、dd加入 path 环境变量中
在 source insight中添加一个options -> custom comand命令:cmd,并绑定到F12,用来快速打开 命令行窗口,custom command简单写为: cmd /k cd /d f:/my_os (其中f:/my_os为我的代码存放路径)
问题1: 测试pmtest1.asm时,msdos71虚拟机上出现 emm386 ... 提示信息,并且之后虚拟机无反应
解决:msdos71虚拟机启动后,使用edit 命令打开 config.sys文件,将其中的emm行使用 REM 注释掉。重启后此问题解决
问题2:在自己DispReturn的电脑上将 pmtest2.asm 敲了一遍进行测试,在virtual pc 2007 上进行测试的时候出现了虚拟机立即重启问题
解决:过程还有点曲折。对保护模式不太熟,看不出什么问题来,只得在代码中一次一次的添加 jmp $ 代码测试,却发现代码排错太慢,故先运行光盘上原始的代码测试,又发现了显示的信息 只是 FF FF FF ...,与书上描述不符。经过分析,发现是因为我创建虚拟机时,为了节约资源,只给虚拟机分配了4m的内存,而代码里面的 LABEL_DESC_TEST 的开始位置为 0500000h,即5m,我将代码改为 0300000h后,原始代码运行正确了。为免再发生内存过小问题,我将虚拟机的内存调高为24m。再回到我自己敲的pmtest2.asm,此时虚拟机仍然重启,jmp $,进行测试,发现在
call DispReturn
这行时开始有问题: 运行发现下一行输出覆盖了上一行输出,这可以推断是回车符没有效果,即 DispReturn 函数有问题,我仔细查看了我敲的pmtest2.asm与原始的区别,眼睛看花了,都没找出不同,但我将原始DispReturn拷贝到我的pmtest2.asm上时又有回车效果了,这说明肯定是我敲的代码的问题。没办法,我安装了 beyond compare 进行比较,我马上发现了问题所在: 我把 and 敲成了 add ,直接导致了问题,我把所有的代码都查了一遍,发现了几处上面的问题,修改完后,程序运行正确了
问题3:在测试pmtest3.asm时,自己敲入的代码编译后运行导致虚拟机操作系统重启
解决:同样使用 jmp $ 一部分、一部分的查询问题所在,最后测出是
call DispReturn
出的问题,但错误所在与上次不一样,这次是堆栈操作错误:进函数时将 eax、ebx入栈了,在出函数时却只将ebx出栈了,看来是漏敲了一行代码,添加后 pop eax 后继续测试,发现问题继续。哎,继续 jmp $,发现问题已经不在 call DispReturn, 而在 LABEL_SEG_CODE16 中,看了下,又是少敲了一行代码:mov ax, SelectorNormal,这引起了程序在返回16代码段时的ds,es,fs,ss,gs全部为未知数据,从而导致意外发生
相关文章推荐
- 手机移动APP安全测试方法、工具和一些容易产生安全问题
- Orange'S代码用gdb+bochs调试的问题
- 大小端模式及字符集问题代码测试
- 测试代码问题
- CodeSmith小问题找不到所产生的代码
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
- 测试代码,解决java gui swing多线程界面假死、僵死问题,实现界面动态刷新,动态同步更新数据
- axis2在tomcat的temp中产生大量的临时文件,压力测试性能存在问题
- 浏览器兼容性问题,为什么同一段JavaScript代码,不同浏览器上为什么会产生不同效果,甚至bug?浏览器不就是严格按照JavaScript语法进行的吗?java代码为什么从来没听过有什么兼容问题?
- 全程测试,从需求到设计到代码,集中人力来解决每个环节遇到的问题
- mocha框架下,异步测试代码错误造成的问题----用例超时错误
- [问题大概解决了,应该就是单键模式使用不当产生的。明天找人来做一下压力测试]又一次斗胆发到了首页。期盼帮我检查下objDB类是否有问题
- UNIX网络编程书中源代码测试环境搭建 (centos中取时间问题)
- 同一段C++代码在win下和linux下同时编译时产生的头文件包含问题及解决
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
- 0-1背包问题测试代码
- 2017-02问题记录总结:linux下网络收发包性能测试代码、.bin和.elf文件格式区别
- Redis 单点模式和集群模式代码测试及问题记录
- 排列平方数 若干不同的数字,排列组合后能产生多少个平方数? 下面的代码解决了这个问题。