亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产一区三区三区| 极品美女销魂一区二区三区 | 久久久九九九九| 97se狠狠狠综合亚洲狠狠| 午夜精品久久久久久| 久久精品欧美日韩精品| 欧美日韩精品一区二区三区| 国产福利精品一区二区| 日本亚洲三级在线| 一区二区在线观看视频| 国产日韩精品一区| 日韩三级在线观看| 在线观看日韩国产| av中文一区二区三区| 国内精品伊人久久久久影院对白| 亚洲综合无码一区二区| 国产精品短视频| 久久综合久久综合久久综合| 欧美老肥妇做.爰bbww视频| 粗大黑人巨茎大战欧美成人| 经典三级在线一区| 免费国产亚洲视频| 天天av天天翘天天综合网| 成人免费视频在线观看| 国产精品午夜在线| 久久久不卡网国产精品二区| 日韩欧美一区电影| 在线观看91精品国产麻豆| 欧美日韩视频在线观看一区二区三区 | 日韩一区二区三免费高清| 91在线观看免费视频| 国产xxx精品视频大全| 国产一区二区电影| 国产美女精品在线| 精品一区二区三区在线观看国产| 蜜桃视频一区二区| 久久成人久久爱| 久久97超碰国产精品超碰| 日本 国产 欧美色综合| 免费看日韩a级影片| 久久狠狠亚洲综合| 久88久久88久久久| 精品一区二区三区欧美| 加勒比av一区二区| 成人中文字幕合集| 99re亚洲国产精品| 色婷婷一区二区三区四区| 色天天综合色天天久久| 91九色最新地址| 欧美色图天堂网| 欧美绝品在线观看成人午夜影视| 欧美老人xxxx18| 精品久久久久久最新网址| 日韩视频一区二区三区在线播放| 日韩欧美在线综合网| 精品国产91乱码一区二区三区| 欧美大尺度电影在线| 久久久国产午夜精品| 国产精品伦理一区二区| 亚洲乱码中文字幕| 天堂午夜影视日韩欧美一区二区| 久久精品理论片| 国产成人a级片| 97精品久久久久中文字幕| 欧美性三三影院| 日韩免费性生活视频播放| 国产亚洲精品超碰| 中文字幕中文字幕在线一区| 夜色激情一区二区| 美国十次综合导航| 国产成人午夜片在线观看高清观看| 成人h动漫精品一区二区| 欧美三级日本三级少妇99| 欧美女孩性生活视频| 久久五月婷婷丁香社区| 亚洲精品一二三| 六月丁香婷婷久久| 波多野结衣欧美| 日韩美女视频在线| 综合久久综合久久| 日产欧产美韩系列久久99| 国产成人在线视频网站| 欧美日韩五月天| 亚洲国产精品成人综合色在线婷婷| 亚洲另类在线制服丝袜| 精品亚洲成a人| 色婷婷久久久亚洲一区二区三区 | 久久综合成人精品亚洲另类欧美| 日韩久久一区二区| 久久激五月天综合精品| 色婷婷久久一区二区三区麻豆| 欧美成人高清电影在线| 亚洲乱码国产乱码精品精小说 | 91一区二区三区在线播放| 日韩欧美中文字幕一区| 亚洲精品国产第一综合99久久| 久久精品国产久精国产| 在线观看亚洲精品| 国产午夜精品久久久久久久| 图片区小说区国产精品视频| 成人va在线观看| 久久久久9999亚洲精品| 日韩主播视频在线| 99久久国产综合精品麻豆| 精品欧美一区二区久久| 午夜免费欧美电影| 91视频你懂的| 国产精品久久毛片| 国产一区二区在线看| 91麻豆精品国产91久久久使用方法 | 国产黄色精品网站| 91精品国产综合久久久久久| 亚洲欧洲精品一区二区三区| 国产真实乱偷精品视频免| 欧美日韩免费一区二区三区| 中文欧美字幕免费| 国产精品一区一区| 日韩午夜电影av| 丝袜美腿亚洲一区| 在线精品视频免费播放| 中文字幕亚洲综合久久菠萝蜜| 国产一二三精品| 欧美电影免费观看完整版| 丝袜美腿亚洲色图| 欧美日韩国产首页在线观看| 一区二区三区免费在线观看| 91在线一区二区| 亚洲天堂免费在线观看视频| 成人免费看片app下载| 国产午夜亚洲精品午夜鲁丝片| 精品一区二区免费看| 日韩欧美一区二区免费| 蜜桃av一区二区| 欧美大片顶级少妇| 毛片不卡一区二区| 日韩精品在线网站| 老司机精品视频在线| 欧美α欧美αv大片| 久久99精品国产91久久来源| 亚洲人成7777| 91国模大尺度私拍在线视频| 有码一区二区三区| 欧美少妇bbb| 日韩国产欧美一区二区三区| 日韩亚洲欧美综合| 国产一区欧美一区| 中文字幕精品在线不卡| 成人免费毛片高清视频| 亚洲欧美日韩人成在线播放| 色婷婷综合中文久久一本| 亚洲综合小说图片| 欧美精品日韩精品| 看片的网站亚洲| 国产日韩av一区| 91麻豆免费视频| 婷婷亚洲久悠悠色悠在线播放 | 欧美肥大bbwbbw高潮| 麻豆精品视频在线| 国产欧美一区二区三区网站 | 欧美成人精品1314www| 国产又黄又大久久| 中文字幕亚洲一区二区va在线| 91首页免费视频| 日日骚欧美日韩| 国产日韩欧美一区二区三区综合| 99久久久久免费精品国产| 亚洲国产欧美一区二区三区丁香婷| 在线播放国产精品二区一二区四区| 日本在线播放一区二区三区| 久久久久九九视频| 91久久久免费一区二区| 美女在线视频一区| 国产精品毛片无遮挡高清| 欧美日韩一区三区| 国产资源精品在线观看| 日韩美女视频一区| 欧美一区二区三区不卡| 国产成人aaa| 亚洲va国产天堂va久久en| 久久精品日韩一区二区三区| 色综合网色综合| 男人的j进女人的j一区| 国产精品久久久久精k8| 欧美乱熟臀69xxxxxx| 国产99久久精品| 婷婷开心激情综合| 国产精品久久久久毛片软件| 欧美一级理论片| 99国产精品久久久久久久久久| 青娱乐精品在线视频| 日韩一区欧美一区| 欧美xxxxx裸体时装秀| 99精品热视频| 久88久久88久久久| 亚洲777理论| 国产精品九色蝌蚪自拍| 精品免费日韩av| 色综合久久久久网| 国产精品正在播放| 人人精品人人爱|