oslab oranges 一个操作系统的实现 实验一
实验目的:
搭建基本实验环境,熟悉基本开发与调试工具
对应章节:第一、二章
实验内容:
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 一个操作系统的实现 实验一的更多相关文章
- oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式
实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在 ...
- oslab oranges 一个操作系统的实现 实验四 认识保护模式(三):中断异常
实验目的: 理解中断与异常机制的实现机理 对应章节:第三章3.4节,3.5节 实验内容: 1. 理解中断与异常的机制 2. 调试8259A的编程基本例程 3. 调试时钟中断例程 4. 建立IDT,实现 ...
- oslab oranges 一个操作系统的实现 实验二 认识保护模式
https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...
- oslab oranges 一个操作系统的实现 实验三 认识保护模式(二):分页
实验目的: 掌握内存分页机制 对应章节:3.3 实验内容: 1.认真阅读章节资料,掌握什么是分页机制 2. 调试代码,掌握分页机制基本方法与思路 – 代码3.22中,212行---237行,设置断点调 ...
- oslab oranges 一个操作系统的实现 final
见 github https://github.com/TouwaErioH/subjects/tree/master/oslab-oranges
- 《一个操作系统的实现》 ubuntu系统环境配置
<一个操作系统的实现> ubuntu系统环境配置 电脑之前已经安装了gcc. 一.nasm安装:sudo apt-get install nasm或官网下载http://sourcefor ...
- 《Orange'S:一个操作系统的实现》笔记(一)
感觉自己对于操作系统始终没有一个清楚的概念,尤其最近困扰于实模式.保护模式以及寻址方式等一些概念.转而一想,所有的程序,最终都是操作的计算机资源,需要和操作系统打交道,所以操作系统有必要深入了解一下. ...
- x86汇编分页模式实验 --《ORANGE'S一个操作系统的实现》中 pmtest8.asm解析
序言(废话) : 在看书的过程中发现一开始不是很能理解pmtest8的目的,以及书上说得很抽象..于是在自己阅读过源代码后,将一些自己的心得写在这里. 正文 : 讲解顺序依然按照书上贴代码的顺序来.但 ...
- 《一个操作系统的实现》学习笔记(一) bochs源码安装及配置
前言:本机环境ubuntu 14.04 bochs 2.4.5 一.下载 官网 http://bochs.sourceforge.net/ 二.安装 1.将下载好的压缩包解压并进入该目录 .tar.g ...
随机推荐
- SP338 ROADS
题目描述 城市中有R条有向马路,n个马路连接点,通过每条马路都要花去一定费用.你现在在编号为1的连接点 ,手里有k元钱,要去n号连接点的最短路径的长度是多少?途中经过道路的花费不能超过k.注意:两个 ...
- [Usaco2007 Dec]Building Roads 修建道路
题目描述 Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场 ...
- 1.5V升5V芯片,1.5V升5V电路图规格书
常用的 5号,7号等 1.5V 干电池满电电压在 1.6V 左右,干电池输出耗电电压在 1V.适用PW5100,在 0.9V 时还能输出,彻底榨干干电池的电量. 1.5V 升5V 的芯片:PW5100 ...
- 【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)
Redis 基础以及进阶的两篇已经全部更新好了,为了字数限制以及阅读方便,分成两篇发布. 本篇主要内容为:NoSQL 引入 Redis ,以及在 Linux7 环境下的安装,配置,以及总结了非常详细的 ...
- Mybatis plus通用字段自动填充的最佳实践总结
在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time.update_time.update_by.create_by等用来维护数据记录的创建时间.修改 ...
- 同步与异步 Python 有何不同?
你是否听到人们说过,异步 Python 代码比"普通(或同步)Python 代码更快?果真是那样吗? 1 "同步"和"异步"是什么意思? Web 应用 ...
- Before you launch a goroutine, know when it will stop The Zen of Go
The Zen of Go https://the-zen-of-go.netlify.app/ Ten engineering values for writing simple, readable ...
- java中List元素移除元素的那些坑
https://blog.csdn.net/javageektech/article/details/96668890 List 的迭代器类 采用倒序移除 jdk1.8的写法 public sta ...
- Eclipse+Maven+Spring
1.首先按照how2j教程搭建Maven项目:http://how2j.cn/k/maven/maven-eclipse-maven-project/1332.html 2. 刚建好时没有资源文件夹的 ...
- Codeforces 1220D 思维 数学 二分图基础
原题链接 题意 我们有一个含多个正整数的集合B,然后我们将所有的整数,也就是Z集合内所有元素,都当做顶点 两个整数 \(i , j\) 能建立无向边,当且仅当 \(|i - j|\) 这个数属于B集合 ...