发信人: wucheng_ai(子程) 
整理人: wenbobo(2003-01-09 10:08:30), 站内信件
 | 
 
 
链接: http://www.lvyin.net/article/list.asp?id=28
 
 |  操作系统>>系统启动>>如何开发自己的操作系统的引导程序
  
 如何开发自己的操作系统的引导程序
 www.lvyin.net  2002-4-18 绿荫网络
 
 
     当你打开计算机时发生了什么? 
   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”然后挂起。
 
 
 
 原作者:windstopped
 来 源:Delphi先锋网
 共有1176位读者阅读过此文 
 
 【告诉好友】 
 
 
  | 
 
 
 |