亚洲欧美第一页_禁久久精品乱码_粉嫩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
extern	irq_table
extern	sys_call_table

bits 32

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

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

[section .text]	; 代碼在此

global _start	; 導出 _start

global	restart
global	sys_call

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
	call	save
	in	al, INT_M_CTLMASK	; ┓
	or	al, (1 << %1)		; ┣ 屏蔽當前中斷
	out	INT_M_CTLMASK, al	; ┛
	mov	al, EOI			; ┓置EOI位
	out	INT_M_CTL, al		; ┛
	sti	; CPU在響應中斷的過程中會自動關中斷,這句之后就允許響應新的中斷
	push	%1			; ┓
	call	[irq_table + 4 * %1]	; ┣ 中斷處理程序
	pop	ecx			; ┛
	cli
	in	al, INT_M_CTLMASK	; ┓
	and	al, ~(1 << %1)		; ┣ 恢復接受當前中斷
	out	INT_M_CTLMASK, al	; ┛
	ret
%endmacro



ALIGN	16
hwint00:		; Interrupt routine for irq 0 (the clock).
	hwint_master	0

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

; ====================================================================================
;                                   save
; ====================================================================================
save:
	pushad		; ┓
	push	ds	; ┃
	push	es	; ┣ 保存原寄存器值
	push	fs	; ┃
	push	gs	; ┛
	mov	dx, ss
	mov	ds, dx
	mov	es, dx

	mov	esi, esp			; esi = 進程表起始地址

	inc	dword [k_reenter]		; k_reenter++;
	cmp	dword [k_reenter], 0		; if(k_reenter ==0)
	jne	.1				; {
	mov	esp, StackTop			;	mov esp, StackTop <-- 切換到內核棧
	push	restart				;	push restart
	jmp	[esi + RETADR - P_STACKBASE]	;	return;
.1:						; } else { 已經在內核棧,不需要再切換
	push	restart_reenter			;	push restart_reenter
	jmp	[esi + RETADR - P_STACKBASE]	;	return;
						; }


; ====================================================================================
;                                 sys_call
; ====================================================================================
sys_call:
	call	save

	sti

	call	[sys_call_table + eax * 4]
	mov	[esi + EAXREG - P_STACKBASE], eax

	cli

	ret


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


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91丝袜呻吟高潮美腿白嫩在线观看| 波多野结衣一区二区三区| 久久久综合激的五月天| 91看片淫黄大片一级在线观看| 日韩vs国产vs欧美| 一区免费观看视频| 精品奇米国产一区二区三区| 日本韩国精品在线| 国产成人精品一区二区三区四区 | 免费观看91视频大全| 欧美国产一区在线| 日韩午夜精品视频| 精品视频一区三区九区| 国产在线看一区| 图片区小说区区亚洲影院| 国产精品成人在线观看| 久久久久亚洲蜜桃| 日韩一区二区电影| 欧美区在线观看| 色妹子一区二区| 不卡一区在线观看| 国产精品一区二区在线看| 久久成人免费网站| 亚洲激情校园春色| 国产精品污网站| 国产无人区一区二区三区| 日韩欧美在线综合网| 欧美日韩一区中文字幕| 色综合av在线| 91麻豆精品视频| av网站一区二区三区| 福利电影一区二区| 国产成人在线看| 国产自产v一区二区三区c| 日本成人中文字幕在线视频| 亚洲地区一二三色| 亚洲高清中文字幕| 亚洲国产精品人人做人人爽| 一区二区三区国产| 亚洲免费观看高清| 亚洲最色的网站| 亚洲一级电影视频| 视频精品一区二区| 琪琪一区二区三区| 精品在线播放免费| 国产一区二区美女| 高清不卡一二三区| av综合在线播放| 91色|porny| 欧美性色黄大片手机版| 欧美日韩中文字幕一区二区| 欧美日韩一区二区在线观看| 欧美日韩mp4| 欧美一区二区三区在| 日韩欧美国产综合一区| 久久亚洲一级片| 国产午夜精品福利| 亚洲精品高清视频在线观看| 亚洲一卡二卡三卡四卡无卡久久 | 91精品国产免费| 日韩欧美亚洲另类制服综合在线| 精品日韩在线一区| 国产午夜亚洲精品午夜鲁丝片| 中文字幕av一区 二区| 亚洲情趣在线观看| 丝袜美腿高跟呻吟高潮一区| 免费成人美女在线观看.| 国内精品写真在线观看| 国产成人亚洲精品青草天美| av一区二区三区四区| 欧美人妖巨大在线| 国产欧美一区在线| 亚洲人吸女人奶水| 日本中文字幕不卡| 岛国av在线一区| 日本乱人伦一区| 日韩欧美一区二区三区在线| 国产欧美视频在线观看| 一区二区三区 在线观看视频| 日韩中文字幕av电影| 国产老肥熟一区二区三区| 91视频精品在这里| 日韩一卡二卡三卡四卡| 国产精品久久久久久一区二区三区| 亚洲国产va精品久久久不卡综合 | 高清在线成人网| 欧美亚洲一区二区在线观看| 精品免费国产二区三区| 日本一区二区三区四区| 亚洲国产视频a| 成人性视频网站| 欧美日韩高清在线播放| 国产视频一区二区在线| 亚洲午夜久久久久| 国产.欧美.日韩| 91精品在线观看入口| 欧美国产日韩一二三区| 日韩高清一区在线| 91美女在线看| 久久精品无码一区二区三区| 亚洲国产精品视频| av电影一区二区| 26uuu亚洲综合色欧美| 亚洲一区二区高清| 99re成人在线| 久久久精品2019中文字幕之3| 爽好多水快深点欧美视频| www.亚洲人| 久久亚区不卡日本| 日韩不卡在线观看日韩不卡视频| 一本色道久久综合亚洲精品按摩| 欧美变态tickle挠乳网站| 亚洲最大色网站| 91麻豆成人久久精品二区三区| 久久香蕉国产线看观看99| 欧美a一区二区| 欧美人与禽zozo性伦| 亚洲影院在线观看| 97久久精品人人做人人爽50路| 欧美精品一区二区三| 婷婷中文字幕一区三区| 91黄视频在线| 亚洲精品视频在线观看免费| 成人免费看片app下载| 久久综合久久综合亚洲| 麻豆国产一区二区| 日韩欧美精品在线| 久久精品国产亚洲a| 91精品国产一区二区三区蜜臀| 亚洲国产精品久久不卡毛片 | 2014亚洲片线观看视频免费| 奇米影视在线99精品| 91精品欧美久久久久久动漫 | 欧美va日韩va| 麻豆久久一区二区| 欧美一区二区成人6969| 日韩黄色免费网站| 91精品国产入口| 美美哒免费高清在线观看视频一区二区| 日韩精品色哟哟| 91麻豆精品国产91久久久资源速度 | 在线播放视频一区| 亚洲成av人片| 91麻豆精品国产自产在线| 日韩国产高清在线| 精品免费一区二区三区| 国产一区不卡视频| 欧美国产精品专区| www.日韩av| 亚洲一区二区3| 91精品综合久久久久久| 久久99精品久久只有精品| 精品国产伦理网| 国产91丝袜在线18| 国产精品乱人伦一区二区| 91麻豆免费观看| 亚洲va国产va欧美va观看| 91精品国产手机| 国产成人午夜高潮毛片| 国产精品久线观看视频| 色老汉一区二区三区| 亚洲6080在线| 26uuu国产电影一区二区| 成人永久看片免费视频天堂| 亚洲美女屁股眼交3| 精品视频123区在线观看| 美脚の诱脚舐め脚责91 | 黄色小说综合网站| 国产精品日韩成人| 欧美影视一区在线| 久久91精品国产91久久小草 | 亚洲摸摸操操av| 欧美日韩极品在线观看一区| 久久精品国产精品亚洲综合| 久久久久成人黄色影片| 欧美在线|欧美| 极品美女销魂一区二区三区| 成人欧美一区二区三区小说 | 懂色av一区二区夜夜嗨| 一区二区三区精品在线| 日韩片之四级片| av成人老司机| 久久国产麻豆精品| 亚洲男人的天堂在线aⅴ视频| 欧美一级夜夜爽| 99热这里都是精品| 久久精品国产77777蜜臀| 中文字幕亚洲成人| 精品卡一卡二卡三卡四在线| 99精品久久99久久久久| 蜜臀av一区二区在线观看| 中文字幕人成不卡一区| 精品国精品国产尤物美女| 日本乱码高清不卡字幕| 国产成人av影院| 免费欧美高清视频| 亚洲精品免费看| 欧美国产精品专区| 精品乱人伦一区二区三区| 91国内精品野花午夜精品|