旅途

如果想飞得高,就该把地平线忘掉

开发自己的操作系统引导程序 转

开发自己的操作系统引导程序

  当你打开计算机时发生了什么?

  1.电源打开;2.BIOS开始执行;3.引导程序开始执行。

  引导程序的规定:你要有一个普通的二进制文件(COM 格式);大小是512个字节;最后两个字节一定是0AA55h;它能被载入到内存地址0x7C00。

  工具:

  NASM——是一个免费的汇编工具(有DOS/windows/Linux三种版本)

  PARTCOPY2.0——DOS下可自由往磁盘拷贝数据的软件

  举例:

  1.Just hang……

  这个简单的引导程序只能挂起:

  hang:

  jmp hang

  times 512-($-$$)-2 db 0

  dw 0AA55h

  连接这个引导程序:

  nasm -f bin -o hang.bin hang.asm

  现在你需要一张格式化磁盘,传送hang.bin到磁盘的引导扇区

  partcopy hang.bin 0 200 -f0

  “0”的意思是指从hang.bin文件的顶端开始传送

  “200”的意思是指拷贝200个字节

  插入磁盘和重新启动机器,测试这个引导程序。

  2.一个实模式下的引导程序

  上面的程序非常简单,下面介绍一个稍微复杂一点的程序。

  bits 16

  org 0x7C00

  start:

  cli;关中断

  mov ax,0x9000;设置堆栈址:0x90000

  mov ss,ax

  mov sp,0

  sti;开中断

  l1:push ds

  mov dl,0;

  重新设置磁盘控制器

  mov ax,0

  int 13h

  pop ds

  jc fail

  push es

  mov ax,0x1000;ES:BX=10000

  mov es,ax

  mov bx,0

  mov ah,2;读磁盘扇区

  mov al,5;读入5个扇区

  mov cx,2;柱面号=0,扇区号=2

  mov dx, 0;磁头号=0,驱动器号=0

  int 13h;ES:BX=来自磁盘上的数据

  pop es

  jc l1

  mov ax,0x10000;设置段寄器

  mov es,ax

  mov ds,ax

  push ax

  mov ax,0

  push ax

  retf

  fail:

  jmp fail

  times 512-($-$$)-2 db 0

  dw 0AA55h

  连接这个引导程序:

  nasm -f bin -o boot.bin boot.asm

  传送boot.bin到磁盘的引导扇区

  partcopy boot.bin 0 200 -f0

  为了使程序可以看到,在编译下面程序

  mov ax,1000h;修改段寄存器

  mov ds,ax

  mov es,ax

  mov si,msg;打印 "JIPPIKAYE!"

  call putstr

  hang:;挂起

  jmp hang

  putstr:

  lodsb

  or al,al

  jz short putstrd

  mov ah,0x0E

  mov bx,0x0007

  int 0x10

  jmp putstr

  putstrd:

  retn

  msg db 'JIPPIKAYE!',13,10,0

  连接和传送:

  nasm -f bin -o boot.bin boot.asm

  partcopy boot.bin 0 200 -f0 200

  在partcopy中最后一个参数“200”意思是指磁盘的偏移地址插入磁盘和重新启动机器,你会看到“JIPPIKAYE”然后挂起。



本文转自

http://www.woos.cn/bbs/read.php?tid=72

posted on 2008-01-07 16:11 旅途 阅读(689) 评论(0)  编辑 收藏 引用 所属分类: 一步一步操作系统


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理