0x00 前言

自己动手写操作系统,自然需要一个承载程序的运行环境,这一章记录我使用bochs遇到的坑,凌晨十二点半才填完坑。

这次记录的是使用bochs完整实现一个最简单的操作系统(其实根本不算操作系统,只是通过硬盘启动个mbr程序)。

0x01 bochs

1.安装

安装比较简单了,我没有使用源码安装,不想再折腾那个了,不然估计我就没戏能开始了。

yum install bochs bochs-x -y

需要装两个东东,后面一个如果不过,会报错,如果报错可以看我后面的错误记录。

2.配置文件

bochs需要一个配置文件,来描述硬件信息。文件里面有详细的注释。

配置文件就叫bochs.disk,名字可以随意,后缀是什么也无所谓。

###############################################################
# Configuration file for Bochs
################################################################ how much memory the emulated machine will have
megs: 32# 对应真实机器的BIOS和VGA BIOS
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest# 设置bochs使用的磁盘,软盘使用关键字floppya,硬盘使用disk
# 若有多个软盘,可写floppya,floppyb
#floppya: 1_44=a.img, status=inserted# choose the boot disk.
# 默认是软盘,注释掉,改为disk
#boot: floppy
boot: disk# where do we send log messages?
log: /tmp/bochsout.txt
# disable the mouse
mouse: enabled=0# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.mapata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14#这一句是根据bximage生成的,后面会解释。
ata0-master: type=disk, path="/home/dante/workspace/os/hd60M.img", mode=flat, cylinders=121, heads=16, spt=63

3.制作虚拟硬盘

这里使用bochs配备的bximage。

root@dante-pc:/home/dante/workspace/os# bximage -hd -mode='flat' -size=60 -q hd60M.img========================================================================bximageDisk Image Creation Tool for Bochs$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================I will create a 'flat' hard disk image withcyl=121heads=16sectors per track=63total sectors=121968total size=59.55 megabytesWriting: [] Done.I wrote 62447616 bytes to hd60M.img.The following line should appear in your bochsrc:ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121, heads=16, spt=63

看到输出的最后一句,指示我们把这句写入bochs的配置文件中。

4.程序写入硬盘

此处的mbr.bin是通过汇编编译后生成的文件,下一篇博客专门记录这次实现的汇编代码。

代码实现的内容就是在屏幕上打印几个字符。

××注意:×如无必要,后面的参数就不要改了,如果想知道每个参数改了×改后在启动的时候会出错。不过也可以看一下错误信息多了解点知识。

root@dante-pc:/home/dante/workspace/os# dd if=mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc
记录了0+1 的读入
记录了0+1 的写出
502字节(502 B)已复制,0.000140041 秒,3.6 MB/秒

5.启动

bochs -f bochs.disk

这样就能看到在界面上打印的字符了。

0x02 错误列表

错误1

错误信息

Event type: PANIC
Device: [     ]
Message: dlopen failed for module 'x': file not foundA PANIC has occurred.  Do you want to:cont       - continue executionalwayscont - continue execution, and don't ask again.This affects only PANIC events from device [     ]die        - stop execution nowabort      - dump core debug      - continue and return to bochs debugger
Choose one of the actions above: [die] 

分析和解决

这是由于在安装的时候,少安装了个bochs-x包,安装即可。

sudo apt-get install bochs-x

错误2

错误信息

# bochs -f bochs.disk
========================================================================Bochs x86 Emulator 2.6Built from SVN snapshot on September 2nd, 2012Compiled on Aug 10 2015 at 10:27:14
========================================================================
00000000000i[     ] LTDL_LIBRARY_PATH not set. using compile time default '/usr/lib/bochs/plugins'
00000000000i[     ] BXSHARE not set. using compile time default '/usr/share/bochs'
00000000000i[     ] lt_dlhandle is 0x3ae4fe0
00000000000i[PLGIN] loaded plugin libbx_unmapped.so
00000000000i[     ] lt_dlhandle is 0x3ae6ba0
00000000000i[PLGIN] loaded plugin libbx_biosdev.so
00000000000i[     ] lt_dlhandle is 0x3ae74e0
00000000000i[PLGIN] loaded plugin libbx_speaker.so
00000000000i[     ] lt_dlhandle is 0x3ae7d50
00000000000i[PLGIN] loaded plugin libbx_extfpuirq.so
00000000000i[     ] lt_dlhandle is 0x3ae8590
00000000000i[PLGIN] loaded plugin libbx_parallel.so
00000000000i[     ] lt_dlhandle is 0x3aea240
00000000000i[PLGIN] loaded plugin libbx_serial.so
00000000000i[     ] lt_dlhandle is 0x3aede20
00000000000i[PLGIN] loaded plugin libbx_gameport.so
00000000000i[     ] lt_dlhandle is 0x3aee8c0
00000000000i[PLGIN] loaded plugin libbx_iodebug.so
00000000000i[     ] reading configuration from bochs.disk
00000000000p[     ] >>PANIC<< reading from bochs.disk failed
00000000000e[CTRL ] notify called, but no bxevent_callback function is registered
00000000000i[CPU0 ] CPU is in real mode (active)
00000000000i[CPU0 ] CS.mode = 16 bit
00000000000i[CPU0 ] SS.mode = 16 bit
00000000000i[CPU0 ] EFER   = 0x00000000
00000000000i[CPU0 ] | EAX=00000000  EBX=00000000  ECX=00000000  EDX=00000000
00000000000i[CPU0 ] | ESP=00000000  EBP=00000000  ESI=00000000  EDI=00000000
00000000000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf ZF af PF cf
00000000000i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00000000000i[CPU0 ] |  CS:0000( 0000| 0|  0) 00000000 00000000 0 0
00000000000i[CPU0 ] |  DS:0000( 0000| 0|  0) 00000000 00000000 0 0
00000000000i[CPU0 ] |  SS:0000( 0000| 0|  0) 00000000 00000000 0 0
00000000000i[CPU0 ] |  ES:0000( 0000| 0|  0) 00000000 00000000 0 0
00000000000i[CPU0 ] |  FS:0000( 0000| 0|  0) 00000000 00000000 0 0
00000000000i[CPU0 ] |  GS:0000( 0000| 0|  0) 00000000 00000000 0 0
00000000000i[CPU0 ] | EIP=00000000 (00000000)
00000000000i[CPU0 ] | CR0=0x00000000 CR2=0x00000000
00000000000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
bx_dbg_read_linear: physical memory read error (phy=0x0000000000000000, lin=0x0000000000000000)
00000000000i[CTRL ] quit_sim called with exit code 1

分析和解决

将boch.disk文件中的vgaromimage: /usr/share/vgabios/vgabios.bin改为vgaromimage: file=/usr/share/vgabios/vgabios.bin即可,出现这种错误的,很多是因为直接使用了orange‘s的代码。

错误3

错误信息

启动bochs后没有反应,一直是黑屏。

......
00000000000e[     ] bochs.disk:28: 'keyboard_mapping' will be replacedby new 'keyboard' option.
00000000000i[     ] lt_dlhandle is 0x36ac110
00000000000i[PLGIN] loaded plugin libbx_x.so
00000000000i[     ] installing x module as the Bochs GUI
00000000000i[     ] using log file /tmp/bochsout.txt
Next at t=0
(0) [0x00000000fffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b         ; ea5be000f0
<bochs:1>

分析和解决

因为网路不好,也没有翻墙,官网进不去,在一个论坛里面看到,直接输入c接可以了。

错误4

错误信息

启动后出现无启动设备的错误。

Boot failed: not a bootable device.
FATAL:No bootable device.

分析和解决

这个问题我也忘了具体是怎么改的了,不过根据回忆,应该是和程序相关,我中间改过一次程序,冲洗编译并使用dd写入后就没问题了。

我和网上其它人遇到的错误情形还不太一样。

http://blog.csdn.net/zhaodedong
http://zhaodedong.leanote.com
http://zhaodedong.com


2016-04-07 00:56:00 hnds


自己动手写操作系统之1:bochs初步使用相关推荐

  1. 《自己动手写操作系统》读书笔记——初识保护模式

    <自己动手写操作系统>读书笔记--初识保护模式 http://www.cnblogs.com/pang123hui/archive/2010/11/27/2309930.html 书本第三 ...

  2. 自己动手写操作系统之环境构建篇

    自己动手写操作系统之环境构建篇 最近开始看自己动手写操作系统,但是书中采用软盘启动很是郁闷,于是想是否可以从优盘启动呢?作为一名BIOS工程师,曾经用优盘启动过dos,linux等系统,于是做了如下尝 ...

  3. 自己动手写操作系统--个人实践

    近期開始看于渊的<自己动手写操作系统>这本书,刚開始看就发现做系统的引导盘居然是软盘!心里那个汗啊! 如今都是U盘了,谁还用软盘.于是考虑用U盘. 于是開始下面步骤: 1.既然书上说给先要 ...

  4. 「操作系统」《自己动手写操作系统》1.1前期准备工作

    一.软硬件 1.硬件 一台计算机(笔者使用的是Win7 x64操作系统) 2.软件 点击此处下载<自己动手写操作系统>的光盘配套文件以及相应工具 汇编编译器:NASM(资源文件中有) 软盘 ...

  5. 自己动手写java虚拟机_自己动手写操作系统(要了解的知识点)

    自己动手写操作系统(开篇) 自己动手写操作系统(字符显示) 说明:Intel 8086 或者不同的处理器,开机寄存器数据可能不一样,但是大致原理差不多 了解过计算机启动的同学肯定知道,当计算机启动的时 ...

  6. 全面剖析《自己动手写操作系统》第四章---加载Loader.bin

    全面剖析<自己动手写操作系统>第四章--FAT12文件系统    http://blog.csdn.net/zgh1988/article/details/7284834 1.突破512字 ...

  7. 自己动手写操作系统0

    文章目录 自己动手写操作系统0 环境搭建 NASM VirtualBox 添加软盘启动 VMware 开启虚拟机 其他软件 Floppy 自己动手写操作系统0 参考余渊老师写的<自己动手写操作系 ...

  8. 自己动手写操作系统——(1)将引导写入U盘

    为什么写博客呢,想了一下,首先是为了给自己留着复习用,因为时间一长,肯定有好多东西会忘记的,在这里留个记录,以后再整理起来就不会太麻烦了:再者是为了分享一下经验,由于在下比较愚笨,说不定在哪个方面就理 ...

  9. 磨刀不误砍柴工 —— 自己动手写操作系统 入门导引

    磨刀不误砍柴工 刺猬@http://blog.csdn.net/littlehedgehog <自己动手写操作系统>其实阅读所需要的前提不过只是C和汇编了,里面涉及到很多操作系统的东西.于 ...

  10. 磨刀不误砍柴工 ——《自己动手写操作系统》入门导引

    磨刀不误砍柴工 刺猬@http://blog.csdn.net/littlehedgehog <自己动手写操作系统>其实阅读所需要的前提不过只是C和汇编了,里面涉及到很多操作系统的东西.于 ...

最新文章

  1. 洛谷 P1816 忠诚
  2. CISCO NAT 配置
  3. js判断是否为数字_第23题:JavaScript 中如何判断变量是否为数字 ?
  4. Java扑克牌(洗牌Collections.shuffle)
  5. 笔记本电脑清洁小记(附螺丝滑丝处理,常见意外情况)
  6. checkStyle -- 代码风格一致
  7. 双向a*搜索算法_双向搜索算法
  8. python执行一段代码_我发现了个 Python 黑魔法,执行任意代码都会自动念上一段 『平安经』...
  9. MySQL--启动和关闭MySQL服务
  10. linux 显卡扩展坞,我的新玩意儿——Mac mini2018+Razer core(附显卡扩展坞类比图)...
  11. 【leetcode-贪心】加油站/柠檬水找零/分发糖果/跳跃游戏/分发饼干/种花问题/非递减数列
  12. 英特尔CAS缓存加速软件优化SSD性能
  13. Pygame实战之外星人入侵NO.9——消灭外星人
  14. 前端代码 (html css JavaScript DOM JSON)
  15. STM32+二氧化碳传感器(FS00301)
  16. 对 kubenetes 扩容后端 rbd 磁盘容量
  17. CSAPP:MallocLab
  18. 外贸盒子x96max+ 搭建Armbian系统 (附国内可用的img镜像下载地址)
  19. 北京密云区携手锐捷打造新一代教育城域网 为互联网+教育“开山铺路”
  20. 腾讯域名防封 微信/QQ域名检测,域名防封的原理

热门文章

  1. 基于图像识别的火灾检测系统设计
  2. 自己读Go程序设计语言的一些总结(更新ing...)
  3. 本地安装易邮邮箱服务器并用foxmail 连接测试
  4. 【记录】【解决方案】java发邮件错误:Couldn‘t connect to host, port: localhost, 25; timeout -1;易邮SMTP服务器无法启动;
  5. [python]python生成md5
  6. StringUtil.isEmpty(str)、StringUtil.isNotEmpty(str)和StringUtil.isBlank(str)区别
  7. OpenCL学习入门
  8. 关于imx8mp的es8316的芯片调试
  9. python快速查城市的地理坐标
  10. 系统防御工程v0.2