【操作系统】搭建实验的基本环境,熟悉开发与调试工具 |
您所在的位置:网站首页 › debug实验报告截图 › 【操作系统】搭建实验的基本环境,熟悉开发与调试工具 |
实验内容
认真阅读课本章节资料 在实验机上安装virtualbox,并安装ubuntu 安装ubuntu开发环境 下载bochs源码,编译并安装bochs环境 使用bochs自带工具bximage创建虚拟软驱 阅读、编译boot.asm,并反汇编阅读 修改bochsrc,运行调试你的第一个程序 重点掌握课本14页表2.1 的bochs调试指令 注意事项Virtualbox及其增强包下载:Downloads – Oracle VM VirtualBox Ubuntu下载:Index of /ubuntu-releases/ 修改ubuntu源方法:Ubuntu镜像使用帮助 Bochs下载:bochs: The Open Source IA-32 Emulation Project (Download Current Release) Bochs编译注意事项 可能需要安装build-essential、libx11-randr0-dev、libxrandr-dev,可在编译过程中发现 修改bochsrc中部分内容: 修改romimage 和vgaromimage对应的文件位置,以你的实际安装位置为准 注释掉keyboard_mapping一行 实验过程在实验机上安装virtualbox,并安装ubuntu环境,32位环境 ![]() 下载bochs源码,编译并安装bochs环境 (1)首先下载bochs 2.6.9,下载完毕后复制到ubuntu中 ![]() (2)安装必要环境 先修改ubuntu源 备份原来的源: sudo cp /etc/apt/sources.list /etc/apt/sources_init.list更换源: sudo gedit /etc/apt/sources.list将原本的内容清空,将新的源复制进去 更新源: sudo get-apt update复损坏的软件包,尝试卸载出错的包,重新安装正确版本的: sudo apt-get -f install更新软件: sudo apt-get upgrade之后安装必要环境: sudo apt-get install g++ sudo apt-get install build-essential sudo apt-get install libgtk2.0-dev sudo apt-get install bison sudo apt-get install libx11-dev sudo apt-get install libxrandr-dev sudo apt-get install libsdl1.2-dev sudo apt-get install vgabios sudo apt-get install bximage(3)安装bochs tar vxzf bochs-2.6.9.tar.gz![]() ![]() ![]() ![]() 使用bochs自带工具bximage创建虚拟软驱 ![]() 创建的a.img位于Home ![]() 安装nasm,阅读、编译boot.asm,并反汇编阅读 (1)安装nasm ![]() (2)阅读,编译boot.asm nasm boot.asm -o boot.bin![]() ![]() (3)反汇编阅读 ndisasm -o 0x7C00 boot.bin >> disboot.asm![]() 写引导盘 dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc![]() 修改bochsrc,运行并调试你的第一个程序 (1)修改bochsrc 修改vgaromimage和romomage对应的文件位置,注意是bochs安装后的位置,而不是tar解压的bochs文件夹中的文件 注释掉keyboard_mapping一行 增加display_library:sdl ![]() 修改后相当于规定了启动软盘是a.img (2)运行 要将a.img、boot.asm、boot.bin、bochsrc几个文件放在同一个文件夹下,cd到该文件夹下 bochs -f bochsrc ![]() 然后输入6开始simulation 输入c,continue ![]() 完成! ![]() 实验练习 (1)删除0xAA55,观察程序效果,找出原因 修改后的boot.asm ![]() nasm编译为b2.bin bximage创建新的软盘a2.img 修改bochsrc中a.img为a2.img 写引导盘:dd if=b2.bin of=a2.img bs=512 count=1 conv=notrunc bochs运行 ![]() 发现输入c后无法运行,直接退出,也没有显示“Hello, OS world!” 因为位于1扇区的512字节且最后字节为aa55的程序为引导程序,a.img为引导盘,aa55即为标志,删除了该标志后相当于没有了引导程序,所以无法运行直接退出 (2)修改程序中输出为一个包含自己名字的字符串,调试程序 只需要根据想要输出的字符串修改BootMessage,接着根据BootMessage的长度修改cx即可 修改后的boot.asm: ![]() 运行结果: ![]() (3)把生成的可执行文件反汇编,看看输出的内容是怎样的,并在虚拟机启动过程设置断点进行调试,在实验报告中截图 使用ndisasm -o 0x7C00 boot.bin >> disboot.asm命令进行反汇编,得到disboot.asm: ![]() 对写入了原始boot.asm编译产生的boot.bin的a.img用bochs调试 b 0x7a00设置断点 C 运行到断点 ![]() info cpu查看cpu寄存器 ![]() n 单步运行(遇到函数会跳过) ![]() s 单步运行(会跳入函数) ![]() (4)为什么要jmp $,如何改造程序,让这个输出过程执行100次 jmp $在这里的作用是做一个无限循环,让CPU停在此处,不能再往下运行。假如没有这个无限循环,CPU就会按着CS:IP一路往下执行,能执行的执行,不能执行的则crash,而我们不想看到这样的情况。 想要让这个输出过程执行100次,可以在call DispStr前加上一句mov cx, 100,在后面加上一句loop $-2,即可实现100次循环 (5)为什么要对段寄存器进行赋值 段寄存器是为对内存的分段管理而设置的。在进行内存分段时,段的部分信息将被写入段寄存器中以保存当前内存的分段模式。即使是最简单的操作系统,也是一个程序,也需要占用内存来运行,所以给段寄存器赋值是不可避免的。 (6)如何在该程序中调用系统中断 将程序打印的字符串以用户输入的形式来赋值,比如C语言就是使用scanf函数来获取,这样就可以调用系统中断,等待键盘输入。 总结实验是上学期做的,现在跟着之前的实验报告写到博客上。这个博客只是给不会做的同学指导一下步骤,没有什么高深的见解和创新。 祝各位同学实验顺利呀~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |