实验目的:

搭建基本实验环境,熟悉基本开发与调试工具

对应章节:第一、二章

实验内容:

1.认真阅读章节资料

2.在实验机上安装virtualbox,并安装ubuntu

3.安装ubuntu开发环境,32位环境

4.下载bochs源码,编译并安装bochs环境

5.使用bochs自带工具bximage创建虚拟软驱

6.阅读、编译boot.asm,并反汇编阅读

7.修改bochsrc,运行并调试你的第一个程序:

删除AA55,观察程序效果,找出原因

修改程序中输出为,一个任意长度的打印字符串,调试程序

把生成的可执行文件反汇编,并设置断点进行调试,打印过程

回答:为什么要对段寄存器进行赋值

回答:如何在该程序中调用系统中断

实验环境:

VMwareWorkstationPro 15.5.0

Ubuntu 12.04.5 desktop i386 32位

bochs 2.6.9

关键技术:

Bochs的使用,主要在于反汇编与单步调试

汇编代码的理解

Makefile的使用

实验步骤:

1.在实验机上安装virtualbox,并安装ubuntu开发环境,32位环境

在官网下载VMware Workstation Pro 15.5.0并安装

在http://mirrors.163.com/ubuntu-releases/,下载:32位Ubuntu,12.04LTS

之后在VMware Workstation Pro中利用ubuntu iso文件安装虚拟机

并安装vmwaretools工具

结果如图:

2.下载bochs源码,编译并安装bochs环境

(1)首先Bochs下载:bochs 2.6.9

http://bochs.sourceforge.net/getcurrent.html

下载完毕后复制到ubuntu

(2)安装必要环境

先修改ubuntu源

修改ubuntu源方法:

http://mirrors.163.com/.help/ubuntu.html

deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse 
deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted

之后安装必要环境

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

libxrandr-dev

libsdl1.2-dev

vgabios

/*bximage*/

(3)之后安装bochs

$tar vxzf bochs-2.6.9.tar.gz

$cd bochs-2.6.9

$./configure --enable-debugger --with-sdl --enable-disasm  --enable-readline LIBS='-lX11'

$make

$sudo make  install

输入命令bochs

如下图,说明安装成功

3.使用bochs自带工具bximage创建虚拟软驱

控制台输入bximage即可

注意创建的a.img位于Home

4.阅读、编译boot.asm,并反汇编阅读

(1)阅读boot.asm

Boot.asm相当于写了一个引导程序

CPU通过CS:IP寄存器中的内容找到要执行的代码片段所在的实际物理内存地址

Mov ax ,cs

Mov ds ,ax

Mov es,ax

相当于给定代码段和数据段,和附加段基地址。

之后DispStr调用10h 13号中断展示BootMessage字符串,规定的展示位置,字体颜色等等。

之后BootMessage db “...”定义了字符串

Times 510 -($-$$) db 0 计算需要多少字节0才能填充剩余0,使得从开头到当前,再加填充的0构成510字节

最后dw 0Xaa55 定义最后两字节为aa55。共512字节,最后两字节为aa55,固为引导程序。

org  规定程序起始地址为07c00h

cs 代码段寄存器,

ds 数据段寄存器

es 附加段寄存器

bp 基址

ES 段地址 BP偏移地址

cx,ax,bx 数据寄存器

ah ax高8位,al ax低8位

dl dx 低8位

db 定义字节变量

Int interrupt

dw定义字类型变量

mov a,b 将b值赋给a

Jmp $ 表示死循环

$表示当前地址,表示当前行被汇编后的地址。

$$表示节的开始处被汇编后的地址

引导程序
BIOS将所检查启动磁盘的第一个扇区512字节载入内存,放于内存0x0000:0x07c00处。
如果第一扇区最后两个字节是AA55,那么它就是一个引导程序。

引导程序特点
大小是512字节,不能多也不能少,因为BIOS只读取512B到内存中。
它结尾必须是55AA,这是引导扇区标志。
它总是放在磁盘第一个扇区上(0磁头0此道1扇区)因为BIOS只读取第一个扇区。

Int 10h

10H中断的13号中断用于显示字符串,参数为:

AH=13H

AL=显示方式

BH表示视频区页数

如果AL的BIT1为0,则BL表示显示属性。

CX为字符串长度

DH表示在第几行显示(0为第一行)

DL表示在第几列显示(0为第一列)

ES:BP指向字符串

(2)编译boot.asm

nasm boot.asm -o boot.bin

5.修改bochsrc,运行并调试你的第一个程序:

(1)修改bochsrc

修改vgaromimage和romomage对应的文件位置,注意是bochs安装后的位置,而不是tar解压的bochs文件夹中的文件

注释掉keyboard_mapping一行

增加display_library: sdl

修改后相当于规定了启动软盘为a.img

(2)Makefile

先看Makefile文件

意为:先解压a.img.gz,然后汇编编译boot.asm,然后用boot.asm填充a.img,然后运行bochs

Clean rm -f 为删除文件

./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。

make 是用来编译的,它从Makefile中读取指令,然后编译。

make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

Bochs从当前目录寻找bochsrc作为配置文件

(3)运行

Cd 到目标文件夹

Make

就先后完成解压,编译,打开了bochs

然后输入6开始simulation

记得要输入c continue

(4)调试删除AA55,查看效果

修改后的boot.asm

Nasm编译为b2.bin

Bximage 创建新的floppy disk a.img

写入

Bochs运行

发现效果为:无法运行,直接退出

 

原因:因为位于1扇区的512字节,且最后字节为aa55的程序为引导程序,a.img作为引导盘,aa55为标志,删除后相当于没有引导程序,故无法运行直接退出

 

(5)修改输出字符串

只需要根据想要输出的字符串修改BootMessage,根据BootMessage的长度修改cx即可

举例,输出just monika

修改后的asm

运行效果

(6)把生成的可执行文件反汇编,并设置断点进行调试,打印过程

用nasm,ndisam可以反汇编

用bochs也可以反汇编,并实现单步调试

具体指令参考教材第二章,或输入 help查看命令

就对写入了原始boot.asm编译产生的boot.bin的a.img用bochs调试

b 0x7a00 设置断点

C 运行到断点

Info cpu查看cpu寄存器

x /64xb 0x7c00 查看内存  64为sequence长度,x为16进制显示,b为长度为byte

Help x 可以具体查看参数意义。

n 单步运行 (遇到函数会跳过)

trace-reg on 让bochs每一步都显示主要寄存器的值

U 为反汇编 disasm

可见在调用DispStr函数后,程序一直循环

6. 回答相关问题

(1)回答:为什么要对段寄存器进行赋值

cs为代码段基址,赋给ds,es,确定程序运行的基址,比如数据段基址,之后加上bp,ES:BP就构成了BootMessage的地址

(2)回答:如何在该程序中调用系统中断

使用汇编int 10h 调用中断,同时设置好其参数,比如cx为字符串长度,ah=13表示输出字符串,AL=01h为显示器模式,bx 000c为颜色,dl 0 表示在第一行输出,ES:BP存储字符串地址

遇到的问题及解决:

1.报错

可以考虑在执行configure时添加参数LIBS='-lX11'

./configure --enable-debugger --enable-disasm --enable-readline LIBS='-lX11'

2.报错make: *** [Makefile:429: install_bin] Error 1

解决 加上sudo权限即可

oslab oranges 一个操作系统的实现 实验一的更多相关文章

  1. oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式

    实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在 ...

  2. oslab oranges 一个操作系统的实现 实验四 认识保护模式(三):中断异常

    实验目的: 理解中断与异常机制的实现机理 对应章节:第三章3.4节,3.5节 实验内容: 1. 理解中断与异常的机制 2. 调试8259A的编程基本例程 3. 调试时钟中断例程 4. 建立IDT,实现 ...

  3. oslab oranges 一个操作系统的实现 实验二 认识保护模式

    https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...

  4. oslab oranges 一个操作系统的实现 实验三 认识保护模式(二):分页

    实验目的: 掌握内存分页机制 对应章节:3.3 实验内容: 1.认真阅读章节资料,掌握什么是分页机制 2. 调试代码,掌握分页机制基本方法与思路 – 代码3.22中,212行---237行,设置断点调 ...

  5. oslab oranges 一个操作系统的实现 final

    见 github  https://github.com/TouwaErioH/subjects/tree/master/oslab-oranges

  6. 《一个操作系统的实现》 ubuntu系统环境配置

    <一个操作系统的实现> ubuntu系统环境配置 电脑之前已经安装了gcc. 一.nasm安装:sudo apt-get install nasm或官网下载http://sourcefor ...

  7. 《Orange'S:一个操作系统的实现》笔记(一)

    感觉自己对于操作系统始终没有一个清楚的概念,尤其最近困扰于实模式.保护模式以及寻址方式等一些概念.转而一想,所有的程序,最终都是操作的计算机资源,需要和操作系统打交道,所以操作系统有必要深入了解一下. ...

  8. x86汇编分页模式实验 --《ORANGE'S一个操作系统的实现》中 pmtest8.asm解析

    序言(废话) : 在看书的过程中发现一开始不是很能理解pmtest8的目的,以及书上说得很抽象..于是在自己阅读过源代码后,将一些自己的心得写在这里. 正文 : 讲解顺序依然按照书上贴代码的顺序来.但 ...

  9. 《一个操作系统的实现》学习笔记(一) bochs源码安装及配置

    前言:本机环境ubuntu 14.04 bochs 2.4.5 一.下载 官网 http://bochs.sourceforge.net/ 二.安装 1.将下载好的压缩包解压并进入该目录 .tar.g ...

随机推荐

  1. Electron入门Demo之桌面应用计算器笔记(二)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14307996.html 在之前总结了一篇自学笔记,通过之前学习到的方法和知识,完成了 ...

  2. 05--Docker对DockerFile解析

    一.是什么: 1.1 DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 1.2 构建步骤: 1.2.1 编写Dockerfile文件 1.2.2 docker ...

  3. C# 正则表达式 -- 复习

    符号解释: \ 特殊的字符,转义 ^ 匹配输入的字符串的开始位置 $ 匹配输入的字符串的结束位置 * 匹配0次或多次,等价于{0,} + 匹配1次或多次,等价于{1,} ? 匹配0次或1次,等价于{0 ...

  4. 将汉字取模软件中的汉字放到keil5中显示

    最近因为要使用STM32做毕业设计,需要用LCD显示中文,STM32开发板用的是原子的战舰STM32开发板,给的LCD显示例程里貌似没有中文显示,那么需要自己去编写中文显示程序. 软件编写对我来说并不 ...

  5. python多线程和GIL全局解释器锁

    1.线程     线程被称为轻量级进程,是最小执行单元,系统调度的单位.线程切换需要的资源一般,效率一般.  2.多线程         在单个程序中同时运行多个线程完成不同的工作,称为多线程 3.并 ...

  6. 全栈性能测试修炼宝典-JMeter实战笔记(三)

    JMeter体系结构 简介 JMeter是一款开源桌面应用软件,可用来模拟用户负载来完成性能测试工作. JMeter体系结构 X1~X5是负载模拟的一个过程,使用这些组件来完成负载的模拟 Y1:包含的 ...

  7. jmeter的线程数,并发用户数,TPS,RPS 关系解说

    背景 在做性能测试的时候,传统方式都是用并发虚拟用户数来衡量系统的性能(站在客户端视角),一般适用于一些网页站点例如首页.H5的压测:而RPS(Requests per second)模式主要是为了方 ...

  8. Jackson学习

    Jackson 是一个能够将java对象序列化为JSON字符串,也能够将JSON字符串反序列化为java对象的框架. 本文的所有内容都可以从 Java JSON Jackson Introductio ...

  9. luoguP2657 [SCOI2009] windy 数

    目录 luoguP2657 [SCOI2009] windy 数 简述题意: Solution: luoguP2657 [SCOI2009] windy 数 简述题意: 不含前导零且相邻两个数字之差至 ...

  10. LIS的优化

    二分优化 在求一个最长不上升自序列中,显然其结尾元素越小,越有利于接其他元素,对答案的贡献也就可能会更高 那么我们可以用low[i]去存长度为i的LIS结尾元素的最小值 因此我们只要维护low数组 对 ...