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

📄 setup.asm.svn-base

📁 德国Erlangen大学教学操作系统源码。
💻 SVN-BASE
字号:
; $Id: setup.asm,v 1.1.1.1 2002/09/20 20:40:30 gal Exp $;******************************************************************************;* Betriebssysteme                                                            *;*----------------------------------------------------------------------------*;*                                                                            *;*                             S E T U P                                      *;*                                                                            *;*----------------------------------------------------------------------------*;* Der Setup-Code liegt im System-Image direkt hinter dem Bootsektor und wird *;* von diesem direkt nach dem Laden aktiviert. Der Code wird noch im          *;* 'Real-Mode' gestartet, so dass zu Beginn auch noch BIOS-Aufrufe erlaubt    *;* sind. Dann werden jedoch alle Interrupts verboten, die Adressleitung A20   *;* aktiviert und die Umschaltung in den 'Protected-Mode' vorgenommen. Alles   *;* weitere uebernimmt der Startup-Code des Systems.                           *;******************************************************************************;; Konstanten;	SETUPSEG	equ 0x9000	; Setup-Code (max. 64K inkl. Stack)	SYSTEMSEG	equ 0x1000	; System-Code (max. 512K)[SECTION .text];; Segmentregister initialisieren;start:		mov	ax,cs		; Daten-, Code- und Stacksegment sollen	mov	ds,ax		; hierher zeigen.	mov	ss,ax		; Alle drei Segment duerfen nicht mehr	mov	sp,0xfffe	; als 64 KByte einnehmen (zusammen).;; Ausgabe einer Meldung mit Hilfe eines BIOS-Aufrufs;	mov	ah,0x03		; Feststellen der Cursor-Position	xor	bh,bh	int	0x10		mov	cx,14			mov	bx,0x0007	; page 0, attribute 7 (normal)	mov	ax,ds	mov	es,ax	mov	bp,setupmessage	mov	ax,0x1301	; Ausgabe des Textes, Cursor bewegen	int	0x10;; So, jetzt werden die Interrupts abgeschaltet;	cli			; Maskierbare Interrupts verbieten	mov	al,0x80		; NMI verbieten	out	0x70,al;; IDT und GDT setzen;	lidt	[idt_48]	lgdt	[gdt_48];; Aktivieren der Adressleitung A20;	call	empty_8042	mov	al,0xd1	out	0x64,al	call	empty_8042	mov	al,0xdf	out	0x60,al	call	empty_8042;; Moeglichen Koprozessor zuruecksetzen;	xor	ax,ax	out	0xf0,al	call	delay	out	0xf1,al	call	delay;; Umschalten in den Protected Mode;	mov	ax,1	lmsw	ax	jmp	flush_instrflush_instr:;; Sprung in den Protected-Mode-Teil des Systems;	jmp	dword 0x08:SYSTEMSEG*0x10;; empty_8042;; Ein- und Ausgabepuffer des Tastaturcontrollers leeren;empty_8042:	call	delay	in	al,0x64		; 8042 Status Port	test	al,1		; Ausgabepuffer voll?	jz	no_output	call	delay	in	al,0x60		; wenn ja: ueberlesen	jmp	empty_8042no_output:	test	al,2		; Eingabepuffer voll?	jnz	empty_8042	; wenn ja, noch mal testen, irgendwann	ret			; muss es weg sein.;; delay:;; Kurze Verzoegerung fuer in/out-Befehle;delay:	jmp	.L1.L1	ret;; Datenbereich;[SECTION .data]; Meldungsetupmessage:	db	13,10	db	'setup active';; Descriptor-Tabellen;gdt:	dw	0,0,0,0		; NULL Deskriptor	dw	0xFFFF		; 4Gb - (0x100000*0x1000 = 4Gb)	dw	0x0000		; base address=0	dw	0x9A00		; code read/exec	dw	0x00CF		; granularity=4096, 386 (+5th nibble of limit)	dw	0xFFFF		; 4Gb - (0x100000*0x1000 = 4Gb)	dw	0x0000		; base address=0	dw	0x9200		; data read/write	dw	0x00CF		; granularity=4096, 386 (+5th nibble of limit)idt_48:	dw	0		; idt limit=0	dw	0,0		; idt base=0Lgdt_48:	dw	0x18		; GDT Limit=24, 3 GDT Eintraege	dd	SETUPSEG*0x10+gdt; Physikalische Adresse der GDT

⌨️ 快捷键说明

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