亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产精品欧美一级免费| 狠狠色狠狠色综合系列| 亚洲一区二区三区在线| 亚洲国产一区二区在线播放| 奇米色777欧美一区二区| 麻豆传媒一区二区三区| 国产乱人伦精品一区二区在线观看 | 国产精品自拍在线| 成人av资源站| 在线看日本不卡| 在线观看日韩高清av| 日韩一区二区视频| 欧美一级理论性理论a| 亚洲精品一区二区三区福利| 欧美韩国日本一区| 国产校园另类小说区| 亚洲乱码国产乱码精品精的特点 | 亚洲精品成人精品456| 午夜精品一区二区三区电影天堂| 老司机免费视频一区二区| 成人h动漫精品| 欧美日韩免费在线视频| 国产欧美一区二区精品仙草咪| 亚洲欧洲99久久| 麻豆精品久久精品色综合| 成人美女视频在线观看18| 欧美日韩免费一区二区三区 | 精久久久久久久久久久| 91香蕉国产在线观看软件| 欧美一区二区在线不卡| 亚洲人成精品久久久久久| 蜜臀久久久99精品久久久久久| 91一区二区三区在线观看| 91精品国产色综合久久不卡电影| 精品日韩在线观看| 亚洲国产wwwccc36天堂| 国产精品一级在线| 91麻豆精品国产91久久久久久久久| 久久精品免视看| 美女在线视频一区| 99久久夜色精品国产网站| 精品视频在线免费观看| 国产精品蜜臀av| 美女一区二区三区在线观看| 欧美亚洲国产一卡| 中文在线免费一区三区高中清不卡| 免费在线观看一区| 色婷婷国产精品久久包臀| 欧美丰满美乳xxx高潮www| 中文字幕中文字幕一区| 久久成人久久鬼色| 7777精品伊人久久久大香线蕉的 | 亚洲成av人片在线观看无码| 丁香婷婷深情五月亚洲| 精品成人在线观看| 午夜精品久久一牛影视| 久久电影网站中文字幕| 欧美一区二区精品久久911| 亚洲欧美日韩在线不卡| 福利一区在线观看| 日韩久久久精品| 久久精品国产第一区二区三区| 在线观看一区二区视频| 国产精品福利一区二区| 国产一区二区免费视频| 欧美一级久久久久久久大片| 天堂午夜影视日韩欧美一区二区| 一本久久综合亚洲鲁鲁五月天| 中文字幕在线不卡视频| 国产一区二区三区黄视频 | 欧美韩国日本不卡| 国产美女av一区二区三区| 91精品国产综合久久精品| 日韩中文字幕不卡| 欧美电影在线免费观看| 亚洲免费观看高清在线观看| 色菇凉天天综合网| 《视频一区视频二区| 91麻豆精品秘密| 亚洲免费电影在线| 欧美怡红院视频| 洋洋成人永久网站入口| 欧美日韩免费在线视频| 亚洲国产欧美在线人成| 欧美日韩亚洲国产综合| 五月综合激情婷婷六月色窝| 91麻豆精品视频| 午夜视频一区二区三区| 欧美在线一区二区| 天天色天天操综合| 91精品国产手机| 国产乱人伦精品一区二区在线观看| 精品国产电影一区二区| 成人免费毛片a| 中文字幕视频一区二区三区久| 91免费版pro下载短视频| 亚洲激情av在线| 色美美综合视频| 午夜精品久久久久久久99樱桃 | 奇米精品一区二区三区四区| 日韩一区二区在线看片| 亚洲一区二区欧美| 精品污污网站免费看| 美女脱光内衣内裤视频久久影院| 日韩欧美国产电影| 国产99久久精品| 亚洲人成影院在线观看| 欧美精品乱码久久久久久| 日本视频中文字幕一区二区三区| 久久综合成人精品亚洲另类欧美 | 成人黄色在线视频| 一区二区三区不卡视频在线观看| 欧美午夜电影在线播放| 亚洲国产日韩a在线播放性色| 精品国产欧美一区二区| 国产不卡视频在线播放| 亚洲乱码国产乱码精品精98午夜 | 久久精品在这里| 色悠久久久久综合欧美99| 亚洲国产一二三| 日韩一区二区视频| 成人免费观看视频| 亚洲综合图片区| 欧美精品成人一区二区三区四区| 国产在线精品国自产拍免费| 日本一区二区免费在线| 日本丶国产丶欧美色综合| 亚洲一区二区三区视频在线| 国产亚洲一区二区三区在线观看| 一本色道久久综合亚洲91| 狠狠久久亚洲欧美| 亚洲精品视频免费看| 久久免费精品国产久精品久久久久| av中文字幕不卡| 极品少妇一区二区| 亚洲美女免费视频| 久久久久久一二三区| 色香蕉久久蜜桃| 国产成人亚洲综合a∨婷婷| 玉足女爽爽91| 国产区在线观看成人精品 | 性做久久久久久免费观看| 国产视频不卡一区| 欧美天堂亚洲电影院在线播放| 国产精品亚洲午夜一区二区三区| 亚洲线精品一区二区三区| 久久综合av免费| 欧美日韩国产区一| 国产精品2024| 五月激情六月综合| 欧美一级高清片| 欧美色男人天堂| 精品亚洲成av人在线观看| 午夜精品久久久久久久蜜桃app| 日本一区二区三区免费乱视频 | 国产在线日韩欧美| 亚洲综合男人的天堂| 国产精品久久影院| 日韩午夜电影在线观看| 欧美日韩国产高清一区| 成人av在线播放网址| 丰满少妇在线播放bd日韩电影| 偷拍一区二区三区四区| 亚洲第一av色| 亚洲欧美在线视频观看| 国产日韩精品一区二区浪潮av| 欧美日韩卡一卡二| 欧美在线观看视频在线| 风间由美一区二区av101| 国产一区视频网站| 裸体一区二区三区| 日韩成人精品在线观看| 亚洲小说欧美激情另类| 亚洲愉拍自拍另类高清精品| 综合激情成人伊人| 国产精品久久精品日日| 国产人伦精品一区二区| 久久久不卡网国产精品二区| 日韩欧美一区二区在线视频| 91精品综合久久久久久| 欧洲人成人精品| 欧美日韩国产综合视频在线观看| 91成人免费电影| 在线视频国产一区| 色8久久精品久久久久久蜜| 99re亚洲国产精品| eeuss鲁片一区二区三区| 91视频观看视频| 成人av集中营| 国产不卡视频在线播放| 国产精品一区二区你懂的| 国产精品资源网| 国产传媒久久文化传媒| 国产91富婆露脸刺激对白| 国产91精品一区二区麻豆网站| 成人综合婷婷国产精品久久蜜臀| 国产精品1区2区| yourporn久久国产精品| 99视频国产精品| 91国产精品成人|