📄 sys32.inc
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; MenuetOS process management, protected ring3 ;;
;; ;;
;; Distributed under GPL. See file COPYING for details. ;;
;; Copyright 2003 Ville Turjanmaa ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 4
irq0:
cmp [error_interrupt],-1
je no_error_in_previous_process
mov edi,[error_interrupt]
imul edi,8
mov [edi+tss0i_l +5], word 01010000b *256 +11101001b
mov edi,[error_interrupt]
imul edi,128
add edi,0x290000
mov esi,[error_interrupt_entry]
mov [edi+l.eip-tss_sceleton],esi
mov [edi+l.eflags-tss_sceleton],dword 0x11002
mov [0xffff],byte 0
mov [error_interrupt],-1
no_error_in_previous_process:
mov edi,[0x3000]
imul edi,8
mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
inc dword [0xfdf0]
mov eax,[0xfdf0]
cmp eax,[next_usage_update]
jb nocounter
add eax,100
mov [next_usage_update],eax
call updatecputimes
nocounter:
mov edi,[0x3010]
mov ebx,[edi+0x18]
call _rdtsc
sub eax,ebx
add eax,[edi+0x14]
mov [edi+0x14],eax
mov ebx,[0x3000]
cmp [0xffff],byte 1
je do_not_change_task
waiting_for_termination:
waiting_for_reuse:
add edi,0x20
inc ebx
cmp [edi+0xa],byte 3
je waiting_for_termination
cmp [edi+0xa],byte 4
je waiting_for_termination
cmp [edi+0xa],byte 9
je waiting_for_reuse
cmp ebx,[0x3004]
jbe nsched0
mov ebx,1
mov edi,0x3020
nsched0:
mov [0x3000],ebx
mov [0x3010],edi
do_not_change_task:
call _rdtsc
mov [edi+0x18],eax
cmp [0xffff],byte 0
je nodecffff
dec byte [0xffff]
nodecffff:
shl bx,3
add bx,tss0
mov [tss_s],bx
mov al,0x20
mov dx,0x20
out dx,al
db 0xea
tss_t dd 0
tss_s dw tss0t
jmp irq0
next_usage_update dd 100
change_task:
mov [0xffff],byte 2
dec dword [0xfdf0]
int 0x20
ret
align 4
; GDT TABLE
gdts:
dw gdte-$-1
dd gdts
dw 0
os_code_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10011010b
db 0x00
os_data_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10010010b
db 0x00
graph_data_l:
dw 0xff
dw 0x0000
db 0x00
dw 11011111b *256 +11110010b
db 0x00
ring3_code_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +11111010b
db 0x00
ring3_data_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +11110010b
db 0x00
ring2_code_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +11011010b
db 0x00
ring2_data_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +11010010b
db 0x00
ring1_code_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10111010b
db 0x00
ring1_data_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10110010b
db 0x00
int_code_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10011110b
db 0x00
int_data_l:
dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10010010b
db 0x00
tss0_l:
times (max_processes+10) dd 0,0
tss0t_l:
times (max_processes+10) dd 0,0
tss0i_l:
times (256+10) dd 0,0
app_code_l:
times (max_processes+10) dd 0,0
app_data_l:
times (max_processes+10) dd 0,0
tss0sys_l:
times (max_processes+10) dd 0,0
gdte:
idts:
dw idte-$-1
dd idts+8
dw 0
times 0x62 dd 0,0
idte:
build_process_gdt_tss_pointer:
mov ecx,tss_data
mov edi,0
setgdtl2:
mov [edi+gdts+ tss0 +0], word tss_step
mov [edi+gdts+ tss0 +2], cx
mov eax,ecx
shr eax,16
mov [edi+gdts+ tss0 +4], al
mov [edi+gdts+ tss0 +7], ah
mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
add ecx,tss_step
add edi,8
cmp edi,8*(max_processes+5)
jbe setgdtl2
ret
build_process_gdt_gate_pointer:
mov edi,0
mov dx,tss0
setidtl1:
mov ecx,[esi]
mov [edi+gdts+ tss0t +0], word 0
mov [edi+gdts+ tss0t +2], dx
mov [edi+gdts+ tss0t +4], word 11100101b*256
mov [edi+gdts+ tss0t +6], word 0
add dx,8
add edi,8
cmp edi,8*(max_processes+5)
jb setidtl1
ret
build_interrupt_table:
mov [l.eflags],dword 0x11002
mov [l.ss0], int_data
mov [l.ss1], ring1_data
mov [l.ss2], ring2_data
mov [l.esp0], 0x52000
mov [l.esp1], 0x53000
mov [l.esp2], 0x54000
mov eax,cr3
mov [l.cr3],eax
mov [l.cs],int_code
mov [l.ss],int_data
mov [l.ds],int_data
mov [l.es],int_data
mov [l.fs],int_data
mov [l.gs],int_data
mov eax,sys_int
mov [l.esp],0x720000
mov edi,0x290000
newint:
push edi
mov ebx,[eax]
mov [l.eip],ebx
mov esi,tss_sceleton
mov ecx,120/4
cld
rep movsd
pop edi
add edi,128
add [l.esp],1024
add eax,4
cmp eax,sys_int+4*0x60
jb newint
;;
mov esi,boot_sched_3_2
call boot_log
mov ecx,0x290000
mov edi,0
setgdtl2i:
mov [edi+gdts+ tss0i +0], word 128
mov [edi+gdts+ tss0i +2], cx
mov eax,ecx
shr eax,16
mov [edi+gdts+ tss0i +4], al
mov [edi+gdts+ tss0i +7], ah
mov [edi+gdts+ tss0i +5], word 01010000b *256 +11101001b
add ecx,128
add edi,8
cmp edi,8*0x60
jbe setgdtl2i
;;
mov esi,boot_sched_3_3
call boot_log
mov edi,0
mov edx,tss0i
setidtl2:
mov [edi+idts+ 8 +0], word 0
mov [edi+idts+ 8 +2], dx
mov [edi+idts+ 8 +4], word 10000101b*256
cmp edi,0x40*8
jne no_sw_int
mov [edi+idts+ 8 +4], word 11100101b*256
no_sw_int:
mov [edi+idts+ 8 +6], word 0
add edx,8
add edi,8
cmp edi,8*0x60
jb setidtl2
ret
build_syscall_interrupt_table:
mov [l.eflags],dword 0x11002
mov [l.ss0], int_data
mov [l.ss1], ring1_data
mov [l.ss2], ring2_data
mov [l.esp0], 0x52000
mov [l.esp1], 0x53000
mov [l.esp2], 0x54000
mov eax,cr3
mov [l.cr3],eax
mov [l.cs],int_code
mov [l.ss],int_data
mov [l.ds],int_data
mov [l.es],int_data
mov [l.fs],int_data
mov [l.gs],int_data
mov [l.esp],sysint_stack_data
mov edi,0x298000
newint2:
push edi
mov ebx,i40
mov [l.eip],ebx
mov esi,tss_sceleton
mov ecx,120/4
cld
rep movsd
pop edi
add [l.esp],4096
add edi,128
add eax,4
cmp edi,0x298000+128*(max_processes+5)
jb newint2
;;
mov ecx,0x298000
mov edi,0
setgdtl2i2:
mov [edi+gdts+ tss0sys +0], word 128
mov [edi+gdts+ tss0sys +2], cx
mov eax,ecx
shr eax,16
mov [edi+gdts+ tss0sys +4], al
mov [edi+gdts+ tss0sys +7], ah
mov [edi+gdts+ tss0sys +5], word 01010000b *256 +11101001b
add ecx,128
add edi,8
cmp edi,8*(max_processes+5)
jbe setgdtl2i2
;;
mov dx,tss0sys
mov edi,8*0x40
mov [edi+idts+ 8 +0], word 0
mov [edi+idts+ 8 +2], dx
mov [edi+idts+ 8 +4], word 11100101b*256
mov [edi+idts+ 8 +6], word 0
ret
updatecputimes:
pusha
call _rdtsc
mov eax,[idleuse]
mov [idleusesec],eax
mov [idleuse],dword 0
mov ecx,[0x3004]
mov edi,0x3020
newupdate:
mov ebx,[edi+0x14]
mov [edi+0x1c],ebx
mov [edi+0x14],dword 0
add edi,0x20
loop newupdate
popa
ret
sys_int:
dd s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc,sd,se,sf
dd s10 ,s11 ,i_unknown12,i_unknown13
dd i_unknown14,i_unknown15,i_unknown16,i_unknown17
dd i_unknown18,i_unknown19,i_unknown1a,i_unknown1b
dd i_unknown1c,i_unknown1d,i_unknown1e,i_unknown1f
dd irq0 ,irq1 ,p_irq2 ,p_irq3 ,p_irq4 ,p_irq5,p_irq6 ,p_irq7
dd p_irq8,p_irq9,p_irq10,p_irq11,p_irq12,irqD ,p_irq14,p_irq15
dd i_unknown30,i_unknown31,i_unknown32,i_unknown33
dd i_unknown34,i_unknown35,i_unknown36,i_unknown37
dd i_unknown38,i_unknown39,i_unknown3a,i_unknown3b
dd i_unknown3c,i_unknown3d,i_unknown3e,i_unknown3f
dd i40 ,i_unknown41,i_unknown42,i_unknown43
dd i_unknown44,i_unknown45,i_unknown46,i_unknown47
dd i_unknown48,i_unknown49,i_unknown4a,i_unknown4b
dd i_unknown4c,i_unknown4d,i_unknown4e,i_unknown4f
dd i_unknown50,i_unknown51,i_unknown52,i_unknown53
dd i_unknown54,i_unknown55,i_unknown56,i_unknown57
dd i_unknown58,i_unknown59,i_unknown5a,i_unknown5b
dd i_unknown5c,i_unknown5d,i_unknown5e,i_unknown5f
dd i_unknown60,i_unknown61,i_unknown62,i_unknown63
dd i_unknown64,i_unknown65,i_unknown66,i_unknown67
dd i_unknown68,i_unknown69,i_unknown6a,i_unknown6b
dd i_unknown6c,i_unknown6d,i_unknown6e,i_unknown6f
dd i_unknown70,i_unknown71,i_unknown72,i_unknown73
dd i_unknown74,i_unknown75,i_unknown76,i_unknown77
dd i_unknown78,i_unknown79,i_unknown7a,i_unknown7b
dd i_unknown7c,i_unknown7d,i_unknown7e,i_unknown7f
dd i_unknown80,i_unknown81,i_unknown82,i_unknown83
dd i_unknown84,i_unknown85,i_unknown86,i_unknown87
dd i_unknown88,i_unknown89,i_unknown8a,i_unknown8b
dd i_unknown8c,i_unknown8d,i_unknown8e,i_unknown8f
dd i_unknown90,i_unknown91,i_unknown92,i_unknown93
dd i_unknown94,i_unknown95,i_unknown96,i_unknown97
dd i_unknown98,i_unknown99,i_unknown9a,i_unknown9b
dd i_unknown9c,i_unknown9d,i_unknown9e,i_unknown9f
dd i_unknowna0,i_unknowna1,i_unknowna2,i_unknowna3
dd i_unknowna4,i_unknowna5,i_unknowna6,i_unknowna7
dd i_unknowna8,i_unknowna9,i_unknownaa,i_unknownab
dd i_unknownac,i_unknownad,i_unknownae,i_unknownaf
dd i_unknownb0,i_unknownb1,i_unknownb2,i_unknownb3
dd i_unknownb4,i_unknownb5,i_unknownb6,i_unknownb7
dd i_unknownb8,i_unknownb9,i_unknownba,i_unknownbb
dd i_unknownbc,i_unknownbd,i_unknownbe,i_unknownbf
dd i_unknownc0,i_unknownc1,i_unknownc2,i_unknownc3
dd i_unknownc4,i_unknownc5,i_unknownc6,i_unknownc7
dd i_unknownc8,i_unknownc9,i_unknownca,i_unknowncb
dd i_unknowncc,i_unknowncd,i_unknownce,i_unknowncf
dd i_unknownd0,i_unknownd1,i_unknownd2,i_unknownd3
dd i_unknownd4,i_unknownd5,i_unknownd6,i_unknownd7
dd i_unknownd8,i_unknownd9,i_unknownda,i_unknowndb
dd i_unknowndc,i_unknowndd,i_unknownde,i_unknowndf
dd i_unknowne0,i_unknowne1,i_unknowne2,i_unknowne3
dd i_unknowne4,i_unknowne5,i_unknowne6,i_unknowne7
dd i_unknowne8,i_unknowne9,i_unknownea,i_unknowneb
dd i_unknownec,i_unknowned,i_unknownee,i_unknownef
dd i_unknownf0,i_unknownf1,i_unknownf2,i_unknownf3
dd i_unknownf4,i_unknownf5,i_unknownf6,i_unknownf7
dd i_unknownf8,i_unknownf9,i_unknownfa,i_unknownfb
dd i_unknownfc,i_unknownfd,i_unknownfe,i_unknownff
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; SYSTEM CALL ENTRY ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 4
i40:
cli
mov edi,[0x3000]
imul edi,8
mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
mov eax,[schd]
mov [usedi40+eax],byte 1
push eax
mov edi,[0x3000]
imul edi,256
mov [edi+0x80000+0xB0],eax
mov eax,1 ; search from 1 ( 0 reserved for 'not used' in app )
search_free_i40:
cmp [usedi40+eax],byte 0
je found_free_i40
inc eax
cmp eax,max_processes+10
jbe search_free_i40
jmp $
found_free_i40:
mov [schd],eax
mov edx,8
imul edx,[schd]
add edx,tss0sys
mov edi,8*0x40
mov [edi+idts+ 8 +0], word 0
mov [edi+idts+ 8 +2], dx
mov [edi+idts+ 8 +4], word 11100101b*256
mov [edi+idts+ 8 +6], word 0
mov ebx,[0x3000]
shl ebx,3
add ebx,tss0_l
mov ecx,[0x3000]
shl ecx,2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -