Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1945408
  • 博文数量: 383
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 4061
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-24 18:53
文章分类

全部博文(383)

文章存档

2011年(1)

2010年(9)

2009年(276)

2008年(97)

我的朋友

分类: LINUX

2009-05-15 20:25:18

 

一.准备:

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

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

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

二.开始:

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

.globl begtext,begdata,begbss,endtext,enddata,endbss    !全局标识符,供ld86链接使用
   .text  !正文段
   begtext:
   .data  !数据段
   begdata:
   .bss   !未初始化数据段
   begbss:
   .text 

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

entry start
   start:
        jmpi go,BOOTSEG    !段间跳转至0x07c0:go处,该跳转语句会把cs寄存器加载为0x07c0(原为0)
   go:  mov ax,cs
        mov ds,ax
        mov es,ax
        mov [msg1+17],ah   !0x07->替换字符串中的一个符号,喇叭就会叫一声
        mov cx,#20         !共显示20个字符,包括回车换行
        mov dx,#0x1010     !字符将显示在屏幕第17行,第17列
        mov bx,#0x000c     !字符显示为红色
        mov bp,#msg1       !执向要显示的字符串(以后的中断要用到)
        mov ax,#0x1301     !写字符串并移动光标到串结尾处
        int 0x10           !BIOS屏幕显示中断int 0x10。寄存器cx中是字符串长度值,dx中是显示位置值,bx中显示使用的字符属性,es:bp指向字符串
        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......"    !调用BIOS中断显示的信息。共20个ASCII码字符
       .byte 13,10                      !回车换行
msg2:  .ascii "Welcome To wxju's Space! ! !"
       .byte 13,10                      !回车换行
.org 510                                 !表示以后语句从地址510(0x1FE)开始存放
       .word 0xAA55                     !引导扇区有效标志,供BIOS加载引导扇区使用。必须处于引导扇区最后2字节处
.text
endtext:
.data
enddata:
.bss
endbss:

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

2.编译

:~# as86 -0 -a -o bootsect.o bootsect.s

这个命令利用as86汇编器对bootsect.s进行编译生成bootsect.o文件。"-0"用于生成8086的16位目标程序;“-a”用于指定生成与GNU as和ld部分兼容的代码。 

注:为了支持按时as86,需要下下载bin86:

     sudo apt-get install bin86

:~# ld86 -0 -s -o bootsect bootsect.o

这个命令使用ld86对目标文件执行链接操作,最后生成MINIX结构的可执行文件bootsect. “-s”用于告诉连接器要去除最后生成的可执行文件中的符号信息。

:~# ls

bootsect bootsect.o bootsect.s bootsect.s~ whatsnew.txt

:~# 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个字节的,命令如下:

:~# dd bs=32 if=bootsect of=jhx skip=1

记录了 16+0 的读入

记录了 16+0 的写出

512 字节 (512 B) 已复制,0.000338889 秒,2.1 MB/秒

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

:~# 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服务,只能用共享文件夹了。

将wxju拷贝到共享文件夹下:

:~# 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="wxju", status=inserted//我的启动代码的名字

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

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

 

 

阅读(1784) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~