亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? kernel.asm

?? 《自己動手寫操作系統》的隨書附贈光盤
?? ASM
字號:

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;                               kernel.asm
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;                                                     Forrest Yu, 2005
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


%include "sconst.inc"

; 導入函數
extern	cstart
extern	tinix_main
extern	exception_handler
extern	spurious_irq
extern	clock_handler
extern	disp_str
extern	delay

; 導入全局變量
extern	gdt_ptr
extern	idt_ptr
extern	p_proc_ready
extern	tss
extern	disp_pos
extern	k_reenter

bits 32

[SECTION .data]
clock_int_msg		db	"^", 0

[SECTION .bss]
StackSpace		resb	2 * 1024
StackTop:		; 棧頂

[section .text]	; 代碼在此

global _start	; 導出 _start

global restart

global	divide_error
global	single_step_exception
global	nmi
global	breakpoint_exception
global	overflow
global	bounds_check
global	inval_opcode
global	copr_not_available
global	double_fault
global	copr_seg_overrun
global	inval_tss
global	segment_not_present
global	stack_exception
global	general_protection
global	page_fault
global	copr_error
global	hwint00
global	hwint01
global	hwint02
global	hwint03
global	hwint04
global	hwint05
global	hwint06
global	hwint07
global	hwint08
global	hwint09
global	hwint10
global	hwint11
global	hwint12
global	hwint13
global	hwint14
global	hwint15


_start:
	; 此時內存看上去是這樣的(更詳細的內存情況在 LOADER.ASM 中有說明):
	;              ┃                                    ┃
	;              ┃                 ...                ┃
	;              ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃■■■■■■Page  Tables■■■■■■┃
	;              ┃■■■■■(大小由LOADER決定)■■■■┃ PageTblBase
	;    00101000h ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃■■■■Page Directory Table■■■■┃ PageDirBase = 1M
	;    00100000h ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃□□□□ Hardware  Reserved □□□□┃ B8000h ← gs
	;       9FC00h ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃■■■■■■■LOADER.BIN■■■■■■┃ somewhere in LOADER ← esp
	;       90000h ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃■■■■■■■KERNEL.BIN■■■■■■┃
	;       80000h ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃■■■■■■■■KERNEL■■■■■■■┃ 30400h ← KERNEL 入口 (KernelEntryPointPhyAddr)
	;       30000h ┣━━━━━━━━━━━━━━━━━━┫
	;              ┋                 ...                ┋
	;              ┋                                    ┋
	;           0h ┗━━━━━━━━━━━━━━━━━━┛ ← cs, ds, es, fs, ss
	;
	;
	; GDT 以及相應的描述符是這樣的:
	;
	;		              Descriptors               Selectors
	;              ┏━━━━━━━━━━━━━━━━━━┓
	;              ┃         Dummy Descriptor           ┃
	;              ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃         DESC_FLAT_C    (0~4G)     ┃   8h = cs
	;              ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃         DESC_FLAT_RW   (0~4G)     ┃  10h = ds, es, fs, ss
	;              ┣━━━━━━━━━━━━━━━━━━┫
	;              ┃         DESC_VIDEO                 ┃  1Bh = gs
	;              ┗━━━━━━━━━━━━━━━━━━┛
	;
	; 注意! 在使用 C 代碼的時候一定要保證 ds, es, ss 這幾個段寄存器的值是一樣的
	; 因為編譯器有可能編譯出使用它們的代碼, 而編譯器默認它們是一樣的. 比如串拷貝操作會用到 ds 和 es.
	;
	;


	; 把 esp 從 LOADER 挪到 KERNEL
	mov	esp, StackTop	; 堆棧在 bss 段中

	mov	dword [disp_pos], 0

	sgdt	[gdt_ptr]	; cstart() 中將會用到 gdt_ptr
	call	cstart		; 在此函數中改變了gdt_ptr,讓它指向新的GDT
	lgdt	[gdt_ptr]	; 使用新的GDT

	lidt	[idt_ptr]

	jmp	SELECTOR_KERNEL_CS:csinit
csinit:		; “這個跳轉指令強制使用剛剛初始化的結構”——<<OS:D&I 2nd>> P90.

	;jmp 0x40:0
	;ud2

	;sti

	xor	eax, eax
	mov	ax, SELECTOR_TSS
	ltr	ax

	jmp	tinix_main

	;hlt


; 中斷和異常 -- 硬件中斷
; ---------------------------------
%macro	hwint_master	1
	push	%1
	call	spurious_irq
	add	esp, 4
	hlt
%endmacro


ALIGN	16
hwint00:		; Interrupt routine for irq 0 (the clock).
	sub	esp, 4
	pushad		; ┓
	push	ds	; ┃
	push	es	; ┣ 保存原寄存器值
	push	fs	; ┃
	push	gs	; ┛
	mov	dx, ss
	mov	ds, dx
	mov	es, dx

	;inc	byte [gs:0]	; 改變屏幕第 0 行, 第 0 列的字符

	mov	al, EOI		; ┓reenable master 8259
	out	INT_M_CTL, al	; ┛

	inc	dword [k_reenter]
	cmp	dword [k_reenter], 0
	jne	.re_enter

	mov	esp, StackTop		; 切到內核棧

	sti

	push	0
	call	clock_handler
	add	esp, 4

	cli

	mov	esp, [p_proc_ready]	; 離開內核棧;
	lldt	[esp + P_LDT_SEL]
	lea	eax, [esp + P_STACKTOP]
	mov	dword [tss + TSS3_S_SP0], eax

.re_enter:	; 如果(k_reenter != 0),會跳轉到這里
	dec	dword [k_reenter]	; k_reenter--;
	pop	gs	; ┓
	pop	fs	; ┃
	pop	es	; ┣ 恢復原寄存器值
	pop	ds	; ┃
	popad		; ┛
	add	esp, 4

	iretd


ALIGN	16
hwint01:		; Interrupt routine for irq 1 (keyboard)
	hwint_master	1

ALIGN	16
hwint02:		; Interrupt routine for irq 2 (cascade!)
	hwint_master	2

ALIGN	16
hwint03:		; Interrupt routine for irq 3 (second serial)
	hwint_master	3

ALIGN	16
hwint04:		; Interrupt routine for irq 4 (first serial)
	hwint_master	4

ALIGN	16
hwint05:		; Interrupt routine for irq 5 (XT winchester)
	hwint_master	5

ALIGN	16
hwint06:		; Interrupt routine for irq 6 (floppy)
	hwint_master	6

ALIGN	16
hwint07:		; Interrupt routine for irq 7 (printer)
	hwint_master	7

; ---------------------------------
%macro	hwint_slave	1
	push	%1
	call	spurious_irq
	add	esp, 4
	hlt
%endmacro
; ---------------------------------

ALIGN	16
hwint08:		; Interrupt routine for irq 8 (realtime clock).
	hwint_slave	8

ALIGN	16
hwint09:		; Interrupt routine for irq 9 (irq 2 redirected)
	hwint_slave	9

ALIGN	16
hwint10:		; Interrupt routine for irq 10
	hwint_slave	10

ALIGN	16
hwint11:		; Interrupt routine for irq 11
	hwint_slave	11

ALIGN	16
hwint12:		; Interrupt routine for irq 12
	hwint_slave	12

ALIGN	16
hwint13:		; Interrupt routine for irq 13 (FPU exception)
	hwint_slave	13

ALIGN	16
hwint14:		; Interrupt routine for irq 14 (AT winchester)
	hwint_slave	14

ALIGN	16
hwint15:		; Interrupt routine for irq 15
	hwint_slave	15



; 中斷和異常 -- 異常
divide_error:
	push	0xFFFFFFFF	; no err code
	push	0		; vector_no	= 0
	jmp	exception
single_step_exception:
	push	0xFFFFFFFF	; no err code
	push	1		; vector_no	= 1
	jmp	exception
nmi:
	push	0xFFFFFFFF	; no err code
	push	2		; vector_no	= 2
	jmp	exception
breakpoint_exception:
	push	0xFFFFFFFF	; no err code
	push	3		; vector_no	= 3
	jmp	exception
overflow:
	push	0xFFFFFFFF	; no err code
	push	4		; vector_no	= 4
	jmp	exception
bounds_check:
	push	0xFFFFFFFF	; no err code
	push	5		; vector_no	= 5
	jmp	exception
inval_opcode:
	push	0xFFFFFFFF	; no err code
	push	6		; vector_no	= 6
	jmp	exception
copr_not_available:
	push	0xFFFFFFFF	; no err code
	push	7		; vector_no	= 7
	jmp	exception
double_fault:
	push	8		; vector_no	= 8
	jmp	exception
copr_seg_overrun:
	push	0xFFFFFFFF	; no err code
	push	9		; vector_no	= 9
	jmp	exception
inval_tss:
	push	10		; vector_no	= A
	jmp	exception
segment_not_present:
	push	11		; vector_no	= B
	jmp	exception
stack_exception:
	push	12		; vector_no	= C
	jmp	exception
general_protection:
	push	13		; vector_no	= D
	jmp	exception
page_fault:
	push	14		; vector_no	= E
	jmp	exception
copr_error:
	push	0xFFFFFFFF	; no err code
	push	16		; vector_no	= 10h
	jmp	exception

exception:
	call	exception_handler
	add	esp, 4*2	; 讓棧頂指向 EIP,堆棧中從頂向下依次是:EIP、CS、EFLAGS
	hlt


; ====================================================================================
;                                   restart
; ====================================================================================
restart:
	mov	esp, [p_proc_ready]
	lldt	[esp + P_LDT_SEL] 
	lea	eax, [esp + P_STACKTOP]
	mov	dword [tss + TSS3_S_SP0], eax
	pop	gs
	pop	fs
	pop	es
	pop	ds
	popad
	add	esp, 4
	iretd


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区中文视频| 亚洲欧美一区二区三区极速播放| kk眼镜猥琐国模调教系列一区二区 | 亚洲成av人影院| 久久久久国产精品免费免费搜索| 欧美日韩一区二区不卡| 丰满少妇久久久久久久| 久久精品国产精品亚洲精品| 亚洲一区成人在线| 中文字幕一区二区三区乱码在线 | 久久免费美女视频| 欧美日韩国产综合一区二区 | 91蝌蚪porny九色| 国产精品中文字幕一区二区三区| 视频精品一区二区| 亚洲精品视频一区| 国产精品午夜久久| 久久久久久久久久久黄色| 91精品国产综合久久久蜜臀粉嫩 | 亚洲第一二三四区| 亚洲精品一二三四区| 欧美经典一区二区三区| 精品久久久久一区| 欧美不卡视频一区| 4438x亚洲最大成人网| 欧美性视频一区二区三区| 91免费视频大全| 成人国产精品免费观看| 欧美一区二区三区在线观看视频 | 久久久美女毛片| 欧美一区二区三区四区久久| 欧美日韩在线不卡| 欧美午夜精品一区二区蜜桃| 91色婷婷久久久久合中文| 99国产欧美另类久久久精品| 国产69精品一区二区亚洲孕妇| 国产一区在线视频| 国产一区在线看| 国产不卡高清在线观看视频| 国产乱码一区二区三区| 国产电影精品久久禁18| 国产.精品.日韩.另类.中文.在线.播放| 精品一区二区三区的国产在线播放| 美女视频免费一区| 国产麻豆精品视频| 成人免费看视频| 色婷婷狠狠综合| 欧美亚洲动漫另类| 日韩一级片网站| 久久久久久久久久久久久夜| 中文字幕不卡的av| 亚洲欧美日韩一区| 午夜成人免费视频| 久88久久88久久久| 国产伦理精品不卡| 91免费观看在线| 欧美绝品在线观看成人午夜影视| 欧美一区二区免费视频| 精品国产乱码久久久久久牛牛| 久久网站最新地址| 亚洲人精品一区| 午夜久久久久久久久久一区二区| 精品一区二区三区在线播放视频 | 亚洲精品久久久蜜桃| 亚洲国产精品一区二区www在线| 视频一区国产视频| 国产风韵犹存在线视精品| 91丨porny丨国产入口| 91精品国产综合久久精品图片| 精品国精品国产| 樱花影视一区二区| 久久99久久久久久久久久久| 成人动漫精品一区二区| 欧美男人的天堂一二区| 国产区在线观看成人精品| 亚洲欧美韩国综合色| 麻豆久久一区二区| 色婷婷精品大视频在线蜜桃视频 | 欧美va亚洲va在线观看蝴蝶网| 国产欧美日韩精品一区| 亚洲一二三区在线观看| 黄色成人免费在线| 一本色道久久加勒比精品 | 亚洲精品日日夜夜| 美脚の诱脚舐め脚责91| 91视频.com| 欧美精品一区二区三区一线天视频| 亚洲日本va午夜在线影院| 精品写真视频在线观看| 色噜噜夜夜夜综合网| 精品国产91久久久久久久妲己| 夜夜嗨av一区二区三区网页| 国产一区视频导航| 欧美精品第一页| 亚洲日穴在线视频| 国产一区二区三区久久悠悠色av | 欧美日韩一区二区三区视频 | 久久精品夜色噜噜亚洲aⅴ| 亚洲影院免费观看| 成人黄色一级视频| 欧美精品一区二区高清在线观看| 亚洲国产综合视频在线观看| 成人国产电影网| 337p日本欧洲亚洲大胆精品 | 欧美国产一区在线| 美腿丝袜亚洲一区| 欧美视频一区在线观看| 亚洲欧洲三级电影| 国产精品主播直播| 日韩欧美一区二区在线视频| 一区二区免费在线| 99riav久久精品riav| 中文字幕高清一区| 国产乱码一区二区三区| 欧美大片顶级少妇| 美女视频第一区二区三区免费观看网站| 一本色道久久加勒比精品| 国产丝袜在线精品| 国产精品亚洲专一区二区三区 | 欧美一级生活片| 亚洲亚洲精品在线观看| 日本韩国欧美国产| 亚洲免费电影在线| www.亚洲精品| 国产精品国产三级国产三级人妇 | 成人av在线播放网站| 久久久久久9999| 国产成人av一区二区三区在线| 精品国产免费视频| 久久av资源站| 久久视频一区二区| 国产精品综合视频| 国产日韩欧美精品综合| 成人免费毛片app| 国产精品夫妻自拍| 色久优优欧美色久优优| 依依成人综合视频| 欧美日韩高清一区| 日日夜夜一区二区| 欧美不卡一区二区三区四区| 精彩视频一区二区| 久久精品欧美一区二区三区麻豆| 丁香婷婷综合色啪| 国产精品伦一区二区三级视频| 99精品1区2区| 亚洲成人资源网| 日韩欧美国产综合| 国产精品996| 成人欧美一区二区三区黑人麻豆| 99精品欧美一区二区三区小说| 亚洲一区二区三区自拍| 91精品国产欧美一区二区成人| 麻豆精品国产91久久久久久| 国产日韩欧美电影| 91日韩精品一区| 奇米一区二区三区av| 国产欧美一区二区三区沐欲| 成人美女视频在线看| 亚洲综合在线视频| 日韩亚洲欧美综合| 国产91露脸合集magnet| 亚洲欧美日韩成人高清在线一区| 91网站最新地址| 日本不卡高清视频| 欧美经典三级视频一区二区三区| 91免费看视频| 麻豆免费看一区二区三区| 国产精品久久久久天堂| 欧美日韩亚洲综合在线| 狠狠色丁香婷婷综合久久片| 亚洲品质自拍视频| 日韩欧美亚洲国产精品字幕久久久| 丁香网亚洲国际| 午夜免费久久看| 中文字幕国产一区| 91精品在线一区二区| 99久久婷婷国产精品综合| 青青草伊人久久| 亚洲色图欧美在线| 精品盗摄一区二区三区| 色综合久久久久| 狠狠色丁香婷婷综合| 亚洲午夜久久久久久久久电影院 | 国产亚洲一区二区三区四区| 99精品视频在线观看免费| 美女一区二区久久| 亚洲精品一卡二卡| 久久久激情视频| 欧美一区二区三区视频免费播放| 不卡的av中国片| 久久99精品一区二区三区三区| 亚洲欧美日韩精品久久久久| 亚洲精品在线免费播放| 在线免费观看不卡av| 粉嫩av亚洲一区二区图片| 美女视频一区在线观看| 亚洲国产精品一区二区www| 中文字幕中文乱码欧美一区二区| 欧美岛国在线观看| 欧美日韩精品系列|