亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲人成7777| 99视频在线精品| jizz一区二区| 7777精品伊人久久久大香线蕉完整版| 久久久久国产精品麻豆ai换脸| 一区二区三区精品视频| 国产成人精品免费在线| 91.com在线观看| 亚洲蜜臀av乱码久久精品| 国产呦精品一区二区三区网站| 欧美又粗又大又爽| 中文字幕一区二区三区四区不卡 | 欧美一区午夜视频在线观看 | 久久男人中文字幕资源站| 国产一区二区不卡在线| 欧美日韩大陆在线| 夜夜嗨av一区二区三区| 成人免费观看视频| 国产三级三级三级精品8ⅰ区| 日本欧美一区二区三区| 在线视频中文字幕一区二区| ㊣最新国产の精品bt伙计久久| 久草在线在线精品观看| 欧美va亚洲va香蕉在线| 三级一区在线视频先锋| 7777女厕盗摄久久久| 亚洲成av人片观看| 欧美日韩美少妇| 亚洲123区在线观看| 欧美性videosxxxxx| 一区二区三区在线高清| 在线精品亚洲一区二区不卡| 一区二区三区四区在线播放 | 欧美丰满少妇xxxxx高潮对白| 一区二区三区欧美日| 色狠狠av一区二区三区| 玉足女爽爽91| 欧美日韩视频在线观看一区二区三区| 亚洲精品视频在线观看网站| 一本久道久久综合中文字幕| 一区二区三区在线观看动漫 | 99国内精品久久| 一区二区中文字幕在线| 在线视频欧美精品| 首页亚洲欧美制服丝腿| 欧美变态口味重另类| 国产在线一区二区综合免费视频| 日韩欧美成人午夜| 国产成人免费av在线| 国产精品美女一区二区三区| proumb性欧美在线观看| 亚洲自拍偷拍麻豆| 日韩精品一区二区三区蜜臀| 韩国三级中文字幕hd久久精品| 国产丝袜欧美中文另类| 一本大道久久a久久精二百| 亚洲国产一区二区在线播放| 欧美一区中文字幕| 国产91综合一区在线观看| 椎名由奈av一区二区三区| 欧美日韩免费一区二区三区| 久久91精品久久久久久秒播| 中文字幕国产一区二区| 欧美日韩中文一区| 国产成人精品免费视频网站| 亚洲精品福利视频网站| 精品美女被调教视频大全网站| 不卡av免费在线观看| 日日欢夜夜爽一区| 国产精品青草综合久久久久99| 色噜噜狠狠色综合中国| 在线观看视频一区二区| 美女mm1313爽爽久久久蜜臀| 国产精品剧情在线亚洲| 日韩西西人体444www| 99精品热视频| 激情图片小说一区| 亚洲国产精品久久人人爱蜜臀| 久久综合五月天婷婷伊人| 欧洲精品在线观看| 成人高清伦理免费影院在线观看| 三级一区在线视频先锋 | 久久理论电影网| 欧美日韩久久一区二区| 成人免费av资源| 美女视频第一区二区三区免费观看网站 | 国产亚洲一本大道中文在线| 欧美性猛交一区二区三区精品| 国产精一区二区三区| 三级不卡在线观看| 亚洲黄色小视频| 国产日韩欧美精品电影三级在线| 8v天堂国产在线一区二区| 91免费观看在线| 国产98色在线|日韩| 狠狠色丁香婷综合久久| 蜜桃精品在线观看| 亚州成人在线电影| 中文字幕亚洲一区二区av在线| 久久综合精品国产一区二区三区 | 国产午夜一区二区三区| 日韩一区二区电影网| 91福利视频在线| 97精品视频在线观看自产线路二| 国产成人免费视频网站| 国产在线视频精品一区| 免费成人深夜小野草| 亚洲成人精品在线观看| 亚洲精品久久久蜜桃| 亚洲美女淫视频| 亚洲激情综合网| 一区二区日韩av| 亚洲一区二区成人在线观看| 亚洲免费成人av| 亚洲人成网站色在线观看| 亚洲日本乱码在线观看| 一区二区三区波多野结衣在线观看| 亚洲男人的天堂网| 一区二区欧美精品| 亚洲国产精品久久久久婷婷884| 亚洲成国产人片在线观看| 亚洲福利视频三区| 天天综合天天综合色| 日本在线观看不卡视频| 久久99精品国产麻豆不卡| 激情偷乱视频一区二区三区| 国产精品一区二区久激情瑜伽| 国产福利91精品一区二区三区| 粉嫩在线一区二区三区视频| 97精品久久久久中文字幕| 欧美精品一区二区久久婷婷| 久久久一区二区| 亚洲欧洲国产日韩| 午夜视频在线观看一区| 国内精品久久久久影院薰衣草| 国产精品18久久久久久vr| 99精品视频在线观看| 欧美日韩一级片网站| 精品久久久久久无| 亚洲欧洲精品一区二区三区 | 麻豆一区二区三| 高清在线成人网| 色偷偷一区二区三区| 欧美一区二区三区啪啪| 精品国产污网站| 亚洲欧美激情一区二区| 免费成人深夜小野草| 国产91精品免费| 欧美午夜精品电影| 久久嫩草精品久久久久| 亚洲综合图片区| 国内精品伊人久久久久影院对白| 99久久精品国产精品久久| 欧美剧情电影在线观看完整版免费励志电影 | 99视频精品在线| 91精品国产综合久久精品图片 | 一区二区三区中文在线| 久久99精品网久久| 91国内精品野花午夜精品| 精品区一区二区| 一区二区三区四区中文字幕| 国产一区二区在线电影| 欧美日韩在线直播| 国产日产精品1区| 日韩精品三区四区| 99久久伊人精品| 久久久久久久久久久久久久久99| 亚洲午夜免费福利视频| 成人午夜精品一区二区三区| 欧美一区二区在线看| 一区二区三区四区在线免费观看 | 美女看a上一区| 欧美丝袜丝交足nylons| 欧美国产精品一区二区| 日韩国产精品91| 色婷婷一区二区| 中文字幕在线播放不卡一区| 老司机午夜精品| 7777精品伊人久久久大香线蕉经典版下载 | 91美女片黄在线观看91美女| 久久精品人人做人人爽97| 伦理电影国产精品| 欧美蜜桃一区二区三区| 亚洲精品久久久久久国产精华液| 高清视频一区二区| 欧美成人欧美edvon| 日本免费新一区视频| 欧美日韩专区在线| 亚洲国产视频直播| 色婷婷久久久综合中文字幕| 国产精品久久久久aaaa樱花| 国产剧情一区在线| 日韩一区二区免费视频| 图片区小说区国产精品视频| 欧美午夜精品久久久| 亚洲国产视频一区二区| 欧美日韩一级大片网址| 香蕉av福利精品导航| 欧美日韩一区二区三区免费看| 亚洲图片欧美视频|