实验目的:

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

对应章节:第一、二章

实验内容:

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. vxfs(Veritas File System)扩充目录大小

    1.新增加一个磁盘并初始化 # vxdisk list # vxdisksetup -i 3pardata0_22 2.将新增加的磁盘合并到磁盘组中 # vxdg -g testdg01 adddis ...

  2. AQS之ReentrantReadWriteLock精讲分析上篇

    1.用法 1.1 定义一个安全的list集合 public class LockDemo { ArrayList<Integer> arrayList = new ArrayList< ...

  3. 阿里云OSS对象存储服务(一)

    一.开通"对象存储OSS"服务 申请阿里云账号 实名认证 开通"对象存储OSS"服务 进入管理控制台 二.控制台使用 1.创建Bucket 命名:guli-fi ...

  4. 图像分类学习:X光胸片诊断识别----迁移学习

    引言   刚进入人工智能实验室,不知道是在学习机器学习还是深度学习,想来他俩可能是一个东西,查阅之后才知道这是两个领域,或许也有些交叉,毕竟我也刚接触,不甚了解.   在我还是个纯度小白之时,写下这篇 ...

  5. OpenStack使用OVN

    1. Controller节点 1.1 安装 OVS和OVN 安装 Python3.7: yum -y groupinstall "Development tools" yum - ...

  6. Java并发包源码学习系列:阻塞队列实现之PriorityBlockingQueue源码解析

    目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法t ...

  7. 三路握手 三报文握手 TIME_WAIT three way handshake three message handshake

    UNIX网络编程卷1:套接字联网API(第3版) 第2章 传输层:TCP.UDP和SCTP 2.4 TCP TCP不能被描述成100%可靠的协议 数次重传失败,则放弃 数据的可靠递送和故障的可靠通知 ...

  8. 有状态(Stateful)应用的容器化 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1020178

    有状态(Stateful)应用的容器化 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1020178

  9. You shouldn't use *any* general-purpose hash function for user passwords, not BLAKE2, and not MD5, SHA-1, SHA-256, or SHA-3

    hashlib - Secure hashes and message digests - Python 3.8.3 documentation https://docs.python.org/3.8 ...

  10. 利用Mixins扩展类功能

    8.18 利用Mixins扩展类功能 - python3-cookbook 3.0.0 文档 https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...