⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprocess.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 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 + -