memory.asm
字号:
shl ecx,12 ;get linear address.
sub ecx,LinearBase
mov dx,cx
shr ecx,16
mov bx,VMMHandle
mov ax,4200h
mov edi,offset PageInt
mov RealRegsStruc.Real_EBX[edi],ebx
mov RealRegsStruc.Real_EAX[edi],eax
mov RealRegsStruc.Real_EDX[edi],edx
mov RealRegsStruc.Real_ECX[edi],ecx
mov RealRegsStruc.Real_SS[edi],0
mov RealRegsStruc.Real_SP[edi],0
mov bl,21h
push es
push ds
pop es
call EMURawSimulateInt ;move to right place.
mov edi,offset PageInt
mov ax,VMMHandle
mov RealRegsStruc.Real_EBX[edi],eax
mov ax,PageBufferReal
mov RealRegsStruc.Real_DS[edi],ax
mov RealRegsStruc.Real_EAX[edi],3f00h
mov RealRegsStruc.Real_EDX[edi],0
mov RealRegsStruc.Real_ECX[edi],4096
mov RealRegsStruc.Real_SS[edi],0
mov RealRegsStruc.Real_SP[edi],0
mov bl,21h
call EMURawSimulateInt ;read it from disk.
pop es
test RealRegsStruc.Real_Flags[edi],1
jz mem11_ok
mov esi,BreakAddress
pop eax
mov es:[esi],al
jmp mem11_Finished2
;
mem11_ok: mov esi,BreakAddress
pop eax
mov es:[esi],al
;
mov esi,PageBufferLinear
mov edi,LinearEntry
shl edi,12 ;get linear address again.
mov ecx,4096/4
push ds
push es
pop ds
cld
rep movsd ;copy back into place.
pop ds
;
mov eax,LinearEntry ;get new entry number.
mov esi,1024*4096*1023 ;base of page alias's.
and DWORD PTR es:[esi+eax*4],0FFFFFFFFh-(3 shl 5) ;clear accesed & dirty bits.
call EMUCR3Flush
;
mem11_NoRead: inc LinearEntry ;update counter.
;
mem11_Finished: clc
;
mem11_Finished2:
pop es
pop ds
popad
ret
assume ds:_cwDPMIEMU
MapPhysical endp
;-------------------------------------------------------------------------------
;
;Retrieve the address of the most un-needed physical memory and mark its current page table entry
;as not present after writing to disk if needed.
;
;On Entry:-
;
;On Exit:-
;
;EDX - Physical address of page.
;CL - User flags.
;
UnMapPhysical proc near
push eax
push ebx
push esi
push edi
push ebp
push ds
push es
push fs
;
mov ax,KernalDS
mov ds,ax
mov es,ax
assume ds:_cwRaw
mov ax,KernalZero
mov fs,ax
;
mov ProposedPresentFlag,0
mov ProposedRecentFlag,0
mov CompareCount,0
;
mov esi,PageDirLinear
mov edi,1024*4096*1023 ;base of page alias's.
mov ebp,1024*4096*1022
mov ecx,PageingPointer ;get current position.
mov ebx,LinearLimit ;maximum size of scan we can do.
sub ebx,LinearBase
shr ebx,12
inc ebx
cld
;
mem12_ScanLoop: dec ebx
jnz mem12_80 ;shit, we've been all the way round.
;
cmp ProposedPresentFlag,0
jnz mem12_UseProposed
jmp mem12_8
;
mem12_80: cmp ecx,LinearBase
jnc mem12_80_0
mov ecx,LinearBase
sub ecx,4096
mem12_80_0: add ecx,4096
cmp ecx,LinearLimit ;End of memory map yet?
jc mem12_NoWrap
mov ecx,LinearBase
;
mem12_NoWrap: mov eax,ecx
shr eax,12 ;get page number.
test DWORD PTR fs:[edi+eax*4],1 ;this page present?
jz mem12_ScanLoop
test DWORD PTR fs:[ebp+eax*4],MEM_LOCK_MASK shl MEM_LOCK_SHIFT
jnz mem12_ScanLoop
;
inc CompareCount
;
;Check against recent stack.
;
push ecx
push edi
mov eax,ecx
mov edi,offset RecentMapStack
mov ecx,PageStackSize
repnz scasd
pop edi
pop ecx
jz mem12_IsRecent
shr eax,12 ;get page number again.
test DWORD PTR fs:[edi+eax*4],1 shl 6
jz mem12_GotPage
;
cmp ProposedPresentFlag,0
jz mem12_SetProposed
cmp ProposedRecentFlag,0
jz mem12_UseProposed?
mem12_SetProposed: mov ProposedPresentFlag,-1
mov ProposedPage,ecx
mov CompareCount,0
mov ProposedRecentFlag,0
jmp mem12_ScanLoop
;
mem12_UseProposed?: mov eax,NoneLockedPages
shr eax,2
cmp eax,4096
jc mem12_UP0
mov eax,4096
mem12_UP0: cmp CompareCount,eax
jc mem12_UseProposed
jmp mem12_ScanLoop
;
mem12_IsRecent: cmp ProposedPresentFlag,0
jnz mem12_ProposedRecent?
mov ProposedPresentFlag,-1
mov ProposedPage,ecx
mov ProposedRecentFlag,-1
mov CompareCount,0
jmp mem12_ScanLoop
;
mem12_ProposedRecent?:
cmp ProposedRecentFlag,0
jnz mem12_LookedEnough?
mov eax,NoneLockedPages
shr eax,2
cmp eax,4096
jc mem12_PR0
mov eax,4096
mem12_PR0: cmp CompareCount,eax
jnc mem12_UseProposed
jmp mem12_ScanLoop
;
mem12_LookedEnough?:
mov eax,NoneLockedPages
cmp CompareCount,eax
jnc mem12_UseProposed
jmp mem12_ScanLoop
;
mem12_UseProposed: mov ecx,ProposedPage
;
mem12_GotPage: mov PageingPointer,ecx
;
mov eax,ecx
shr eax,12 ;get page number again.
shl eax,2
add edi,eax
;
;Check if it needs to go to the swap file.
;
test DWORD PTR fs:[edi],1 shl 6 ;is it dirty?
jz mem12_5 ;no need to write it if not.
;
;Flush this page to disk.
;
push edi
mov esi,BreakAddress
mov al,fs:[esi]
mov BYTE PTR fs:[esi],0
push eax
;
sub edi,1024*4096*1023 ;get page table entry number.
shr edi,2 ;page number.
shl edi,12 ;get linear address.
push edi
mov esi,edi
push ds
push es
mov edi,PageBufferLinear ;copy it to somewhere we can deal with it.
mov ax,KernalZero
mov ds,ax
mov es,ax
mov ecx,4096/4
rep movsd
pop ds
pop es
pop edi
;
sub edi,LinearBase
mov ebp,edi
mov dx,di
shr edi,16
mov cx,di
mov ax,4200h
mov bx,VMMHandle
mov edi,offset PageInt
mov RealRegsStruc.Real_EBX[edi],ebx
mov RealRegsStruc.Real_EAX[edi],eax
mov RealRegsStruc.Real_EDX[edi],edx
mov RealRegsStruc.Real_ECX[edi],ecx
mov RealRegsStruc.Real_SS[edi],0
mov RealRegsStruc.Real_SP[edi],0
mov bl,21h
push ds
pop es
call EMURawSimulateInt ;move to right place.
;
test RealRegsStruc.Real_Flags[edi],1
stc
jnz mem12_error_anyway
mov edx,RealRegsStruc.Real_EDX[edi]
mov eax,RealRegsStruc.Real_EAX[edi]
shl edx,16
mov dx,ax
cmp edx,ebp
jnz mem12_force_error
;
mov edi,offset PageInt
mov ax,VMMHandle
mov RealRegsStruc.Real_EBX[edi],eax
mov ax,PageBufferReal
mov RealRegsStruc.Real_DS[edi],ax
mov RealRegsStruc.Real_EAX[edi],4000h
mov RealRegsStruc.Real_EDX[edi],0
mov RealRegsStruc.Real_ECX[edi],4096
mov RealRegsStruc.Real_SS[edi],0
mov RealRegsStruc.Real_SP[edi],0
mov bl,21h
call EMURawSimulateInt ;write it to disk.
test RealRegsStruc.Real_Flags[edi],1
stc
jnz mem12_error_anyway
mov eax,RealRegsStruc.Real_EAX[edi]
cmp ax,4096
jz mem12_error_anyway
mem12_force_error: stc
mem12_error_anyway: ;
mov esi,BreakAddress
pop eax
mov fs:[esi],al
;
pop edi
jc mem12_8
or DWORD PTR fs:[edi],1 shl 11 ;signal it living on disk.
;
mem12_5: ;Now remove it from the page table and exit.
;
and DWORD PTR fs:[edi],0FFFFFFFFh-1 ;mark as not present.
mov edx,fs:[edi] ;get page entry.
mov ecx,edx
and edx,0FFFFFFFFh-4095 ;lose flag bits.
shr ecx,10
and ecx,1 ;preserve user flags.
call EMUCR3Flush
;
;Update number of un-locked physical pages present.
;
dec NoneLockedPages
;
clc
jmp mem12_9
;
mem12_8: stc ;failed to find free page.
;
mem12_9:
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop ebx
pop eax
ret
assume ds:_cwDPMIEMU
UnMapPhysical endp
;-------------------------------------------------------------------------------
;
;Lock page indicated.
;
;On Entry:-
;
;EAX - Linear address to lock.
;
RawLockPage proc near
push eax
push ebx
push esi
push es
shr eax,12 ;get page number.
mov bx,KernalZero
mov es,bx
mov esi,1024*4096*1022 ;base of page DET's.
mov ebx,es:[esi+eax*4]
shr ebx,MEM_LOCK_SHIFT
and ebx,MEM_LOCK_MASK
jnz mem13_WasLocked
;
;Update number of un-locked physical pages present.
;
push ax
push ds
mov ax,KernalDS
mov ds,ax
assume ds:_cwRaw
dec NoneLockedPages
assume ds:_cwDPMIEMU
pop ds
pop ax
;
mem13_WasLocked: cmp ebx,MEM_LOCK_MASK
jz mem13_0
add DWORD PTR es:[esi+eax*4],1 shl MEM_LOCK_SHIFT ;lock it.
mem13_0:
pop es
pop esi
pop ebx
pop eax
ret
RawLockPage endp
;-------------------------------------------------------------------------------
RawClearPageLock proc near
push eax
push ebx
push ecx
push esi
push es
mov bx,KernalZero
mov es,bx
shr eax,12
mov esi,1024*4096*1022 ;base of page alias's.
mov ebx,MEM_LOCK_MASK shl MEM_LOCK_SHIFT
xor ebx,-1
and DWORD PTR es:[esi+eax*4],ebx ;un-lock it.
pop es
pop esi
pop ecx
pop ebx
pop eax
ret
RawClearPageLock endp
;-------------------------------------------------------------------------------
;
;Un-lock a linear page.
;
;On Entry:-
;
;EAX - Linear address of page to unlock.
;
RawUnLockPage proc near
call RawPageLocked
jz mem15_9
push eax
push ebx
push esi
push es
mov bx,KernalZero
mov es,bx
shr eax,12
mov esi,1024*4096*1022 ;base of page alias's.
sub DWORD PTR es:[esi+eax*4],1 shl MEM_LOCK_SHIFT ;un-lock it.
mov eax,DWORD PTR es:[esi+eax*4]
shr eax,MEM_LOCK_SHIFT
and eax,MEM_LOCK_MASK
jnz mem15_NotUnLocked
;
;Update number of un-locked physical pages present.
;
push ds
mov ax,KernalDS
mov ds,ax
assume ds:_cwRaw
inc NoneLockedPages
assume ds:_cwDPMIEMU
pop ds
;
mem15_NotUnLocked:
pop es
pop esi
pop ebx
pop eax
mem15_9: ret
RawUnLockPage endp
;-------------------------------------------------------------------------------
;
;Check if page lock count is zero.
;
;On E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -