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

📄 tos_usep.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
字号:
GINT0EH     PROC FAR
            pop eax ;important  error code
            PUSH EAX
            PUSH FS
            PUSH DI
            MOV AX,G_PT0_SEL           ;       ;初始化页表0
            MOV FS,AX
                           ;PAGE 2  IN PAGE TABLE 1: invalid
            MOV EAX,402000H    ;8K FROM 4M BEGIN
            OR  EAX,3     ;   ;设置页表0的其它所有表项为为用户页
            MOV DI,1008H
            MOV DWORD PTR FS:[DI],EAX

GINT0EH_END:
            POP DI
            POP FS
            POP EAX
            IRETD   ;iret-->error
GINT0EH     ENDP

;***********PAGE
V_SEL_SETUP PROC FAR
            ;setup v_tos_data_sel
            XOR EDX,EDX
            MOV EBX,0C0423000H         ;TOS_CODE VIRTUAL BASE ADDR
            mov dx,TOS_CODELEN
            and dx,0FFFH
            cmp dx,0
            JE  V_SEL1
            ADD EBX,1000H
V_SEL1:
            mov dx,TOS_CODELEN
            and dx,0F000H
            ADD EBX,EDX                ;EBX=TOS_STACK VIRTUAL BASE ADDR

            MOV AX,GDT_ASDATA_SEL     ;SETUP V_TOS_STACK_SEL
            MOV DS,AX
            MOV ECX,EBX
            MOV DS:V_TOS_STACK.BASE_L,CX
            SHR ECX,16
            MOV DS:V_TOS_STACK.BASE_M,CL
            MOV DS:V_TOS_STACK.BASE_H,CH 

            mov dx,TOS_STACKLEN
            and dx,0FFFH
            cmp dx,0
            JE  V_SEL2
            ADD EBX,1000H
V_SEL2:
            mov dx,TOS_STACKLEN
            and dx,0F000H
            ADD EBX,EDX   ;EBX=TOS_DATA ADDR

            MOV AX,GDT_ASDATA_SEL      ;SETUP V_TOS_DATA_SEL
            MOV DS,AX
            MOV ECX,EBX
            MOV DS:V_TOS_DATA.BASE_L,CX
            SHR ECX,16
            MOV DS:V_TOS_DATA.BASE_M,CL
            MOV DS:V_TOS_DATA.BASE_H,CH 
;
            mov dx,DATA_TOSLEN
            and dx,0FFFH
            cmp dx,0
            JE  V_SEL3
            ADD EBX,1000H
V_SEL3:
            mov dx,DATA_TOSLEN
            and dx,0F000H
            ADD EBX,EDX   ;EBX=USER_PSTSSSEG ADDR

            MOV AX,GDT_ASDATA_SEL      ;SETUP V_USER_PSTSS_SEL
            MOV DS,AX
            MOV ECX,EBX
            MOV DS:V_USER_PSTSS.BASE_L,CX
            SHR ECX,16
            MOV DS:V_USER_PSTSS.BASE_M,CL
            MOV DS:V_USER_PSTSS.BASE_H,CH 
            MOV ECX,EBX                   ;SETUP USER_PSTSS_D
            MOV DS:USER_PSTSS_D.BASE_L,CX
            SHR ECX,16
            MOV DS:USER_PSTSS_D.BASE_M,CL
            MOV DS:USER_PSTSS_D.BASE_H,CH 

            ADD EBX,1000H         ;EBX=USER_PSLDTSEG
            MOV AX,GDT_ASDATA_SEL      ;SETUP V_USER_PSLDT_SEL
            MOV DS,AX
            MOV ECX,EBX
            MOV DS:V_USER_PSLDTT.BASE_L,CX
            SHR ECX,16
            MOV DS:V_USER_PSLDTT.BASE_M,CL
            MOV DS:V_USER_PSLDTT.BASE_H,CH 

            ;MOV AX,USER_PSLDT_MOV_SEL      ;SETUP USER_PSLDT_SEL IN LDT
            ;MOV DS,AX
            ;MOV ECX,EBX
            ;MOV DS:USER_PSLDT_MOV.BASE_L,CX
            ;SHR ECX,16
            ;MOV DS:USER_PSLDT_MOV.BASE_M,CL
            ;MOV DS:USER_PSLDT_MOV.BASE_H,CH 

            MOV ECX,EBX                  ;SETUP USER_PSLDT_ASDATA_SEL
            MOV DS:USER_PSLDTT_ASDATA.BASE_L,CX
            SHR ECX,16
            MOV DS:USER_PSLDTT_ASDATA.BASE_M,CL
            MOV DS:USER_PSLDTT_ASDATA.BASE_H,CH 
;

            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            RET
V_SEL_SETUP ENDP

SEGS_MOV_2M PROC FAR   ;mov to 2M  
            ;mov tos segs--->2M  use ds,es
            XOR ESI,ESI
            XOR EDI,EDI
            G_MOV IDT_SEL,G_MOV_SEL,0,0,IDTLEN  ;     4K
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:IDT_M.PH_ADDR,200000H    ;IDT: 2M
            MOV DS:IDT_M.LO_ADDR,0C0400000H    ;IDT: 3G+4M

            G_MOV TOS_TSSASDATA_SEL,G_MOV_SEL,0,1000H,TOS_TSSLEN ;4K
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:TOS_TSS_M.PH_ADDR,201000H    ;TOS_TSS:2M+4k
            MOV DS:TOS_TSS_M.LO_ADDR,0C0401000H 

            G_MOV GDT_ASDATA_SEL,G_MOV_SEL,0,2000H,GDTSEGLEN     ;16*4K
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:GDT_M.PH_ADDR,202000H    ;
            MOV DS:GDT_M.LO_ADDR,0C0402000H    ;
           
            MOV DS:GPDT_M.PH_ADDR,212000H    ;4K
            MOV DS:GPDT_M.LO_ADDR,0C0412000H    ;4K
            MOV DS:GPT0_M.PH_ADDR,213000H    ;4K*16 16PAGES
            MOV DS:GPT0_M.LO_ADDR,0C0413000H    ;4K*16 16PAGES

            G_MOV TOS_CODE_SEL,G_MOV_SEL,0,23000H,TOS_CODELEN
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:TOS_CODE_M.PH_ADDR,223000H    ;
            MOV DS:TOS_CODE_M.LO_ADDR,0C0423000H    ;

            XOR EDX,EDX
            MOV EBX,0
            mov dx,TOS_CODELEN
            and dx,0FFFH
            cmp dx,0
            JE g_mov_1
            ADD EBX,1000H
g_mov_1:
            mov dx,TOS_CODELEN
            and dx,0F000H
            ADD EBX,EDX
            ADD EBX,23000H         ;EBX PHISICAL OFFSET
            G_MOV TOS_STACK_SEL,G_MOV_SEL,0,EBX,TOS_STACKLEN 
            ADD EBX,200000H
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:TOS_STACK_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX
            ADD EBX,0C0200000H
            MOV DS:TOS_STACK_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX
            SUB EBX,0C0400000H
;
            XOR EDX,EDX
            mov dx,TOS_STACKLEN
            and dx,0FFFH
            cmp dx,0
            JE g_mov_2
            ADD EBX,1000H
g_mov_2:
            mov dx,TOS_STACKLEN
            and dx,0F000H
            ADD EBX,EDX
            G_MOV TOS_DATA_SEL,G_MOV_SEL,0,EBX,DATA_TOSLEN
            ADD EBX,200000H
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:DATA_TOS_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX
            ADD EBX,0C0200000H
            MOV DS:DATA_TOS_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX
            SUB EBX,0C0400000H

;
            XOR EDX,EDX
            mov dx,DATA_TOSLEN
            and dx,0FFFH
            cmp dx,0
            JE g_mov_3
            add EBX,1000H
g_mov_3:
            mov dx,DATA_TOSLEN
            and dx,0F000H
            ADD EBX,EDX
            G_MOV USER_PSTSS_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSTSSLEN
            ADD EBX,200000H
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:USER_PSTSS_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX
            ADD EBX,0C0200000H
            MOV DS:USER_PSTSS_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX
            SUB EBX,0C0400000H
;
            ADD EBX,01000H
            G_MOV USER_PSLDT_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSLDTLEN
            ADD EBX,200000H
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:USER_PSLDT_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX
            ADD EBX,0C0200000H
            MOV DS:USER_PSLDT_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX
SEGS_MOV_2M0:
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV AX,G_VRAM_SEL
            MOV ES,AX
            RET
SEGS_MOV_2M ENDP
;///////////
PGT_INIT    PROC FAR
            ; USE ES
            ; page DICTIONRY
            MOV AX,G_PDT_SEL           ;       ;初始化页目录表
            MOV ES,AX
            XOR DI,DI
            MOV CX,1024              ;  ;把其它所有项清空,置无效
            XOR EAX,EAX
            REP STOSD
            MOV EAX,G_PT0_ADDR OR 3     
            MOV DWORD PTR ES:[0],EAX    ;0PAGE FOR TOS_CODE
            ADD EAX,1000H               
            MOV DWORD PTR ES:[4],EAX    ;1PAGE FOR G_BUF
            ADD EAX,1000H               
            MOV DWORD PTR ES:[3072],EAX ;768PAGE(3G) FOR VRAM   
            ADD EAX,1000H               
            MOV DWORD PTR ES:[3076],EAX ;769PAGE FOR TOS SYSTEM
            ; ;设置页目录表中页表0的表项为用户页
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1)

                            ;PAGE0 AND PAGE1
            MOV AX,G_PT0_SEL           ;       ;初始化页表0
            MOV ES,AX
            XOR DI,DI
            MOV CX,2048
            XOR EAX,EAX
            OR EAX,3     ;   ;设置页表0的其它所有表项为为用户页
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1)
PGT_INIT0:
            STOSD
            ADD EAX,1000H  ;PH_ADDR=LO_ADDR
            LOOP PGT_INIT0

            MOV CX,1024
            MOV EAX,0B8000H  ;PAGE768 
            OR EAX,3     ;   ;设置页表0的其它所有表项为为用户页
PGT_INIT768:    ;3G
            STOSD
            ADD EAX,1000H  
            LOOP PGT_INIT768

            MOV ECX,DS:USER_PSLDT_M.PH_ADDR
            SUB ECX,200000H
            SHR ECX,12
            ADD CX,16
            MOV EAX,200000H  ;PAGE769  2M
            OR EAX,3     ;   ;设置页表0的其它所有表项为为用户页
PGT_INIT769:    
            STOSD
            ADD EAX,1000H  
            LOOP PGT_INIT769

                           ;PAGE 2  IN PAGE TABLE 1: invalid
            MOV EAX,402000H    ;8K FROM 4M BEGIN
            OR EAX,2     ;   ;设置页表0的其它所有表项为为用户页
            MOV DI,1008H
            STOSD

PGT_INIT_END:
            MOV AX,G_VRAM_SEL
            MOV ES,AX
            RET
PGT_INIT    ENDP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -