⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nbloader.s

📁 i386的bootloader源码grub
💻 S
字号:
/* *  GRUB  --  GRand Unified Bootloader *  Copyright (C) 2000   Free Software Foundation, Inc. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <nbi.h>#include <diskless_size.h>				.file	"nbloader.S"	.text	.code16		/* Just a dummy entry */.globl _start; _start:	/*	 * netboot image header	 */	.long	NBI_MAGIC	.long	0x00000004	/* load address of the first block  */	.word	NBI_DEST_OFF	.word	NBI_DEST_SEG	/* start addr of the relocation code */	.word	NBI_DEST_OFF + (relocate - _start)	.word	NBI_DEST_SEG	.long	0x04000004	.long	NBI_DEST_ADDR + 0x0200	.long	DISKLESS_SIZE	.long	DISKLESS_SIZErelocate:	/*	 * This code is for now located at 0x10000.	 * Relocate the code in two steps:	 * 1. Copy the first 32k to 0x8000 and jump to the relocated area.	 * 2. Copy the rest to 0x10000 (0x8000 + 32k).	 */	/* Copy the first 32k  */	movw	$NBI_DEST_SEG, %ax	movw	%ax, %ds	movw	$RELOCATED_SEG, %ax	movw	%ax, %es	xorw	%si, %si	xorw	%di, %di	/* Always copy 32k bytes */	movw	$0x4000, %cx	cld	rep	movsw	/* Jump to the relocated address */	ljmp	$0, $(RELOCATED_ADDR + copy_rest - _start)	/* Copy the rest */copy_rest:	/* Set %edx to the number of bytes */	movl	$(DISKLESS_SIZE + 0x200 - 0x8000), %edx	copy_loop:	/* Check the rest */	orl	%edx, %edx	jz	boot_stage2	/* Copy by 32k, as that is easy to implement */	movl	$0x8000, %ecx	cmpl	%ecx, %edx	jg	copy	movl	%edx, %ecx	copy:	/* Update the number of rest bytes */	subl	%ecx, %edx	/* Add 0x0800 (32k >> 4) into %es and %ds */	movw	%es, %ax	addw	$0x0800, %ax	movw	%ax, %es	movw	%ds, %ax	addw	$0x800, %ax	movw	%ax, %ds		/* Zero the offsets */	xorw	%si, %si	xorw	%di, %di		/* Use word-size copy */	addw	$1, %cx	shrw	$1, %cx	/* The direction is already correct */	rep	movsw	jmp	copy_loop	/* Jump to the stage2 */boot_stage2:	ljmp	$0, $STAGE2_START_ADDR		/* This ensures that the length of this image will be 1 sector */	. = _start + 0x200 - 1	.byte	0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -