| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > 软件开发

基于Ubuntu和Bochs:用汇编程序写的BIOS

时间:2007-11-21 10:57:31  来源:Linux联盟收集整理  作者:
 

一.准备: xYeLinux联盟

1.Bochs仿真软件比较好,因为Bochs仿真了x86的硬件环境(CPU的指令)极其外围设备,因此很容易被移植到其他平台。 xYeLinux联盟

我从Bochs官方网站http://bochs.sourceforge.net下载了Bochs2.2.1版本,现在已经发布了2.3.5版本了,但我喜欢用老的,说不上为什么,纯粹个人喜好。 xYeLinux联盟

2.ubuntu7.10系统,没什么好说的。 xYeLinux联盟

二.开始: xYeLinux联盟

1.在ubuntu7.10编写以下代码,保存为bootsect.s文件: xYeLinux联盟

.globl begtext,begdata,begbss,endtext,enddata,endbss xYeLinux联盟

.text !正文段 xYeLinux联盟

begtext: xYeLinux联盟

.data !数据段 xYeLinux联盟

begdata: xYeLinux联盟

.bss !未初始化数据段 xYeLinux联盟

begbss: xYeLinux联盟

.text xYeLinux联盟

BOOTSEG = 0x07c0 !BIOS加载bootsect代码的原始段地址 xYeLinux联盟

entry start xYeLinux联盟

start: xYeLinux联盟

jmpi go,BOOTSEG !段间跳转 xYeLinux联盟

go: mov ax,cs xYeLinux联盟

mov ds,ax xYeLinux联盟

mov es,ax xYeLinux联盟

mov [msg1+17],ah !0x07->替换字符串中一个点符号,喇叭就会叫一声 xYeLinux联盟

mov cx,#20 !共显示20个字符,包括回车换行 xYeLinux联盟

mov dx,#0x1010 !msg1字符串将显示在屏幕第17行,第17列 xYeLinux联盟

mov bx,#0x000c !字符显示为红色 xYeLinux联盟

mov bp,#msg1 !指向要显示的字符串(以后的中断要用到的) xYeLinux联盟

mov ax,#0x1301 !写字符串并移动光标到串结尾处 xYeLinux联盟

int 0x10 !BIOS中断调用0x10,功能0x13,子功能0x01 xYeLinux联盟

mov ax,#10000 xYeLinux联盟

loop1: dec ax xYeLinux联盟

jnz loop1 !延时 xYeLinux联盟

mov cx,#40 xYeLinux联盟

mov dx,#0x1210 xYeLinux联盟

mov bx,#0x000c xYeLinux联盟

mov bp,#msg2 xYeLinux联盟

mov ax,#0x1301 xYeLinux联盟

int 0x10 xYeLinux联盟

loop0:jmp loop0 xYeLinux联盟

msg1: .ascii "Loading system......" xYeLinux联盟

.byte 13,10 xYeLinux联盟

msg2:.ascii "Welcom To jhx0301's Space! ! !" xYeLinux联盟

.byte 13,10 xYeLinux联盟

.org 510 xYeLinux联盟

.word 0xAA55 xYeLinux联盟

.text xYeLinux联盟

endtext: xYeLinux联盟

.data xYeLinux联盟

enddata: xYeLinux联盟

.bss xYeLinux联盟

endbss: xYeLinux联盟

关键代码我已经注释了,相信大家都能看懂。 xYeLinux联盟

2.编译 xYeLinux联盟

root@jhx-ubuntu:~# as86 -0 -a -o bootsect.o bootsect.s xYeLinux联盟

这个命令利用as86汇编器对bootsect.s进行编译生成bootsect.o文件。 xYeLinux联盟

root@jhx-ubuntu:~# ld86 -0 -s -o bootsect bootsect.o xYeLinux联盟

这个命令使用ld86对目标文件执行链接操作,最后生成MINIX结构的可执行文件bootsect. xYeLinux联盟

root@jhx-ubuntu:~# ls xYeLinux联盟

bootsect bootsect.o bootsect.s bootsect.s~ whatsnew.txt xYeLinux联盟

root@jhx-ubuntu:~# ls -l xYeLinux联盟

总用量 28 xYeLinux联盟

-rwxr-xr-x 1 root root 544 2007-11-19 20:30 bootsect xYeLinux联盟

-rw-r--r-- 1 root root 318 2007-11-19 20:30 bootsect.o xYeLinux联盟

-rwxr-xr-x 1 root root 654 2007-11-19 20:30 bootsect.s xYeLinux联盟

-rw-r--r-- 1 root root 641 2007-11-19 20:27 bootsect.s~ xYeLinux联盟

-rw-r--r-- 1 root root 11789 2007-11-18 15:04 whatsnew.txt xYeLinux联盟

因为最后我是通过软盘来启动这个boot的,所以大小不能超过512字节,但是通过ls xYeLinux联盟

命令发现bootsect现在有544字节,长了32字节,其实这多出来的32字节就是MINIX可执行文件的头结构,我是通过手工去掉这32个字节的,命令如下: xYeLinux联盟

root@jhx-ubuntu:~# dd bs=32 if=bootsect of=jhx skip=1 xYeLinux联盟

记录了 16+0 的读入 xYeLinux联盟

记录了 16+0 的写出 xYeLinux联盟

512 字节 (512 B) 已复制,0.000338889 秒,1.5 MB/秒 xYeLinux联盟

利用dd命令将bootsect多出来的32字节删掉并且将得到的512字节的可执行文件以jhx的名字输出,jhx就是我名字的缩写了,在再用ls -l查看,果然生成了大小为512字节的jhx可执行文件了,我要的就是它了。 xYeLinux联盟

root@jhx-ubuntu:~# ls -l xYeLinux联盟

总用量 32 xYeLinux联盟

-rwxr-xr-x 1 root root 544 2007-11-19 20:30 bootsect xYeLinux联盟

-rw-r--r-- 1 root root 318 2007-11-19 20:30 bootsect.o xYeLinux联盟

-rwxr-xr-x 1 root root 654 2007-11-19 20:30 bootsect.s xYeLinux联盟

-rw-r--r-- 1 root root 641 2007-11-19 20:27 bootsect.s~ xYeLinux联盟

-rw-r--r-- 1 root root 512 2007-11-19 20:31 jhx xYeLinux联盟

-rw-r--r-- 1 root root 11789 2007-11-18 15:04 whatsnew.txt xYeLinux联盟

由于我在VMware上安装的虚拟机,并且没有启动samba服务,只能用共享文件夹了。 xYeLinux联盟

将jhx拷贝到共享文件夹下: xYeLinux联盟

root@jhx-ubuntu:~# cp jhx /mnt/hgfs/Untitled-1/ xYeLinux联盟

3.配置Bochs xYeLinux联盟

我安装的Bochs是windows版本的,当然你也可以用linux版本的,还是个人喜好了。 xYeLinux联盟

注:首先一定要把在ubuntu下编译通过的可执行文件jhx拷贝到Bochs的安装目录下 xYeLinux联盟

成功安装Bochs后,在他的安装目录下有一个bochsrc-simpel.txt文件,这个是一个配置文件的模板,你可以根据你的需要进行剪裁:一般如果同软盘来启动的话,只要保留以下几个必要的配置就可以了: xYeLinux联盟

vgaromimage: file=$BXSHARE/VGABIOS-elpin-2.40//默认 xYeLinux联盟

romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000//默认。 xYeLinux联盟

megs: 16 //由于我的boot程序小,内存申请16M足够了 xYeLinux联盟

floppya: 1_44="jhx", status=inserted//我的启动代码的名字 xYeLinux联盟

ata0-master: type=disk, path="jhx", mode=flat,cylinders=227, heads=16, spt=63 //一些启动的属性,如启动时启动的路径,是以安装目录为根路径的。 xYeLinux联盟

这个配置文件是txt格式的,你要把他的后缀名改为.bxrc,即bochsrc.bxrc,系统运行的时候才能正确识别。当后缀名改过之后,你会发现bochsrc.bxrc变成了一个可执行文件,双击后成功进入系统,大功告成!!! xYeLinux联盟

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目更新
栏目热门