您的位置:首页 > 编程语言

01在Bochs中运行引导扇区框架代码

2016-11-01 18:48 204 查看

《Linux内核完全注释》—-在Bochs中运行引导扇区框架代码

一、说明

本文是学习了《Linux内核完全注释》—3.1as86汇编器这一节内容的学习总结。

二、具体的实现步骤

1.首先是书的源代码,命名为boot.s

!
! boot.s -- bootsect.s的框架程序,用代码0x07替换串msg1中1字符,然后在屏幕第1行上显示。
!
.global begtext, begdata, begbss, endtext, enddata, endbss  !全局标识符,供ld86链接使用。
.text
begtext:
.data                               !数据段
begdata:
.bss                                !未初始化数据段
begbss:
.text                               !正文段
BOOTSEG = 0x07c0                    !BIOS加载bootsect代码的原始段地址

entry start                         !告知链接程序,程序从start标号处开始执行
start:
jmpi    go, BOOTSEG         !段间跳转,INITSEG指出跳转段地址,标号go是偏移地址
go:     mov     ax, cs              !段寄存器cs值->ax,用于初始化数据段寄存器ds和es
mov     ds, ax
mov     es, ax
mov     [msg1+17], ah       !0x07->替换字符串中1个符号,喇叭将会鸣一声
mov     cx, #20             !共显示20个字符,包换回车换行符
mov     dx, #0x1009         !字符串将显示在屏幕第17行,第5列处
mov     bx, #0x000c         !字符串显示属性(红色)
mov     bp, #msg1           !指向要显示的字符串(中断调用要求)
mov     ax, #0x1301         !写字符串并移动光标到串结尾处
int     0x10                !BIOS中断调用0x10,功能0x13,子功能01
loop1:  jmp     loop1               !死循环
msg1:   .ascii  "Loading system ..."!调用BIOS中断显示的信息,共20个ASCII码字符
.byte   13, 10              !表示BIOS中断显示的信息,共20个ASCII码字符
.org 510                            !表示以后语句从地址510(0x1FE)开始存放
.word 0xAA55                !有效引导扇区标志,供BIOS加载引导扇区使用
.text
endtext:
.data
enddata:
.bss
endbss:


2.安装as86,ld86汇编器和链接器

我用的是Ubuntu 16.04,直接apt-get install安装as86,ld86失败了,这里从网上的朋友那里学了一手。

1)先用:
apt-cache search as86 ld86
这个命令查找as86,ld86在那里。

2)然后:
sudo apt-get install bin86
即可。

3.编译boot.s文件

编译的话按照书上的命令就可以编译成功,这里就不多提了。

4.用Bochs进行仿真

我是按书里讲的,用Bochs这款软件进行仿真。首先需要制作镜像文件,然后在Bochs中加载镜像文件就可以看到书中的最后的演示效果了。

1)首先安装bochs:
sudo apt-get install bochs


2)制作镜像文件:安装好bochs后会附带一个bximage这个工具,我们可以用它来制作镜像文件。

a)直接在命令行运行bximage这个命令,会有制作向导。

b)过程如下:

yinzhongkai@yinzhongkai:~/workspace/linux/src$ bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd  //这里是问要制作软盘还是硬盘,先制作软盘,因为网上学的

Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44]                        //这里默认就好,因为制作的是软盘,一般为1.44M
I will create a floppy image with
cyl=80                       //这里是生成软盘的信息大小为1.44M
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560

What should I name the image?
[a.img]                       //这里是制作镜像文件的名字,我把它命名为linux.img

Writing: [] Done.

I wrote 1474560 bytes to a.img.

The following line should appear in your bochsrc:
floppya: image="a.img", status=inserted
yinzhongkai@yinzhongkai:~/workspace/linux/src$


3)将可执行文件boot的内容拷贝到linux.img中

命令如下:
dd bs=32 if=boot of=linux.img skip=1
,解释这个命令

a)bs=32一次性读或写32个字节和skip=1配合,跳过boot开头的32个字节,不复制到linux.img中

b)if=boot输入文件为boot

c)of=linux.img输出文件为linux.img

经过上面的步骤就制作好了镜像文件。

4)编写bochs配制文件

将bochs示例文件拷贝到当前目录下,重命名为
linux.bxrc
cp /usr/share/doc/bochs/examples/bochsrc.gz ./linux.bxrc
。改写配置文件
linux.bxrc


a)设置镜像文件为我们自己制作的linux.img.



b)修改启动方式为软盘启动.



5)经过以上几个步骤的文件结构



6)最后执行命令:
bochs -f linux.bxrc
用bochs加载镜像文件

三、效果图

附上效果图



在bochs运行过程中跳出了好多窗口,我这里没有管他,直接continue的,是我们配置的linux.bxrc文件还有问题,但是没有关系,因为我们只是运行的引导扇区框架代码,这些问题都没有影响;还有一个原因是我还不知道怎么解决(好尴尬啊!)。不过随着我的深入学习,我相信这些问题都应该不在话下的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: