boot.s

来自「COS 0.0.1.rar Cos操作系统源代码」· S 代码 · 共 174 行

S
174
字号
; boot.s - bootstrap the kernel image from a multiboot-compatible loader;  ; Author:        Paul Barker; Part of:       COS; Created:       14/09/04; Last Modified: 04/10/04;; Copyright (C) 2004 Paul Barker;    ;    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.;;                     (See file "Copying");;	Some of this code is taken from GeekOS, copyright below:;; Copyright (c) 2001, David H. Hovemeyer <daveho@cs.umd.edu>; $Revision: 1.1.1.1 $;; This is free software.  You are permitted to use,; redistribute, and modify it as specified in the file "COPYING-GEEKOS".;; A lot of this code is adapted from Kernel Toolkit 0.2; and Linux version 2.2.x, so the following copyrights apply:;; Copyright (C) 1991, 1992 Linus Torvalds; modified by Drew Eckhardt; modified by Bruce Evans (bde); adapted for Kernel Toolkit by Luigi Sgro;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	This is the main entry point for our kernel, and changes here will; almost certainly mean changes are needed elsewhere. See:;	- include/asm/defs.h;	- include/asm/defs.s;;	This is designed to be loaded from a multiboot compatible bootloader; so the machine state will be as follows:;	- CS = 32-bit r-x code segment, base 0, limit 0xFFFFFFFF;	- DS, ES, FS, GS, SS = 32-bit rw- data segment, base 0, limit 0xFFFFFFFF;	- A20 enabled;	- Protected mode, paging and interrupts disabled;	- magic value in eax;	- address of multiboot info struct in ebx;;	Note that there is no valid stack and all other state is undefined.;;;;;;;;;;;;;;;;;;;;;[BITS 32]; ----------------------------------------------------------------------; Imports / Exports; ----------------------------------------------------------------------EXTERN kmainEXTERN g_stackEXTERN bssEXTERN end_bssGLOBAL kstart; ----------------------------------------------------------------------; Definitions; ----------------------------------------------------------------------%include "defs.inc"; ----------------------------------------------------------------------; Code; ----------------------------------------------------------------------[SECTION .text]; multiboot header, we assume elfalign 8mboot_header:	dd MBOOT_HEADER_MAGIC	dd MBOOT_HEADER_FLAGS	dd MBOOT_HEADER_CHKSUM; start addressalign 8kstart:	; assert correct magic number in eax	cmp eax, MBOOT_LOADER_MAGIC	jne NEAR .loop		; zero bss, this MUST be done before we use the stack	;	(stack is in bss)	mov eax, bss.lbss:	cmp eax, end_bss	je .done	mov [eax], dword 0	add eax, 4	jmp .lbss.done:	; setup a stack	mov esp, g_stack	add esp, 16384		; reset EFLAGS	push	dword 0	popf		; push multiboot information structure onto stack	push ebx		; kill the FDD motor so the kernel is in a known state	;	assuming FDD boot ;-)	;	This is taken from Linux	mov	dx, 0x3f2	xor	al, al	out	dx, al		; Initialize master and slave PIC!	; From GeekOS / Linux again	mov	al, ICW1	out	0x20, al		; ICW1 to master	call	Delay	out	0xA0, al		; ICW1 to slave	call	Delay	mov	al, ICW2_MASTER	out	0x21, al		; ICW2 to master	call	Delay	mov	al, ICW2_SLAVE	out	0xA1, al		; ICW2 to slave	call	Delay	mov	al, ICW3_MASTER	out	0x21, al		; ICW3 to master	call	Delay	mov	al, ICW3_SLAVE	out	0xA1, al		; ICW3 to slave	call	Delay	mov	al, ICW4	out	0x21, al		; ICW4 to master	call	Delay	out	0xA1, al		; ICW4 to slave	call	Delay	mov	al, 0xff		; mask all ints in slave	out	0xA1, al		; OCW1 to slave	call	Delay	mov	al, 0xfb		; mask all ints but 2 in master	out	0x21, al		; OCW1 to master	call	Delay		; call main c function	call kmain.loop:	hlt	jmp .loop; Linux uses this code.; The idea is that some systems issue port I/O instructions; faster than the device hardware can deal with them.Delay:	jmp	.done.done:	ret

⌨️ 快捷键说明

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