img ustc_dylan


发表于2008/10/2 14:01:00  1798人阅读


 *     bootsect.S                 Copyright (C) 1991, 1992 Linus Torvalds


 *     modified by Drew Eckhardt

 *     modified by Bruce Evans (bde)

 *     modified by Chris Noe (May 1999) (as86 -> gas)

 *     gutted by H. Peter Anvin (Jan 2003)


 * BIG FAT NOTE: We're in real mode using 64k segments.  Therefore segment

 * addresses must be multiplied by 16 to obtain their respective linear

 * addresses. To avoid confusion, linear addresses are written using leading

 * hex while segment addresses are written as segment:offset.




这部分主要实现了一个显示bugger_off_msg的过程,主要有3个比较重要的bios调用,int 10

Int  16 int  19,下面详细的讲一下这三个系统调用的意思:

(1)     Int  0x10


         AH = 0Eh

         AL = 要显示的字符

         BH = 页号(开启页机制的情况下)

         BL = 前景色 (仅在图形模式下用)

Return: nothing

功能:display a character on the screen, advancing the cursor and scrolling

           the screen as necessary

(2)     Int  0x16


AH = 00h

Return: AH = BIOS scan code

AL = ASCII character

(3)     Int  0x19  

This interrupt reboots the system without clearing memory or restoring

  interrupt vectors.  Because interrupt vectors are preserved, this

  interrupt usually causes a system hang if any TSRs have hooked

  vectors from 00h through 1Ch, particularly INT 08.



#include <asm/boot.h>


SETUPSECTS     = 4                      /* default nr of setup-sectors */

BOOTSEG                   = 0x07C0           /* original address of boot-sector */

INITSEG             = DEF_INITSEG                  /* we move boot here - out of the way   0x9000*/

SETUPSEG         = DEF_SETUPSEG              /*setup starts here     0x9020*/

SYSSEG              = DEF_SYSSEG           /* system loaded at 0x10000 (65536) */

SYSSIZE              = DEF_SYSSIZE          /* system size: # of 16-byte clicks */

                                               /* to be loaded */

ROOT_DEV       = 0                     /* ROOT_DEV is now written by "build" */

SWAP_DEV       = 0                      /* SWAP_DEV is now written by "build" */


#ifndef SVGA_MODE

#define SVGA_MODE ASK_VGA         //0xfffd



#ifndef RAMDISK

#define RAMDISK 0




#define ROOT_RDONLY 1






.global _start



         # Normalize the start address

         jmpl          $BOOTSEG, $start2



         movw       %cs, %ax

         movw       %ax, %ds

         movw       %ax, %es

         movw       %ax, %ss

         movw       $0x7c00, %sp

         sti                                       //设置中断                  

         cld                                       //清除方向标志,cld即告诉程序sidi      



         movw       $bugger_off_msg, %si               //si指向要显示的字符





         lodsb                  // LODSB的功能是将DS:[si]中的内容取到AL中,然后SI<=SI+/-1

         andb         %al, %al

       jz      die              // jejump if zero的意思,jzjump if equal的意思,两者都是结果为


         movb        $0xe, %ah         

         movw       $7, %bx

         int    $0x10            //显示

         jmp  msg_loop



         # Allow the user to press a key, then reboot

         xorw         %ax, %ax

         int    $0x16              //键盘中断 ah中接收基本键盘输入功能信号

  int    $0x19             

//int 19一般是不会执行的,因为在int 16之后系统将会跳到用户选择的系统运行,也就//是说如果用户不选择的话,系统将会重启,然后执行下面的跳转代码


         # int 0x19 should never return.  In case it does anyway,

         # invoke the BIOS reset code...

         ljmp $0xf000,$0xfff0         //




         .ascii         "Direct booting from floppy is no longer supported./r/n"

         .ascii         "Please use a boot loader program instead./r/n"

         .ascii         "/n"

         .ascii         "Remove disk and press any key to reboot . . ./r/n"

         .byte         0



         # Kernel attributes; used by setup


         .org 497

setup_sects:    .byte SETUPSECTS

root_flags:       .word ROOT_RDONLY

syssize:    .word SYSSIZE

swap_dev:        .word SWAP_DEV

ram_size:         .word RAMDISK

vid_mode:        .word SVGA_MODE

root_dev:          .word ROOT_DEV

boot_flag:         .word 0xAA55

0 0



取 消