当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 自己用汇编程序写的一个简单BIOS程序(基于ubuntu和Bochs2.2.1)
帖子发表于 : 2007-11-19 21:57 

注册: 2007-11-16 15:52
帖子: 27
地址: 杭州
送出感谢: 0 次
接收感谢: 0 次
详细步骤请看我的blog http://blog.sina.com.cn/jhx0301
今天突然有了一种想写BIOS的想法,也许是心血来潮,呵呵.看了些资料,决定写一个简单的BIOS程序.
一.准备:
1.个人认为Bochs仿真软件比较好,因为Bochs仿真了x86的硬件环境(CPU的指令)极其外围设备,因此很容易被移植到其他平台.
我从Bochs官方网站http://bochs.sourceforge.net下载了Bochs2.2.1版本,现在已经发布了2.3.5版本了,但我喜欢用老的,说不上为什么,纯粹个人喜好.
2.ubuntu7.10系统,没什么好说的.
二.开始:
1.在ubuntu7.10编写以下代码,保存为bootsect.s文件:
.globl begtext,begdata,begbss,endtext,enddata,endbss
.text !正文段
begtext:
.data !数据段
begdata:
.bss !未初始化数据段
begbss:
.text
BOOTSEG = 0x07c0 !BIOS加载bootsect代码的原始段地址
entry start
start:
jmpi go,BOOTSEG !段间跳转
go: mov ax,cs
mov ds,ax
mov es,ax
mov [msg1+17],ah !0x07->替换字符串中一个点符号,喇叭就会叫一声
mov cx,#20 !共显示20个字符,包括回车换行
mov dx,#0x1010 !msg1字符串将显示在屏幕第17行,第17列
mov bx,#0x000c !字符显示为红色
mov bp,#msg1 !指向要显示的字符串(以后的中断要用到的)
mov ax,#0x1301 !写字符串并移动光标到串结尾处
int 0x10 !BIOS中断调用0x10,功能0x13,子功能0x01
mov ax,#10000
loop1: dec ax
jnz loop1 !延时

mov cx,#40
mov dx,#0x1210
mov bx,#0x000c
mov bp,#msg2
mov ax,#0x1301
int 0x10
loop0:jmp loop0
msg1: .ascii "Loading system......"
.byte 13,10
msg2:.ascii "Welcom To jhx0301's Space! ! !"
.byte 13,10
.org 510
.word 0xAA55
.text
endtext:
.data
enddata:
.bss
endbss:
关键代码我已经注释了,相信大家都能看懂.
2.编译
root@jhx-ubuntu:~# as86 -0 -a -o bootsect.o bootsect.s
这个命令利用as86汇编器对bootsect.s进行编译生成bootsect.o文件
root@jhx-ubuntu:~# ld86 -0 -s -o bootsect bootsect.o
这个命令使用ld86对目标文件执行链接操作,最后生成MINIX结构的可执行文件bootsect.

root@jhx-ubuntu:~# ls
bootsect bootsect.o bootsect.s bootsect.s~ whatsnew.txt
root@jhx-ubuntu:~# ls -l
总用量 28
-rwxr-xr-x 1 root root 544 2007-11-19 20:30 bootsect
-rw-r--r-- 1 root root 318 2007-11-19 20:30 bootsect.o
-rwxr-xr-x 1 root root 654 2007-11-19 20:30 bootsect.s
-rw-r--r-- 1 root root 641 2007-11-19 20:27 bootsect.s~
-rw-r--r-- 1 root root 11789 2007-11-18 15:04 whatsnew.txt
因为最后我是通过软盘来启动这个boot的,所以大小不能超过512字节,但是通过ls
命令发现bootsect现在有544字节,长了32字节,其实这多出来的32字节就是MINIX可执行文件的头结构,我是通过手工去掉这32个字节的,命令如下:
root@jhx-ubuntu:~# dd bs=32 if=bootsect of=jhx skip=1
记录了 16+0 的读入
记录了 16+0 的写出
512 字节 (512 B) 已复制,0.000338889 秒,1.5 MB/秒
利用dd命令将bootsect多出来的32字节删掉并且将得到的512字节的可执行文件以jhx的名字输出,jhx就是我名字的缩写了,嘿嘿......
现在再用ls -l查看,果然生成了大小为512字节的jhx可执行文件了,我要的就是它了
root@jhx-ubuntu:~# ls -l
总用量 32
-rwxr-xr-x 1 root root 544 2007-11-19 20:30 bootsect
-rw-r--r-- 1 root root 318 2007-11-19 20:30 bootsect.o
-rwxr-xr-x 1 root root 654 2007-11-19 20:30 bootsect.s
-rw-r--r-- 1 root root 641 2007-11-19 20:27 bootsect.s~
-rw-r--r-- 1 root root 512 2007-11-19 20:31 jhx
-rw-r--r-- 1 root root 11789 2007-11-18 15:04 whatsnew.txt
由于我在VMware上安装的虚拟机,并且没有启动samba服务,只能用共享文件夹了
将jhx拷贝到共享文件夹下:
root@jhx-ubuntu:~# cp jhx /mnt/hgfs/Untitled-1/
3.配置Bochs
我安装的Bochs是windows版本的,当然你也可以用linux版本的,还是个人喜好了.
注:首先一定要把在ubuntu下编译通过的可执行文件jhx拷贝到Bochs的安装目录下
成功安装Bochs后,在他的安装目录下有一个bochsrc-simpel.txt文件,这个是一个配置文件的模板,你可以根据你的需要进行剪裁:一般如果同软盘来启动的话,只要保留以下几个必要的配置就可以了:
vgaromimage: file=$BXSHARE/VGABIOS-elpin-2.40//默认
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000//默认
megs: 16 //由于我的boot程序小,内存申请16M足够了
floppya: 1_44="jhx", status=inserted//我的启动代码的名字
ata0-master: type=disk, path="jhx", mode=flat,cylinders=227, heads=16, spt=63 //一些启动的属性,如启动时启动的路径,是以安装目录为根路径的

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

图片


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-11-19 22:18 

注册: 2006-12-14 3:00
帖子: 614
送出感谢: 0 次
接收感谢: 0 次
路过
好像还没写过主板的bios.


_________________
提问的智慧


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-11-19 22:41 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
不错,mark


_________________
关注我的blog: ε==3


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-11-20 15:08 
头像

注册: 2006-11-03 21:20
帖子: 242
地址: 上海
送出感谢: 0 次
接收感谢: 0 次
faint~~~~~~~

这个bios。。。。。叫HelloWorld BIOS比较好。


_________________
Never had a dream come ture!
============================
Lenovo E42LT2390
CPU:T2390
RAM:1G DDRII 667*2
VGA:X3100
HD:Seagate 160G SataII
CD:Combo
Wireless:Intell 3945abg


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-11-20 21:42 
头像

注册: 2007-10-16 19:29
帖子: 296
送出感谢: 0 次
接收感谢: 0 次
我想请问LZ职业?


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-11-20 22:08 
头像

注册: 2006-01-17 14:39
帖子: 274
地址: Nanking
送出感谢: 0 次
接收感谢: 0 次
lz我崇拜你


_________________
ID:死乘把口, Matrix Chou
寨本网 山寨笔记本大本营


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-11-22 14:46 

注册: 2007-11-16 15:52
帖子: 27
地址: 杭州
送出感谢: 0 次
接收感谢: 0 次
我也是菜鸟 刚毕业的学生


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译