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

📄 boot1.txt

📁 Linux0.00版的完全注释这是引导扇区代码
💻 TXT
字号:
;2005.10.27.
;这是引导扇区代码,Linus也是使用Intel的汇编语法写的,这里使用了NASM的编译器,;所以遵循NASM的语法,
;	而且也努力把后面的 HEAD.ASM 代码也写成NASM的,而不象Linus那样用难懂的;AT&T语法!
;	重写这些代码仅仅是为了学习和自己动手调试,希望这里是个好开头!:)



BOOTSEG 	equ 07C0H
SYSSEG 		equ 01000H
SYSLEN 		equ 17

start:
	jmp BOOTSEG:go
go:
	mov ax,cs
	mov ds,ax
	mov es,ax
	mov ss,ax
	mov sp,0x400
	
;读取A盘的第2个扇区开始的[SYSLEN]个扇区的数据,读到[SYSSEG]:0处,第1个扇区是引导扇区!
;		[为什么引导扇区不是第0个呢?奇怪!:)]
load_system:
	mov dx,0
	mov cx,2
	mov ax,SYSSEG
	mov es,ax
	mov bx,0
	mov ax,0x200+SYSLEN
	int 0x13
	jnc ok_load
	mov ah,0
	int 0x13
	jmp load_system
ok_load:
	cli
	
	mov ax,cs
	mov ds,ax
	lidt [idt_48]
	lgdt [gdt_48]
	
	;现在要开始一段比较难懂的代码了:(
	mov al,0x11
	out 0x20,al
	out 0xA0,al
	
	mov al,0x20
	out 0x21,al
	mov al,0x28
	out 0xA1,al
	
	mov al,0x04
	out 0x21,al
	mov al,0x02
	out 0xA1,al
	
	mov al,0x01
	out 0x21,al
	out 0xA1,al
	
	mov al,0xFF
	out 0x21,al
	out 0xA1,al
	
	;好了,现在要进入传说中的保护模式了,哈哈!:)
	mov bx,SYSSEG
	mov ax,0x0001
	lmsw ax
	jmp 8:0
	;段选择子为8,也就是指向全局描述符表中的偏移为8个地方,那也就是第0个描述符后面的第1个描述符啦!
	;	这个描述符指向基址为基址为0x10000,长度为8M的代码段!从这里开始就是保护模式咯!呵呵!
	
	;....
	;本引导扇区工作完成!
	
	;	:)
	
	
	;为调试而设置的临时指令 :)
	jmp go

gdt:
	;每个描述符占8个字节,也就是4个双字!
	;第一个描述符
	dw 0,0,0,0
	
	;第二个描述符,基址为0x10000,长度为8M的代码段
	dw 0x07FF
	dw 0x0000
	dw 0x9A01
	dw 0x00C0
	
	;第三个描述符,基址为0x10000,长度为8M的数据段,与代码段重合,这难道就是传说中的“别名”技术么?:)
	dw 0x07FF
	dw 0x0000
	dw 0x9201
	dw 0x00C0
	
idt_48:
	;将要赋值给IDT寄存器的6个字节,指明了中断描述符表的基址和限长
	dw 0x0000
	dw 0x0000,0x0000
	;在这里这个中断描述符表指向0x0000:0000处,长度也为0,不要奇怪,没有初始化而已,占个位置先!:)

gdt_48:
	;将要赋值给GDT寄存器的6个字节,指明了全局描述符表的基址和限长
	dw 0x07FF
	dw 0x7C00+gdt,0x0000
	;在这里全局描述符表的长度为0x800个字节(单位是字节哦!),也就是2K字节,每个描述符占8个字节,所以这里可以放256个描述符!
	;	基址是在上面的标号gdt处!

message:
	;定义[说明启动正在开始]要显示的字符串
	db "xiaomin's OS is loading..."
	db 13,10,13,10
message_end:
	db 0
	
times 510-($-$$) db 0
dw 0xAA55
	

⌨️ 快捷键说明

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