当前位置:Linux教程 - Linux - 如何开发自己的操作系统的引导程序

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



         作者: 姜延欧

      当你打开计算机时发生了什么?
      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”然后挂起。
      (黑龙江 姜延欧)
    发布人:Kevin 来自:CandyLinux