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

📄 cdboot.s

📁 有助于了解操作系统如何启动之过程
💻 S
字号:
/* -*-Asm-*- *//* *  GRUB  --  GRand Unified Bootloader *  Copyright (C) 2008  Free Software Foundation, Inc. * *  GRUB 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 3 of the License, or *  (at your option) any later version. * *  GRUB 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 GRUB.  If not, see <http://www.gnu.org/licenses/>. */#include <grub/boot.h>#include <grub/machine/boot.h>#include <grub/machine/kernel.h>#include <multiboot.h>        .file   "cdboot.S"#define CODE_ADDR	0x6000#define DATA_ADDR	((GRUB_BOOT_MACHINE_KERNEL_ADDR) + 0x200)#define CDSEC_SHIFT	11#define CDBLK_LENG	16	.text        .code16        .globl  start, _startstart:	call	nextnext:	jmp	1f	. = start + 8bi_pvd:	.long 0		/* LBA of primary volume descript.  */bi_file:	.long 0		/* LBA of boot file. */bi_length:	.long 0		/* Length of boot file. */bi_csum:	.long 0		/* Checksum of boot file */bi_reserved:	.space (10*4)	/* Reserved */1:	popw	%bx	/* Boot from CDROM.  */	xorw	%ax, %ax	movw	%ax, %ss	movw	$(CODE_ADDR), %sp	movw	%ax, %ds	movw	%ax, %es	movw	$(0x7C00 + err_noboot_msg - start), %si	movl	%cs: bi_length - next(%bx), %ecx	orl	%ecx, %ecx	jz	fail	addl	$((1 << CDSEC_SHIFT) - 1), %ecx	shrl	$CDSEC_SHIFT, %ecx	movl	%cs: bi_file - next(%bx), %esi	call	read_cdrom	ljmp	$(DATA_ADDR >> 4), $0/* * Parameters: *   esi: start sector *   ecx: number of sectors */read_cdrom:	xorl	%eax, %eax	/* Number of blocks to read.  */	pushw	$CDBLK_LENG	/* Block number.  */	pushl	%eax	pushl	%esi	/* Buffer address.  */	pushw	$((DATA_ADDR - 0x400)>> 4)	pushl	%eax	pushw	$0x10	xorl	%edi, %edi	movw	%sp, %si1:	movw	0x10(%si), %di	cmpl	%ecx, %edi	jbe	2f	movl	%ecx, %edi2:	mov	%di, 2(%si)	pushl	%ecx	movb	$0x42, %ah	int	$0x13	jnc	3f	movb	$0x42, %ah		/* Try again.  */	int	$0x13	jnc	3f2:	shrw	$1, %di			/* Reduce transfer size.  */	jz	cdrom_fail	movw	%di, 0x10(%si)	movw	%di, 2(%si)	movb	$0x42, %ah	int	$0x13	jc	2b3:	movw	%di, %ax	shlw	$(CDSEC_SHIFT - 4), %ax	addw	%ax, 6(%si)	addl	%edi, 8(%si)	popl	%ecx	subl	%edi, %ecx	jnz	1b	addw	$0x12, %sp	retcdrom_fail:	movw	$(0x7C00 + err_cdfail_msg - start), %sifail:	movb	$0x0e, %ah	xorw	%bx, %bx1:	lodsb	(%si), %al	int	$0x10	cmpb	$0, %al	jne	1b1:	jmp	1berr_noboot_msg:	.ascii	"no boot info\0"err_cdfail_msg:	.ascii	"cdrom read fails\0"	. = start + 0x1FF	.byte	0

⌨️ 快捷键说明

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