netbsd mbr code annotation

2009-05-13 01:54:11来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


netbsd的mbr流程,sys/arch/i386/stand/mbr/mbr.S
由于篇幅,省略了版权声明,源文件里的注释是/**/,我添加的注释是//,因为是抽时间写的,因此一些 #ifdefine 的地方没有跟踪,需要的可以自己跟下去。
发完了财看见有一篇类似文章分析freebsd5.2的,呵呵。问题不大
xi
/* $NetBSD: mbr.S,v 1.12 2004/09/12 08:41:47 dsl Exp $ */
/*
* i386 master boot code
*/
/* Compile options:
* BOOTSEL - bootselector code
* BOOT_EXTENDED - scan extended partition list (LBA reads)
* TERSE_ERROR - terse error messages
* NO_CHS - all reads are LBA
* NO_LBA_CHECK - no check if bios supports LBA reads
* NO_BANNER    - do not output 'banner'
*/
#ifdef BOOT_EXTENDED
#define NO_CHS 1
#define BOOTSEL 1
#endif
#ifdef BOOTSEL
#define TERSE_ERROR 1
#endif
#include
#include
#define BOOTADDR 0x7c00
#define LOADADDR 0x0600  /* address were are linked to */
#define TABENTRYSIZE (MBR_BS_PARTNAMESIZE + 1)
#define NAMETABSIZE (MBR_PART_COUNT * TABENTRYSIZE)
/* Scan values for the various keys we use, as returned by the BIOS */
#define SCAN_ENTER 0x1c  // ENTER键的键盘扫描码(不是ANSII码)
#define SCAN_F1  0x3b  // F1键的键盘扫描码(不是ANSII码)
#define SCAN_1  0x2  // 大键盘上数字键1的键盘扫描码(不是ANSII码)
/*
* Minimum and maximum drive number that is considered to be valid.
*/
#define MINDRV  0x80
#define MAXDRV  0x8f
#ifdef TERSE_ERROR
/*
* Error codes. Done this way to save space.
*/
#define ERR_INVPART '1'  /* Invalid partition table */
#define ERR_READ '2'  /* Read error */
#define ERR_NOOS '3'  /* Magic no. check failed for part. */
#define ERR_KEY  '?'  /* unknown key press */
#define ERR_NO_LBA 'L'  /* sector above chs limit */
#define set_err(err) movb $err, %al
#else
#define set_err(err) mov $err, %ax
#endif
.text
.code16
/*
* Move ourselves out of the way first.
* (to the address we are linked at - 0x600)
* and zero our bss
*/
ENTRY(start)    // master bootstrap loader的入口地址,mbr被拷贝到内存并检查合法后BIOS将执行权力传递到                                         // 这里
xor %ax, %ax  // ax = 0
mov %ax, %ss  // 堆栈段基址 = 0
movw $BOOTADDR, %sp  // 栈顶指针 = 0x7c00
mov %ax, %es  
mov %ax, %ds  // es(扩展段) = ds(数据段) = 0
mov %sp, %si  // si(原地址) = 0x7c00
movw $start, %di  // di(目的地址) = 0x600,在链接时,start被连接在地址0x600上(参见相关Makefile文件)
movw $(bss_start - start)/2, %cx  // 计算从DS:SI(0x0000:0x7c00)拷贝到ES:DI(0x0000:0x600)的word的个数(也就是mbr

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:/usr/src/usr.bin/expand/expand.c

下一篇:揭露,如何做一个BT服务器。