linux2.6.11启动代码之bootsect.s

原创 2008年10月02日 14:01:00

/*

 *     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.

 *

 */

这段代码首先是有bios系统调用装入的,应该是LILO的一部分。

这部分主要实现了一个显示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

Inp.:

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.

/***********************************************************************

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

#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

#endif

 

#ifndef RAMDISK

#define RAMDISK 0

#endif

 

#ifndef ROOT_RDONLY

#define ROOT_RDONLY 1

#endif

 

.code16

.text

 

.global _start

_start:

 

         # Normalize the start address

         jmpl          $BOOTSEG, $start2

 

start2:

         movw       %cs, %ax

         movw       %ax, %ds

         movw       %ax, %es

         movw       %ax, %ss

         movw       $0x7c00, %sp

         sti                                       //设置中断                  

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

                                             //向前移动,std指令为设置方向,告诉程

//sidi向后移动 

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

/*********************************************

逐字符的显示bugger_off_msg中的内容

**************************************************************/

msg_loop:

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

         andb         %al, %al

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

//0(相等),zF=1,转移,

         movb        $0xe, %ah         

         movw       $7, %bx

         int    $0x10            //显示

         jmp  msg_loop

 

die:

         # 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         //

 

 

bugger_off_msg:

         .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

bootsect.S 中文注释 ( linux-0.12 )

! SYS_SIZE is the number of clicks (16 bytes) to be loaded. ! SYS_SIZE 是要加载的系统模块长度(单位是节,每节有16字节)。 ! ...
  • qq_23827747
  • qq_23827747
  • 2017年01月18日 15:30
  • 248

汇编写启动代码之设置栈和调用C语言

1、C语言运行时和栈 (1)C语言运行时需要 C语言运行时(runtime)需要一定的条件,这些条件由汇编来提供。C语言运行时主要是需要栈。   (2)C语言与栈的关系 C语言中的局部变量都是用栈来实...
  • su_changqi
  • su_changqi
  • 2016年11月17日 22:05
  • 218

linux内核bootsect.S和setup.S流程

bootsect.s流程 将0x07c00的代码移动到0x90000处并跳转到0x90000处继续执行。 (0x07c00的代码BOIS加载的引导扇区) 跳转后重新设置寄存器(设置段寄存器为0x90...
  • pk_20140716
  • pk_20140716
  • 2015年07月26日 19:13
  • 575

Linux系统调用as86 -0 -a -o boot/bootsect.o boot/bootsect.s make: as86:命令未找到 Makefile:101: recipe for tar

在写系统调用时,make all的时候出现as86 -0 -a -o boot/bootsect.o boot/bootsect.s make: as86:命令未找到 Makefile:101: ...
  • Agnesyuan
  • Agnesyuan
  • 2017年01月04日 11:58
  • 590

linux 2.6.11 bootsect.s解读

/* * bootsect.S Copyright (C) 1991, 1992 Linus Torvalds * * modified by Drew Eckhardt * modified by...
  • cassper
  • cassper
  • 2008年07月07日 19:50
  • 889

linux2.6.11的工作队列机制分析

一、概述   工作队列提供了一种通过线程同步或者异步运行内核函数的通用机制。通过completion和等待队列实现了同步运行功能(调用者等待被调用函数执行完毕),不使用completion则可实现异...
  • aweii
  • aweii
  • 2011年12月01日 23:24
  • 841

bootsect.S 剖析

本文的目的,在于将linux kernel的boot部分做一个介绍,因为笔者觉得很少有这样的 文章来介绍一个操作系统最最开始的一步----把kernel本身载入至内存中,同时进行一些 机器相关(mac...
  • csshuke
  • csshuke
  • 2015年04月29日 14:16
  • 461

很好的linux启动说明( bootsect.S、setup.S、head.S)

bootsect.S,系统引导程序,一般不超过512字节。 在PC系统结构中,线性地址0xA0000以上,即640K以上用于图形接口卡和BIOS自身,640K以下为系统的基本内存。如果配置更多的内存...
  • xljiulong
  • xljiulong
  • 2012年03月23日 09:33
  • 2232

linux0.11内核代码之bootsect.s

由前面的文章可知,BIOS一个很重要的功能就是读操作系统内核到内存中,然后将控制权交给内核。下面就是具体分析内存最先运行的代码bootsect.s。 1)  bootsect.s代码存储于磁盘的0柱...
  • linux_studyer
  • linux_studyer
  • 2015年04月10日 21:46
  • 589

linux0.11源码学习——bootsect.s学习

由于一直想写一个自己的操作系统,
  • crazyuo
  • crazyuo
  • 2014年09月29日 14:53
  • 1710
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux2.6.11启动代码之bootsect.s
举报原因:
原因补充:

(最多只允许输入30个字)