亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美电视剧免费观看| 欧美电视剧在线观看完整版| 免费的成人av| 亚洲天堂久久久久久久| 日韩福利视频导航| 欧美性大战久久久久久久蜜臀| 理论电影国产精品| 亚洲蜜桃精久久久久久久| 2021国产精品久久精品| 欧美性一区二区| 成人午夜精品一区二区三区| 免费不卡在线观看| 亚洲动漫第一页| 中文字幕中文乱码欧美一区二区 | 亚洲色欲色欲www在线观看| 日韩欧美一级在线播放| 欧美性一级生活| 91黄色免费观看| 床上的激情91.| 国产v综合v亚洲欧| 久草这里只有精品视频| 蜜桃视频免费观看一区| 亚洲成人免费影院| 亚洲尤物视频在线| 亚洲美腿欧美偷拍| 99久久国产免费看| 日本免费新一区视频| 亚洲线精品一区二区三区八戒| 国产精品久久久一本精品 | 欧美丰满美乳xxx高潮www| 97国产一区二区| 国产精选一区二区三区| 日韩精品免费专区| 日本在线不卡视频一二三区| 午夜电影一区二区三区| 一区二区三区美女视频| 亚洲精品成人在线| 亚洲欧洲精品一区二区三区不卡| 日韩国产欧美三级| 日本女优在线视频一区二区| 国产精品欧美综合在线| 51精品久久久久久久蜜臀| 天天免费综合色| 一区二区三区成人| 91精品在线免费观看| 欧美一区二区三区四区五区| 亚洲国产va精品久久久不卡综合| 国产欧美精品一区二区色综合| 国产日韩欧美电影| 69精品人人人人| 日韩精品一区在线| 日本一区二区三区视频视频| 国产精品久久久久久久久晋中| 自拍偷拍国产精品| 亚洲国产欧美在线人成| 午夜视频一区二区三区| 另类小说综合欧美亚洲| 国产一区二区三区四区在线观看 | 中文字幕一区二区三区乱码在线| 国产精品视频九色porn| 亚洲综合色成人| 麻豆精品在线播放| 精品久久久三级丝袜| 国产亚洲自拍一区| 中日韩av电影| 一区二区三区国产豹纹内裤在线| 亚洲福利视频三区| 激情成人午夜视频| 99久久精品国产网站| 欧美二区乱c少妇| 国产亚洲一区字幕| 亚洲小说欧美激情另类| 国产在线一区观看| 91年精品国产| 日韩一区二区三区视频在线观看| 亚洲国产精品国自产拍av| 亚洲欧洲av另类| 免费观看91视频大全| caoporn国产一区二区| 欧美乱妇15p| 久久精品欧美日韩| 五月综合激情网| 国产成人8x视频一区二区| 精品视频全国免费看| 久久久精品国产99久久精品芒果| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 日日摸夜夜添夜夜添精品视频| 久久99九九99精品| 91丨九色丨国产丨porny| 日韩视频在线一区二区| 亚洲欧洲av在线| 日韩电影在线免费看| 成人av网址在线| 日韩午夜三级在线| 亚洲夂夂婷婷色拍ww47| 国产精品66部| 欧美一区日本一区韩国一区| 最新成人av在线| 国产成人在线视频免费播放| 在线播放一区二区三区| 亚洲欧美成人一区二区三区| 国内精品免费在线观看| 欧美一区二区三区免费| 亚洲国产人成综合网站| 99久久国产免费看| 日韩精品一区二区三区四区视频 | 日韩欧美成人激情| 亚洲成人免费看| 不卡高清视频专区| 欧美午夜在线观看| 在线视频你懂得一区| 8x8x8国产精品| 亚洲女人****多毛耸耸8| 国产精品99久久久久久久vr| 欧美大片在线观看一区二区| 亚洲美女视频一区| a在线欧美一区| 久久久久久久久久看片| 琪琪久久久久日韩精品| 欧美美女直播网站| 夜夜嗨av一区二区三区四季av| 91在线视频免费观看| 国产精品乱人伦| 国产91精品免费| 亚洲国产精品成人综合色在线婷婷| 蜜桃视频在线一区| 欧美一区二区三区视频在线| 日韩高清不卡一区二区三区| 欧美伦理电影网| 天天色天天操综合| 欧美一区二区三区视频在线| 日韩av成人高清| 欧美一区二区三区公司| 美女精品一区二区| 精品国产精品网麻豆系列| 激情综合亚洲精品| 欧美日韩日日摸| 国产精品卡一卡二卡三| 不卡电影一区二区三区| 成人免费在线视频观看| 99久久国产综合精品女不卡| 亚洲你懂的在线视频| 欧洲中文字幕精品| 婷婷综合久久一区二区三区| 7777女厕盗摄久久久| 久草在线在线精品观看| 久久久精品影视| 成人h动漫精品一区二区| 亚洲欧美激情视频在线观看一区二区三区| 成人av网在线| 一区二区三区中文免费| 欧美精品三级在线观看| 激情文学综合丁香| 国产精品看片你懂得| 欧洲国内综合视频| 天天色天天操综合| 久久亚洲捆绑美女| 成人99免费视频| 亚洲成av人在线观看| 日韩欧美一区二区免费| 国产98色在线|日韩| 亚洲欧美视频一区| 欧美一级欧美一级在线播放| 国产高清在线精品| 国产一区二区h| 中文字幕一区二区在线观看| 在线欧美日韩国产| 精品一区在线看| 亚洲欧美另类小说| 欧美一级午夜免费电影| 成人动漫在线一区| 天堂影院一区二区| 久久青草欧美一区二区三区| 色女孩综合影院| 亚洲不卡在线观看| 欧美激情在线免费观看| 日本高清不卡在线观看| 狠狠色狠狠色综合系列| 亚洲人成网站在线| 精品国产一区二区三区久久影院 | 欧美网站一区二区| 麻豆久久久久久久| 亚洲色图制服丝袜| 日韩精品专区在线影院重磅| 91偷拍与自偷拍精品| 美日韩一区二区三区| 国产精品福利一区| 精品伦理精品一区| 欧美日韩亚洲综合一区| 成人高清视频在线| 极品少妇一区二区三区精品视频 | 亚洲一区二区三区在线播放| 欧美精品一区二区在线观看| 欧美性大战xxxxx久久久| www.欧美.com| 久久草av在线| 亚洲一区二区欧美日韩 | 蜜桃一区二区三区在线| 亚洲午夜av在线| 国产精品夫妻自拍|