操作系统实践

一:以硬盘方式启动bochs

1.准备工作:安装计算机硬件模拟器:

   1.1 安装bochs编译环境(即bochs运行所需要的环境):

安装C/C++的编译环境【gcc以及g++】,

sudo apt-get install build-essential

安装图形化的bochs【模拟显卡等硬件】

sudo apt-get install xorg-dev

安装依赖库

sudo apt-get install libgtk2.0-dev

 1.2安装bochs和bochs-x软件

apt install bochs

sudo apt-get install bochs-x

sudo apt-get install bochs-sdl

  终端输入bochs,弹出bochs的启动配置文件。按6便可直接启动bochs,启动成功会弹出bochs x86-64 emulator 的窗口

bochs的官网:http://bochs.sourceforge.net/

 

   1.3 创建映像文件:

(我是在根目录home/lmj下创建的映像文件dimos.img)

   

dd if=你的镜像路径(即编译得到的boot.bin的路径) of=dimos.img          

1.4编写系统启动的驱动程序(一般都是用汇编语言来写的,这里也不例外)

 

找个目录新建:  touch boot.asm        编辑boot.asm

org		07c00h		;告诉编译器程序加载到7c00处
	mov		ax, cs
	mov		ds, ax
	mov		es, ax
	call	DispStr			;调用显示字符串例程
	jmp		$		;无限循环
DispStr:
	mov		ax, BootMessage
	mov		bp, ax		;ES:BP = 串地址
	mov		cx, 16		;CX = 串长度
	mov		ax, 01301h	;AH = 13h, AL = 01h
	mov		bx, 000ch	 ;页号为0(BH= 0)黑底红字(BL = 0Ch,高亮)
	mov		dl, 0
	int		10h		;10h号中断
	ret
BootMessage:		db		"Hello, OS world!"
times	510-($-$$)	db		0	;填充剩下的空间,使生成的二进制代码恰好为512字节
dw		0xaa55				;结束标志

代码解释:

这是一个简单的引导扇区程序。

可能有些同学会有疑问——为什么第一句要用org指令将我们的代码定位到7C00H处。这是因为,当计算机电源被打开时,它会先进行加电自检(POST),然后寻找启动盘,如果是选择从软盘启动(我们的设置就是从软盘启动),计算机就会检查软盘的0面0磁道1扇区,如果它以0xAA55结束(正是我们上面代码的结束标志),则BIOS认为它是一个引导扇区。一旦BIOS发现了引导扇区,就会将这512字节的内容装载到内存地址0000:7C00处,然后跳转到0000:7C00处将控制权彻底交给这段引导代码(这就是原因)。到此,计算机不再由BIOS中固有的程序来控制,而变成有操作系统的一部分来控制。
--------------------- 
作者:尚书左仆射 
来源:CSDN 
原文:https://blog.csdn.net/wzxq123/article/details/53009730 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

这是汇编语言:需要编译成机器语言(即可执行程序),这里我们使用nasm编译工具

我们把这段代码用NASM编译一下:

?

1

$nasm boot.asm -o boot.bin

如果没有安装NASM,可以用如下命令进行安装:

?

1

$sudo apt-get install nasm

编译完成后,会在当前目录生成一个512字节的boot.bin文件。

 

1.5将驱动程序放入刚才创建的硬盘里:

     使用dd命令将它写进刚刚创建的软盘映像a.img的第一个扇区:

1

$dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

 

我的代码:dd if=boot.bin of=dimos.img

启动:

将boot.bin  ,dimos.img移动到bochs的安装目录:

bochs -f /usr/share/bochs/bochsrc.bxrc

 

其中bochsrc.bxrc的配置文件如下:

###############################################################
# 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.map
keyboard:keymap=/usr/share/bochs/keymaps/sdl-pc-us.map
#keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/sdl-pc-us.map
display_library: sdl
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14

#这一句是根据bximage生成的,后面会解释。
ata0-master: type=disk, path=/usr/share/bochs/dimos.img, mode=flat, cylinders=121, heads=16, spt=63
#ata0-master: type=disk, path="/usr/share/bochs/dimos.img", mode=flat, cylinders=121, heads=16, spt=63

下面谈谈以上过程中遇到的问题:

1.Message: ata0-0: specified geometry doesn't fit on disk image

2.00000000000e[     ] /usr/share/bochs/bochsrc.bxrc:29: 'keyboard_mapping' will be replaced by new 'keyboard' option.

解决:

请参考文章:=================如何配置并启动bochs

https://blog.csdn.net/ByChen623/article/details/53619084

 

bochs启动原理:(如何突破512字节):

https://blog.csdn.net/cielozhang/article/details/6171783

 

备注:如果硬盘方式启动失败,可尝试第二节的软盘方式启动。

 

二:以软盘方式启动bochs:

              2.1  在bochs的安装目录下:创建   a.asm   : 编辑代码:

org             07c00h          ;告诉编译器程序加载到7c00处
        mov             ax, cs
        mov             ds, ax
        mov             es, ax
        call    DispStr                 ;调用显示字符串例程
        jmp             $               ;无限循环
DispStr:
        mov             ax, BootMessage
        mov             bp, ax          ;ES:BP = 串地址
        mov             cx, 16          ;CX = 串长度
        mov             ax, 01301h      ;AH = 13h, AL = 01h
        mov             bx, 000ch        ;页号为0(BH= 0)黑底红字(BL = 0Ch,高
亮)
        mov             dl, 0
        int             10h             ;10h号中断
        ret
BootMessage:            db              "Hello, OS world!"
times   510-($-$$)      db              0       ;填充剩下的空间,使生成的二进制>代码恰好为512字节
dw              0xaa55                          ;结束标志

            2.2 编译成二进制文件:  sudo nasm a.asm -o a.bin

     2.3 创建操作系统的软盘:bximage                  (将hd改为fd,软盘名称设为a.img,其他的默认即可)

     2.4 创建bochs的启动配置文件:  vi .bochsrc                            文件内容如下:    

megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
#floppya: 1_44=a.img, status=inserted  1_44   image="/home/lmj/文档/dimos/a.img"
floppya: 1_44="a.img", status=inserted
boot: floppy
log: bochsout.txt
mouse: enabled=0
keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map

    2.5 将驱动程序写入软盘中:sudo dd if=a.bin of=a.img

   2.6.下面是我的完整运行过程图:

 

 

备注:输入完   bochs -f .bochsrc   后并不会马上弹出hello world,因为我们是用调试模式打开的,所以需要接着输入c,让程序继续往下运行

三:常见错误及解决方案:

     3.1  参考这篇博文:总结的很全面。

        https://blog.csdn.net/zhaodedong/article/details/51082128

    3.2  我出现的问题是:启动后出现无启动设备的错误。

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

     我把编译文件a.asm的代码删除之后,在网上又找了一份bochs启动的代码。复制编译,重新dd进软盘就ok了

  3.3最后再说一下:bochs的配置文件.bochsrc要注意的问题

megs: 32                            #虚拟一个32的计算机
romimage: file=$BXSHARE/BIOS-bochs-latest             #要加上file=  (该文件在bochs的安装目录下,这里是文件的相对路径,$BXSHARE他会自动找到你的安装目录,不需要你去配置)
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest          #同上
#floppya: 1_44=a.img, status=inserted  1_44   image="/home/lmj/文档/dimos/a.img"
floppya: 1_44="a.img", status=inserted             #这是配置软盘的映像文件的位置,这是相对路径,a.img的位置相对与.bochsrc文件而言,因为我的a.img与.bochsrc位于统一目录,所以这里配成a.img,我的bochs版本是2.6,所以要用1_44="a.img",不能用image=“”
boot: floppy          #操作系统的启动方式:这里是软盘驱动的方式启动
log: bochsout.txt
mouse: enabled=0
keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map       #固定配置,不用改,跟我的配置相同就可以了

今天就写到这里。

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值