본문 바로가기
코스웨어/13년 스마트컨트롤러

STST, LDST context switching 프로그램 만들기

by 알 수 없는 사용자 2013. 9. 24.
728x90
반응형

 

 

STST(Store Status), LDST(Load Status) 프로시저를 C소스에서 호출하여

CPU(레지스터값)->Memory    ,  Memory->CPU(레지스터값)  값 넣는

context switching  프로그램 만들기   

 

 

 

 C Source

 

#include <stdio.h>

 

typedef struct _context
{


 int efl;
 int eip;
 int edi;
 int esi;
 int ebp;
 int esp; 
 int ebx;
 int edx;
 int ecx;
 int eax;

}context ;

 

void Printf_REG(context *);
void STST(context *);
void LDST(context *);

 

int main()

{

 context stReg = {0,};

 Printf_REG(&stReg);


 STST(&stReg);
 //레지스터 값들을 구조체 변수(메모리)에 저장

 

 Printf_REG(&stReg);

 

 getchar();

 

 LDST(&stReg);
// 구조체 변수(메모리)에 저장되어있는 old 레지스터 값들을 다시 레지스터에 넣음

// STST의 리턴 어드레스를 넣고 모든 상황을 맞춰줌으로써 STST가 리턴될때의

// 상황이 반복됨 

 

 printf("Kernel panic\n");
 //LDST() 가 정상적으로 수행되었다면 이 코드는 수행되지 않음


 return 0;

}

 

void Printf_REG(context *stpReg)

{

 printf("___________________________________________________\n\n");
 printf(" EAX : 0x%08X  ECX : 0x%08X \n", stpReg->eax, stpReg->ecx);
 printf(" EDX : 0x%08X  EBX : 0x%08X \n", stpReg->edx, stpReg->ebx);
 printf(" ESP : 0x%08X  EBP : 0x%08X \n", stpReg->esp, stpReg->ebp);
 printf(" ESI : 0x%08X  EDI : 0x%08X \n", stpReg->esi, stpReg->edi);
 printf(" EIP : 0x%08X  EFL : 0x%08X \n", stpReg->eip, stpReg->efl);
 printf("___________________________________________________\n\n");

}

 

 

 

 

 STST 프로시저와 LDST 프로시저 (PUSHAD, POPAD 이용)

.386
.MODEL FLAT

 

PUBLIC _STST ;store status
PUBLIC _LDST ;load status

 

.CODE

;cpu->mem
_STST     PROC      NEAR32

 

  PUSH      EBP
  MOV       EBP, ESP

  PUSHFD                                    ; EFL 임시저장  
  
  MOV       EAX, [EBP-4]              ;EFL이 변형되기 때문에 
  AND        EAX, 0FFFFFEFFH        ;TF(Trap Flag) 제거
  MOV       [EBP-4], EAX
  

  MOV       ESP, [EBP+8]              ; ESP를 _EAX 위치로 이동
  ADD        ESP, 40


  PUSHAD                                    ;레지스터 값 push
  PUSH      [EBP+4]                      ;EIP(return address)
  PUSH      [EBP-4]                      ;push EFL

  
  ADD        ESP,  24                      ; _ESP  위치로 가서

  MOV       EAX, EBP
  ADD        EAX, 8                        ; EBP로 부터 ESP를 찾아서  
  PUSH      EAX                            ; old ESP-4 push

  

  PUSH      [EBP]                        ; old EBP push

 

   
  MOV       ESP, EBP                   ; Exit code
  POP        EBP
  RET

_STST   ENDP

 

 

 

; mem - > cpu
_LDST     PROC     NEAR32

  

  MOV       ESP, [ESP+4]           ;ESP=&context  ( ESP를 context 위치로)

  POPFD                                   ;EFL = context.EFL  

 

  POP        EAX                        ;EAX= OLD EIP  ( old EIP를 EAX에 임시저장)

 

  MOV        EBX, ESP                ;EBX= current ESP ( 현재 스택포인터를 EBX에 임시저장)
  MOV        ESP, [ESP+12]        ;ESP = OLD ESP  ( ESP를 OLD ESP-4위치로 이동)
  PUSH       EAX          ;Save OLD EIP  ( 백업해둔 EIP를 OLD ESP-8 위치(return address)에 넣음)

  

  MOV        ESP, EBX               ;ESP = current ESP   

 

  POPAD                                  ;메모리에서 레지스터들로 값 가져옴

 

 

  MOV       ESP, [ESP-20]          ;ESP= OLD ESP (ESP 이동시킴)
  SUB        ESP, 4                  

  

  RET
_LDST  ENDP

END

 

 

 

 

 LDST

 _LDST     PROC     NEAR32

  

  MOV       ESP, [ESP+4]           ;ESP=&context  ( ESP를 context 위치로)

  POPFD                                   ;EFL = context.EFL  

 

  POP        EAX                        ;EAX= OLD EIP  ( old EIP를 EAX에 임시저장)

 

  MOV        EBX, ESP                ;EBX= current ESP ( 현재 스택포인터를 EBX에 임시저장)
  MOV        ESP, [ESP+12]        ;ESP = OLD ESP  ( ESP를 OLD ESP-4위치로 이동)
  PUSH       EAX          ;Save OLD EIP  ( 백업해둔 EIP를 OLD ESP-8 위치(return address)에 넣음)

  

  MOV        ESP, EBX               ;ESP = current ESP   

 

  POP EDI                                ;메모리에서 레지스터들로 값 가져옴
  POP ESI
  POP EBP

  ADD ESP, 4                            ; ESP는 일단 건너 뜀
  
  POP EBX
  POP EDX
  POP ECX
  POP EAX

 

  MOV       ESP, [ESP-20]          ;ESP= OLD ESP (ESP 이동시킴)
  SUB        ESP, 4                  

  

  RET
_LDST  ENDP

END

 

 

☞ 실행결과

 

            kernel panic은 뜨지 않고 무한루프 걸림 

 

 

728x90