?? gprocess.asm
字號:
SCHED PROC FAR
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AX,V_PCB_SEL
MOV FS,AX
; read cursor and save to PCB
MOV EBP,DS:[CURRENT]
MOV AH,03H
MOV BH,0
INT 80H
MOV FS:[EBP+242],DL
MOV FS:[EBP+243],DH
; read cursor and save to PCB
CMP DS:[CURRENT],0
JE SCHED_NO
MOV EAX,1024
CMP DS:[CURRENT],EAX
JNE SCHED_2
MOV EAX,512
SCHED_2:
MOV DS:[CURRENT],EAX
MOV EBP,EAX
; set cursor
MOV DL,FS:[EBP+242]
MOV DH,FS:[EBP+243]
MOV AH,02H
MOV BH,0
INT 80H
; set cursor
;call disp_ax
;;
;setup user_desc:stack\tss\ldt
PUSH EBP
PUSH GS
PUSH CX
MOV CX,32
MOV BX,OFFSET V_USER_PSTSS
MOV AX,V_GDT_ASDATA_SEL
MOV GS,AX
SCHED_2_2:
MOV AL,FS:[EBP+306]
MOV GS:[BX],AL
INC BX
INC EBP
LOOP SCHED_2_2
POP CX
POP GS
POP EBP
SCHED_NO:
;setup user_desc:stack\tss\ldt
;;;;;;3. recover new process: TSS in PCB---> real TSS
MOV AX,USER_PSTSS_D_SEL ;
MOV ES,AX
MOV CX,104
MOV BX,0
SCHED_DO:
MOV AL,FS:[EBP+138]
MOV ES:[BX],AL
INC BX
INC EBP
LOOP SCHED_DO
;;;;;;3. recover new process: TSS in PCB---> real TSS
jmp SCHED_c
SCHED_c:
DB 0EAH ;通過U.EXE的任務狀態段,執行U.EXE
DW 0
DW V_USER_PSTSS_SEL
SCHED ENDP
FORK PROC FAR
PUSH DS
PUSH FS
PUSH EBP
PUSH SI
;
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AX,V_PCB_SEL
MOV FS,AX
MOV BX,OFFSET PCB_NAME
CMP DS:[BX],1111 ;CMD process =11111111
JNE FORK_1
CMP DS:[BX+2],1111
JNE FORK_1
; IS CMD
MOV FS:[122],'C'
MOV FS:[123],'M'
MOV FS:[124],'D'
MOV FS:[125],0
MOV BX,0 ;0# PROCESS
MOV FS:[94],BX
MOV EBP,0
JMP FORK_3
FORK_1:
; seek free PCB
ADD DS:[CURRENT_PCB],1
MOV BP,DS:[CURRENT_PCB]
MOVZX EBP,BP
SHL EBP,9
FORK_11:
CMP FS:[EBP+94],0 ;free?
JZ FORK_12
ADD EBP,512
JMP FORK_11
FORK_12:
MOV EAX,EBP
SHR EAX,9 ;ax=uip
MOV FS:[EBP+94],AX ;uip
;push ax
;call disp_ax
;pop ax
;
FORK_2:
;setup user_desc:stack\tss\ldt
PUSH GS
PUSH EBP
PUSH BX
PUSH CX
MOV CX,32
MOV BX,0
MOV AX,V_GDT_ASDATA_SEL
MOV GS,AX
MOV BX,OFFSET V_USER_PSTSS
FORK_2_2:
MOV AL,GS:[BX]
MOV FS:[EBP+306],AL
;mov ah,0
;call disp_ax
INC EBP
INC BX
LOOP FORK_2_2
POP CX
POP BX
POP EBP
POP GS
;setup user_desc:stack\tss\ldt
; 2 links
; ebp=first addr for pcb in fs
MOV EBX,FS:[62] ; point to last process
MOV EAX,FS:[EBX+58]
MOV FS:[EBP+58],EAX ; next for new
MOV FS:[EBX+58],EBP
MOV FS:[EBX+62],EBP
MOV FS:[EBP+62],EBX ; prev
MOV EBX,FS:[70] ; point to last process
MOV EAX,FS:[EBX+66]
MOV FS:[EBP+66],EAX ; next for new
MOV FS:[EBX+66],EBP
MOV FS:[EBX+70],EBP
MOV FS:[EBP+70],EBX ; prev
; setup name
MOV EBX,0
FORK_22:
CMP DS:[PCB_NAME+BX],0
JZ FORK_3
MOV AL,DS:[PCB_NAME+BX]
MOV FS:[EBP+EBX+122],AL
INC EBX
JMP FORK_22
FORK_3:
;ebp=first addr for pcb in fs
MOV DWORD PTR FS:[EBP+0],0 ;state
MOV DWORD PTR FS:[EBP+4],100 ;state
MOV EAX,DS:[PCB_PRIORITY]
MOV DWORD PTR FS:[EBP+8],EAX ;priority
MOV DWORD PTR FS:[EBP+20],4 ;flag
;
MOV DX,0101H
MOV FS:[EBP+242],DL
MOV FS:[EBP+243],DH
;
MOV AX,DS:[PCB_TSS]
MOV DS,AX
MOV SI,0
MOV EBX,138
ADD EBX,EBP
FORK_31:
MOV EAX,DS:[SI]
MOV FS:[EBX],AL
INC SI
INC EBX
CMP SI,104
JNZ FORK_31
POP SI
POP EBP
POP FS
POP DS
RET
FORK ENDP
RUN_U1 PROC FAR
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
CALL MAKE_EXE
CMP AL,0
JNE EXE_ERROR
;;;;mmmmmm
; setup U1 process 1#
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AX,USER_PSTSS_D_SEL
MOV DS:[PCB_TSS],AX
MOV EAX,100
MOV DS:[PCB_PRIORITY],EAX
MOV DS:[PCB_NAME],'U'
MOV DS:[PCB_NAME+1],'1'
MOV DS:[PCB_NAME+2],0
CALL FORK
;;;;mmmmmm
; set cursor
;MOV AH,02H
;MOV BH,0
;MOV DX,0301H
;MOV DL,0
;INT 80H
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV DS:[CURRENT],512 ;user U1.EXE
;MOV BYTE PTR DS:[NEED_RESCHED],1 ;start schedule
;DB 0EAH ;通過U.EXE的任務狀態段,執行U.EXE
;DW 0
;dw V_USER_PsTSS_SEL
; set cursor
;MOV AX,V_TOS_DATA_SEL
;MOV DS,AX
;MOV AH,02H
;MOV BH,0
;MOV DX,0501H
;MOV DL,0
;INT 80H
;;;;;; display "C:\>"
;MOV DX,OFFSET COS_FLAG
;CALL STRDISP ;display "C:\>"
RET
RUN_U1 ENDP
MAKE_EXE PROC FAR
;;;;;;;;;;;DOS int21h 4eh
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
PUSH FS
MOV AX,V_GDT_ASDATA_SEL
MOV FS,AX
MOV EAX,400000H
CMP DS:[G_BUF_PTR],EAX
JNE RUN_EXE_1
MOV DS:[G_BUF_PTR],0H
JMP RUN_EXE_20 ;nothing to do
RUN_EXE_1:
MOV EDX,10000H
ADD DS:[G_BUF_PTR],EDX
MOV EDX,DS:[G_BUF_PTR]
ADD EDX,400000H
;push eax
;MOV eax,edx ;disp 0041
;shr eax,16
;call disp_ax
;mov eax,0fffffffh
;d1111:
;dec eax
;jnz d1111
;pop eax
MOV FS:[G_BUF].BASE_L,DX
SHR EDX,16
MOV FS:[G_BUF].BASE_M,DL
RUN_EXE_20:
MOV EDX,400000H
CMP DS:[USER_SEGS_PTR],EDX
JNE RUN_EXE_2
MOV DS:[USER_SEGS_PTR],0
JMP RUN_EXE_3
RUN_EXE_2:
MOV EDX,3000H
ADD DS:[USER_SEGS_PTR],EDX
MOV EDX,DS:[USER_SEGS_PTR]
ADD EDX,401000H
PUSH EDX
MOV FS:[V_USER_PSTSS].BASE_L,DX
MOV FS:[USER_PSTSS_D].BASE_L,DX
SHR EDX,16
MOV FS:[V_USER_PSTSS].BASE_M,DL
MOV FS:[USER_PSTSS_D].BASE_M,DL
POP EDX
ADD EDX,1000H
MOV FS:[V_USER_PSLDTT].BASE_L,DX
MOV FS:[USER_PSLDTT_ASDATA].BASE_L,DX
SHR EDX,16
MOV FS:[V_USER_PSLDTT].BASE_M,DL
MOV FS:[USER_PSLDTT_ASDATA].BASE_M,DL
;;COPY first to user_segs_ptr
MOV EAX,0
CMP DS:[USER_SEGS_PTR],EAX
JE RUN_EXE_3
;;MMMMMMMMMM
MOV AX,V_USER_SEGS_SEL
MOV FS,AX
;push eax
;MOV Eax,DS:[USER_SEGS_PTR]
;SHR EAX,16
;call disp_ax
;MOV Eax,DS:[USER_SEGS_PTR]
;call disp_ax
;mov eax,02ffFffffh
;d2222:
;dec eax
;jnz d2222
;pop eax
MOV EBX,DS:[USER_SEGS_PTR]
MOV ESI,0
MOV CX,12288
RUN_EXE_30:
mov AL,FS:[ESI]
mov FS:[EBX],AL ;4 BYTEs one time:error
ADD esi,4
ADD EBX,4
loop RUN_EXE_30
;;MMMMMMMMMM
RUN_EXE_3:
;;COPY first to user_segs_ptr
POP FS
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
;;;;; asciiz change to upper
MOV SI,OFFSET G_WORK ;FILE_NAME0
ADD SI,6 ;G_WORK=' run d:\ggtt\mode.txt'
RUN_EXE1: ; <------------------------------------
MOV AL,DS:[SI]
CMP AL,0
JE RUN_EXE_OK
; upper/lower
CMP AL,61H
JL RUN_EXE11
CMP AL,7AH
JA RUN_EXE11
SUB AL,20H
MOV DS:[SI],AL
RUN_EXE11: ; upper/lower
INC SI
LOOP RUN_EXE1
RUN_EXE_OK:
;;;;; asciiz change to upper
MOV ECX,0FFFFH ;to read count
MOV DX,OFFSET G_WORK ;FILE_NAME0
ADD DX,6 ;ds:dx file name asciiz
MOV AX,G_BUF_SEL
MOV ES,AX ;ES:EBX buffer
MOV EBX,0; ;buf offset 1M
CALL READFILE3F
CMP AX,0 ;ax<=0 error
JLE RUN_EXE_END
;U.EXE have been input to g_buf ax=length of u.exe
;nnnnnnnnnnnnn;
MOV BX,V_USER_PSLDT_SEL
LLDT BX
;*** 將c_buffer(放U.EXE)中內容? g_buf
;**********************開始處理 U.EXE
;MOV AX,TOS_DATA_SEL ;gggggggggggggg
MOV AX,V_TOS_DATA_SEL
MOV DS,AX ;TOS系統數據段
MOV AX,G_BUF_SEL
MOV GS,AX ;.exe(g_buf) 段,EXE頭+程序
;mov eax,ds:[g_buf_ptr]
;call disp_ax
;mov ax,0aaaah
;call disp_ax
MOV AX,USER_PS_SEL ;GDT中USER_PS的首址
SUB AX,04H
PUSH FS
CALL G_EXEC ;重定位,創建段表,開始2字節<>4D5AH,則不是DOS .exe
POP FS
CMP AX,1 ;
JZ RUN_EXE_ERR_EXEFIL
;**********************設置U.EXE的任務狀態段
MOV BL,DS:G_WORK[4]
MOV BH,DS:G_WORK[5]
MOV CL,DS:G_WORK[6]
MOV CH,DS:G_WORK[7]
push fs
mov ax,USER_PsTSS_D_SEL
mov fs,ax
mov fs:USER_Ps_TASK.TREIP,cx
mov fs:USER_Ps_TASK.TREIP+2,0
mov fs:USER_Ps_TASK.TRCS,USER_PS_SEL
mov fs:USER_Ps_TASK.TRCS+2,0
;pop fs
;jmp RUN_EXE_END ;OK1
mov fs:USER_Ps_TASK.TREFLAG,0 ;03000h
mov fs:USER_Ps_TASK.TRLDT,V_USER_PsLDT_SEL
mov fs:USER_Ps_TASK.TRLDT+2,0
MOV EAX,G_PDT_ADDR
mov fs:USER_Ps_TASK.trcr3,eax
mov al,ds:g_WORK
mov ah,ds:g_WORK[1]
mov fs:USER_Ps_TASK.TRDS,1Ch
mov fs:USER_Ps_TASK.TRDS+2,0
mov fs:USER_Ps_TASK.TRES,G_VRAM_SEL
mov fs:USER_Ps_TASK.TRES+2,0
mov fs:USER_Ps_TASK.TRSS0,ax ;V_STACK0_SEL
mov fs:USER_Ps_TASK.TRSS0+2,0
mov fs:USER_Ps_TASK.TRSS,AX
mov fs:USER_Ps_TASK.TRSS+2,0
mov al,ds:g_WORK[2]
mov ah,ds:g_WORK[3]
mov fs:USER_Ps_TASK.TRESP0,ax;08FFEH
mov fs:USER_Ps_TASK.TRESP0+2,0
mov fs:USER_Ps_TASK.TRESP,AX
mov fs:USER_Ps_TASK.TRESP+2,0
mov fs:USER_Ps_TASK.TRFLAG,0
pop fs
;sti
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AX,0
;nnnnnnnnnnnnnnn
;test
;push ax
;push fs
;push di
;push dx
;MOV aX,V_GDT_ASDATA_SEL
;MOV aX,USER_PSLDTT_ASDATA_SEL
; ;MOV aX,V_G_PT0_SEL
; ;mov ax,USER_PsTSS_D_SEL
; ;mov fs,ax
; ;mov di,32
; ;mov dx,2
; ;call disp_mem
;call disp_ldt_head
;pop dx
;pop di
;pop fs
;pop ax
;jmp RUN_EXE_END ;OK4
;test
JMP RUN_EXE_END
RUN_EXE_ERR_EXEFIL:
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AH,9
MOV CX,1100H
MOV DX,OFFSET ERR_EXEFILE
INT 21H
MOV AX,1
RUN_EXE_END:
RET
MAKE_EXE ENDP
READFILE3f PROC FAR
; input ds:Dx file name asciiz string Ecx=ready to read count
; es:ebx buffer
; output ax=-1 error ax=0 empty file ax>0 real read count
PUSH ES
PUSH EBX
MOV CX,0 ;search normal file
MOV AH,4EH
INT 21H
;;;;;;;;;;;DOS int21h 4eh
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
CMP DS:DAT,0 ;get diretory to DAT
JNE FILEGGERROR
CALL FREAD_DAT ;ax=read count
;push ax
; mov cx,0f26H
; call disp_ax ;length of u.exe
;pop ax
;MOV to es:ebx from V_FILE_BUF_SEL(DS:DX)
MOV CX,AX
POP EBX
POP ES
PUSH CX
MOV AX,V_FILE_BUF_SEL
MOV DS,AX
MOV DI,0
READFILE3f1:MOV EAX,DWORD PTR DS:[DI]
MOV DWORD PTR ES:[EBX],EAX
ADD EBX,4
ADD DI,4
LOOP READFILE3f1
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
POP AX ;OK to return READ COUNT
JMP FILEEND ;OK
FILEGGERROR:
POP EBX
POP ES
; read cursor
MOV AH,03H
MOV BH,0
INT 80H
; set cursor
MOV AH,02H
MOV BH,0
INC DH
MOV DL,0
INT 80H
MOV DX,OFFSET CMD_ERROR
CALL STRDISP
FILEEND:
RET
READFILE3F ENDP
SETUP_CMD PROC FAR
cli
;MOV AL,11111100B
;OUT 21H,AL
;time int
;PCB_init
MOV AX,V_PCB_SEL
MOV DS,AX
MOV CX,0FFFFH ;only do 64K*4 area
MOV EBX,0
MOV EAX,0
SETUP_CMD_1:
MOV DS:[EBX],EAX
ADD EBX,4
LOOP SETUP_CMD_1
;PCB_init
;process
; setup CMD process
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV BX,OFFSET PCB_TSS
MOV AX,V_TOS_TSSASDATA_SEL
MOV DS:[BX],AX
MOV BX,OFFSET PCB_PRIORITY
MOV EAX,100
MOV DS:[BX],EAX
MOV BX,OFFSET PCB_NAME
MOV AX,1111 ;CMD process =11111111
MOV DS:[BX],AX
MOV DS:[BX+2],AX
CALL FORK
; modify gdt for tos_tss
MOV AX,GDT_ASDATA_SEL
MOV GS,AX
MOV WORD PTR GS:[V_TOS_TSS+2],138
MOV BYTE PTR GS:[V_TOS_TSS+4],0FEH
MOV BYTE PTR GS:[V_TOS_TSS+7],0FFH
; modify gdt for tos_tss
;MOV AX,V_TOS_DATA_SEL
;MOV DS,AX
;MOV BYTE PTR DS:[NEED_RESCHED],1 ;start schedule
;process
RET
SETUP_CMD ENDP
;test
;MOV AX,G_VRAM_SEL
;MOV ES,AX
;MOV ECX,0FFFFFFH
;SCHED_1:
;MOV ES:[500],4141H ;AAAAAAAAAAAAAAAAA
;DEC ECX
;CMP ECX,0
;JNZ SCHED_1
;test
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -