Busan IT/로봇제어2015. 10. 30. 16:25

==================================Outline====================================

BCM 라이브러리

PWM LED Dimming

----------------------------------------------------------------------------

 

p/441

 

BCM 라이브러리

 

주소를 가상화 시키는 이유는 메모리를 효율적으로 사용하기 위해서이다.

‘[그림 16-18] BCM 2835의 버스 주소와 물리 주소의 대응관계에서 MMU가 버스의 주소를 가상화시키는 것을 알 수 있다.

 

핀의 기능이 한 가지 이상인 경우는 핀에 여러 가지 신호가 물려 있고 사용자의 조작에 따라 스위치가 동작하여 원하는 기능을 사용할 수 있다.

 

//‘SPI’는 시리얼로 분류된다.

 

 

우선 BCM라이브러리를 다운로드 받는다. Pi2bcm2836이 가능한 파일을 설치한다.

 

 

기존의 라이브러리 제공 사이트에서 제공하는 최신버전인 1.39버전부터는 bcm2836을 지원한다.

 

아래 링크를 통해서 설치 할 수 있다.

 

http://www.airspayce.com/mikem/bcm2835/bcm2835-1.39.tar.gz

 

ssh를 통해서 터미널로 접근 및 설치 해보도록 한다.

 

설치 절차는 다음과 같다.

 

1. wget을 사용하여 라이브러리 다운로드

 

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.39.tar.gz


2. 다운받은 파일 압축해제

 

tar xvzf bcm-2835-1.39.tar.gz

3. 압축 해제한 폴더로 이동 후 설정을 적용한다.

 

cd bcm2835-1.39/

./configure

4. 설정이 올바르게 적용 되었는지 확인한다.

make check

 

 

5. 설치한다.

make install

 

 

라즈베리파이2의 경우는 라이브러리를 사용하기 위해 디바이스 트리를 활성화시켜야 한다.





다음 'reboot'명령어를 사용하여 재부팅한다.

 

PWM LED Dimming

 

교재 p/449에 있는 [PWM제어 예제]를 사용하여 PWM 코딩을 한다.

/*** 소스 ***/

[PWM_test.c]


 #include <bcm2835.h>
 #include <stdio.h>

 #define PIN 18
 #define PWM_CHANNEL 0
 #define RANGE       1024

 int main(int argc, char **argv)
 {
     int direction = 1;
     int data = 1;
     if ( 0 == bcm2835_init() )
         return 1;

     bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
     bcm2835_gpio_write(PIN, LOW);
     bcm2835_delay(1000);

     bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_ALT5);

     bcm2835_pwm_set_clock(BCM2835_PWM_CLOCK_DIVIDER_2);

     bcm2835_pwm_set_mode(PWM_CHANNEL, 11);

     bcm2835_pwm_set_range(0, RANGE);

     while(1)
     {
         if(data == 1)
             direction = 1;
         else if(data == RANGE-1)
             direction = -1;

         data += direction;

         bcm2835_pwm_set_data(PWM_CHANNEL, data);
         bcm2835_delay(20);
     }
     bcm2835_close();
     return 0;
 }



반응형
Posted by newind2000
Busan IT/Assembly2015. 10. 29. 17:35

==================================Outline====================================

String Operation

----------------------------------------------------------------------------

 

String Operation

 

교재 p/232

 

문자열과 관련된 명령어는 5개가 있다.

 

movs(move string)

cmps(compare string)

scas(scan string)

stos(store string)

lods(load string)

 

1byte 단위로 명령어를 내릴 때는 뒤에 첨자 'b'가 붙고, 2byte‘w', 4byte’d'가 붙는다.

 

어셈블리에서의 string은 문자열이 아닌 배열을 뜻한다.

문자열을 사용할 때는 레지스터 'ESI'와 'EDI'가 사용된다.

 

ESI = Extended Source Index

EDI = Extended Destination Index

 

'movs'명령어는 메모리에서 메모리로 데이터를 복사함으로 4사이클이 소모된다.

  

 

 

'movs' 명령어는 한 번에 한 단위 원소만을 조작시키고 명령어가 수행되고 나면 'esi'‘edi'는 조작 단위만큼 이동하게 되는데 이 때 ’EFL‘레지스에 ’DF‘ 플래그가 0일 때는 주소 값이 증가하고 1일 때는 주소 값이 감소하게 되는데 'DF'플래그의 값은 'cld', 'std'명령어로 조작할 수 있다.

문자열을 복사하는 함수를 만들어보자.

 

//함수를 사용하고 나서는 사용하기전의 레지스터 상태로 원상복구 시켜 주어야 한다.

 

교재 p/234


[strcpy.asm]

.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
INCLUDE io.h
cr  equ   0dh
Lf  equ   0ah

.STACK 4096

.DATA
prompt    BYTE  cr, Lf, "Original string? ",0
stringIn  BYTE  80 DUP (?)
display    BYTE  cr, Lf, "Your string was...", cr, Lf
stringOut  BYTE  80 DUP  (?)

.CODE
_start:  output   prompt
  input  stringIn,   80
  lea  eax,    stringOut
  push  eax
  lea  eax, stringIn
  push  eax
  call   strcopy
  output  display
  INVOKE  ExitProcess,  0

PUBLIC  _start

strcopy    PROC NEAR32

  push  ebp
  mov  ebp, esp

  push edi
  push esi
  pushf

  mov  esi, [ebp+8]
  mov  edi, [ebp+12]
  cld

whileNoNull:
  cmp  BYTE PTR [esi],  0
  je  endWhileNoNull
  movsb
  jmp  whileNoNull

endWhileNoNull:
  mov BYTE PTR [edi], 0

  popf
  pop  esi
  pop  edi
  pop  ebp
  ret  8

strcopy  ENDP

  END

 

 


반응형
Posted by newind2000
Busan IT/Assembly2015. 10. 29. 09:43

==================================Outline====================================

task switching

----------------------------------------------------------------------------

지금까지 코딩한 내용을 다시 한번 훑어보자.

 

컴퓨터를 구동하기 위한 OS가 존재하고 그 OS안에서 동작하는 OS프로그램을 만든다.

 

//code 영역은 오직 읽기만 가능한 영역이다.

 

여러 가지 프로그램을 수행할 때 메모리가 모자라게 되면 하드드라이브를 사용하게 된다. 이 때 메모리에 멤버를 하나 더 선언하여 하드드라이브의 주소를 저장해주면 된다.

 



task switching.zip

 

 

반응형

'Busan IT > Assembly' 카테고리의 다른 글

Repeat Prefixes and More String Instructions  (0) 2015.11.02
String Operation  (0) 2015.10.29
메모리 출력 함수 'memory_display' 프로그램 실행 함수, ‘program_execute'  (0) 2015.10.24
LOAD함수 구현  (0) 2015.10.23
PE구조체  (0) 2015.10.22
Posted by newind2000
Busan IT/로봇제어2015. 10. 28. 15:56

==================================Outline====================================

푸쉬 버튼을 이용한 LED 제어

----------------------------------------------------------------------------

 

p/275 푸쉬 버튼을 이용한 LED 제어

 


 

 

WiringPi를 설치한 후 ‘gpio readall'를 입력한다.

 

LED를 토글 시키는 코드를 만들고 상태를 표시 시켜보자.

 

//스위치가 없기 때문에 점프 선을 이용하자.

 




계속 깜빡거린다.

 

꺼진 상태에서 input pinLOW를 연결하면 토글이 되지 않고 LED가 꺼진 상태를 유지하게 된다.



 

반응형
Posted by newind2000
Busan IT/로봇제어2015. 10. 26. 16:16

==================================Outline====================================

플라스크 기반의 GPIO 포트 제어

스마트홈

----------------------------------------------------------------------------

 

플라스크 기반의 GPIO 포트 제어

교재 p/211

 

웹의 링크를 통해 GPIO를 제어 하는 코딩을 해보자.

 

[leds.py]


 from flask import Flask, render_template, request
 import RPi.GPIO as GPIO

 app = Flask(__name__)

 GPIO.setmode(GPIO.BCM)

 leds = {
 23 : {'name' : 'RED LED''state' : GPIO.LOW},
 24 : {'name' : 'GREEN LED''state' : GPIO.LOW},
 25 : {'name' : 'BLUE LED''state' : GPIO.LOW},
 }

 for led in leds:
     GPIO.setup(led, GPIO.OUT)
     GPIO.output(led, GPIO.OUT)

 def getGpioState():
     for led in leds:
         leds[led]['state']=GPIO.input(led)

     return leds

 @app.route("/")
 def main():
     gpioState = {
         'leds' : getGpioState()
     }

     return render_template('main.html', **gpioState)

 @app.route("/<led>/<act>")
 def action(led, act):
     led = int(led)
     leds = getGpioState()
     dev = leds[led]['name']
     if act == "on":
         GPIO.output(led, GPIO.HIGH)
         msg = "Turned " + dev + " on. "
     elif act == "off":
         GPIO.output(led, GPIO.LOW)
         msg = "Turned " + dev + " off. "
     elif act == "toggle":
         GPIO.output(led, not GPIO.input(led))
         msg = "Toggled " + dev + "."
     else:
         msg = "Undefined action!"

     gpioState = {
         'msg' : msg,
         'leds' : getGpioState()
     }

     return render_template('main.html', **gpioState)

 if __name__ == "__main__":
     app.run(host='192.168.0.173', port=8888, debug=True)



                                                                            

 

[main.html]

 

 <html>
 <head>
     <title>RGB LED Status</title>
 </head>

 <body>
     <h1>RGB Led Status</h1>

     {% for led in leds %}
     <p>
     {{ leds[led].name }}
     {% if leds[led].state == true %}
         is currently on (<a href="/{{led}}/off">turn off</a>)
     {% else %}
         is currently off (<a href="/{{led}}/on">turn on</a>)
     {% endif %}
     </p>
     {% endfor %}

     {% if msg %}
     <h2>{{ msg }}</h2>
     {% endif %}

 </body>
 </html>

 

 

 

 

스마트홈

교재 p/221 

 

캐리어 주파수는 통신 내용을 전송하기 위해 만들어져 있는 주파수이다. 이 때 캐리어 주파수에 내용을 싣기 위한 작업을 변조라고 하고 변조된 내용을 해석하는 것을 복조라고 한다.


LonWork 



 

LonWork는 네트워크로 가전을 제어하는데 따로 랜선과 네트워크 수신 장치를 사용하지 않고 제어하는 방법을 고안해냈다.

 

 

 

반응형
Posted by newind2000
Busan IT/Assembly2015. 10. 24. 00:12

==================================Outline====================================

메모리 출력 함수 'memory_display'

프로그램 실행 함수  ‘program_execute'

----------------------------------------------------------------------------

메모리 출력 함수 'memory_display'

 

메모리를 헥사뷰로 출력하는 함수 'memory_display'를 만들어보자.

 

//'memory_modify'함수를 복사해서 필요한 부분만 수정하면 편하다.

 

사용자가 출력하고자하는 메모리의 시작 위치를 입력 받은 후 헥사뷰를 실행시켜 16씩 출력 시킨다페이지를 초과하는 경우 사용자로부터 아무키나 입력받으면 다음 페이지를 출력 시키고 q' 혹은 'Q' 입력할 시 출력을 멈춘다.

void memory_display()
{
  unsigned int uiAddr;
  unsigned int uiVal;  
  char cInput;

  
  while(1)
  {
    printf("Please input an address to display [%08X - %08X]  :  ", vpMem_start, vpMem_end);
    scanf("%x"&uiAddr);
    if('\n'==getchar());
    if(uiAddr < (unsigned int)vpMem_start || uiAddr > (unsigned int)vpMem_end)
    {
      printf("Wrong address \n");
      continue;
    }
    break;    
  }
  
  while( (uiAddr)< ( (unsigned int)vpMem_end ) )
  {
    hexaview((void *)uiAddr, 16*16);
    uiAddr = uiAddr + (16*16);
    if(uiAddr>(unsigned int)vpMem_end)
    {
      printf("Memory displayed\n");
      return;
    }
    printf("Please enter any to continue(stop for 'Q')\n");
    cInput = getch();    
    if(cInput == 'q' ||cInput == 'Q')
    {
      printf("Memory display interrupted\n");
      return;
    }    
  } 
  return; 
}

 

헥사뷰 출력 값이 ‘vpMem_end‘를 초과할 경우 해당 자리에서 헥사뷰를 멈추도록 코딩한다.

이를 위해 헥사뷰를 수정한다.

void hexaview(void * vP, unsigned int uiLen)
{
  unsigned int uiCnt;
  unsigned int uiLine;

  printf("===============================================================================\n");
  printf("  Address      Hexa           ASCII       \n"); 
  printf("-------------------------------------------------------------------------------\n");
  for (uiLine = 0; uiLine <  uiLen; uiLine += 16)
  {
    if(vP > vpMem_end)
      return;
    printf(" %08X  ", vP);
  
    for(uiCnt=0; uiCnt<16; ++uiCnt)
    {
      if(vP > vpMem_end)
      {
        while(uiCnt<16)
        {
          printf("   ");
          vP = (char *)vP + 1;
          ++uiCnt;
        }
        break;
      }
      printf("%02X ", *((unsigned char *)vP));
      vP = (char *)vP + 1;
    }
    vP = (char *)vP - 16;
    putchar(' ');

    for(uiCnt=0; uiCnt<16; ++uiCnt)
    {
      if(vP > vpMem_end)
      {
        putchar('\n');
        return;
      }
      if (32 > *((unsigned char *)vP))
      {
        putchar('.');
      }    
      else if(127 < *((unsigned char *)vP))
      {
        putchar('.');
      }
      else
      {        
        printf("%1c", *((unsigned char *)vP));
      }

      vP = (char *)vP + 1;
    }
    putchar('\n');

  }
  putchar('\n');
  return;
}


실행시킨 화면은 다음과 같다.



//코딩을 할 때 변수와 함수명의 형식에 일관성이 있어야 한다.

 

프로그램 실행 함수  ‘program_execute' 


로드함수를 사용하여 프로그램을 메모리에 적재한 후, 이것을 실행시키는 ‘program_execute'를 만들어보자사용자가 입력하는 명령어는 'GO'이다전역 변수를 만들어 주고 로드 상태에 따라 해당 변수의 값을 바꿔준다.

 

#define LOAD_ON 1

#define LOAD_OFF 0

 

unsigned int uiLoad;

 

‘program_execute'가 실행되면 로드 되어 있는 프로그램이 실행되고 난 후 다시 메뉴로 돌아가야 한다. 이를 위해 어셈블리 코드로 만든 stst‘, ’ldst‘함수를 사용한다.


레지스터 변수들을 담고 있는 ’context’를 ‘stTempState‘라는 이름으로 선언해준다이 구조체는 로드된 프로그램을 실행시키고 다시 메뉴로 돌아갈 수 있게 만들어주는 징검다리 역할을 한다.


구조체의 ‘esp’에는 ‘vpStack’, ‘eip’에는 ‘vpCode’(로드된 프로그램), ‘eax’에는 ‘stOld_state’의 주소를 담아준다.

 

세팅을 끝낸 ‘stTempState‘를 ’ldst‘의 인자로 전달한다. 'eip'가 적재된 프로그램의 코드 영역을 가리키고 있음으로 프로그램이 실행된다프로그램이 수행되고 나면 레지스터를 ’stOld_state’에 저장된 상태로 되돌려 주어야 한다‘stOldState’를 'eax'에 넣어준 것이 바로 'stOldState'가 가진 레지스터의 상태로 복구 시켜주기 위함이다.



void program_execute()
{
  context stTempState;
  if(uiLoad == LOAD_OFF)
  {
    printf("No loaded program.\nPlease load program by using 'LOAD' command.\n");
    return;
  }
  memset(&stTempState, 0sizeof(context));  
  stTempState.esp = (unsigned int)vpStack;
  stTempState.eip = (unsigned int)vpCode;    
  stTempState.eax = (unsigned int)(&stOld_state);
  
  ldst(&stTempState);
  printf("System Panic!\n");
  
  return;

} 


적재된 프로그램 실행 후 레지스터를 ‘stOldState’의 값으로 복구 시키기 위해 어셈블리로 'init'함수를 만들어준다. C에서도 호환하여 사용하기 위해 언더바(_)를 붙혀준다.


(진행중)

.386

.MODEL FLAT

.code

_start:

_INIT PROC NEAR32

  push eax  ;'&stOldState' 저장
  call _smart  
  call _t1  
  call _ldst  
  

_INIT ENDP


init.asm


smart.c



반응형

'Busan IT > Assembly' 카테고리의 다른 글

String Operation  (0) 2015.10.29
task switching  (0) 2015.10.29
LOAD함수 구현  (0) 2015.10.23
PE구조체  (0) 2015.10.22
memory_modify함수  (0) 2015.10.20
Posted by newind2000
Busan IT/로봇제어2015. 10. 23. 15:44

==================================Outline====================================

웹 프로그래밍

- GPIO를 통한 웹서비스 메시지 제어 

----------------------------------------------------------------------------

 

//PiFace는 따로 장치를 구입해서 장착해야되기 때문에 교재의 해당 부분은 넘어가도록 한다.

 

교재 p/200

 

웹 프로그래밍

 

네트워크를 사용하기 위해서는 웹 서비스를 제공하는 서버가 필요하다.

 

플라스크는 파이썬을 위한 마이크로 웹 프레임워크로 Werkzeug, Jinja2를 기반으로 하는 오픈소스 서비스이다.

 

윈도우의 경우 IIS(Internet Information Services)를 제공한다. 무료로 제공되는 서비스 중에 톰캣이 있다.

 

//Apache Tomcat - http://tomcat.apache.org/

 

HTML은 소스코드가 고정 되어 있기 때문에 유동성 있게 페이지가 변동되지 않는다. 유동성 있는 서비스를 제공하기 위해서는 ASP, JSP, PHP를 사용하여 변수 값을 바꾼 후 다시 HTML로 변환해야 한다.

 

서비스 제공자 - ASP: Microsoft

                        JSP: JAVA

                        PHP: C문법 적용

 

일반적으로 웹 서비스를 제공하기 위해서는 웹을 표현하는 htmlASP, JSP, PHP 중 택 1하여 사용하여야 한다.

 

ASPwindow운영체제를 사용해야 하지만 JSPPHP는 운영체제를 가리지 않고 사용할 수 있다.

 

GPIO를 통한 웹서비스 메시지 제어

 

GPIO제어를 통한 웹서비스 메시지를 제어하는 것을 해보자.

 

p/202~p/211을 참고한다.

 

우선 파이선PIP를 설치한다.

 

apt-get install python-pip

 

 

 

python-pip 설치 후 플라스크를 설치한다.

 

pip install flask

 

 

교재 p/203"hello_flask.py"를 작성한다.

[hello_flask.py]

 

 

 

입력을 마친 후 실행시킨다.

 

입력한 IP와 포트번호를 웹에 입력하면 자신이 설정한 메시지가 뜬다.

 

웹에서 해당 서비스를 요청한 경우 이를 라즈베리파이에서 확인할 수 있다.

 

플라스크 서버에 HTML 웹페이지를 구성하고, 웹브라우저를 통해 클라이언트가 접속했을 때 서버의 시간을 출력해 보자.

 

교재 p/205에 나와있는 "gettime.py"를 작성하고 작성한 파일과 동일한 위치에 "templates"라는 폴더를 만든다. 그런 다음 main.html 파일을 작성하여 만든 폴더에 넣는다.

 

[gettime.py]

[main.html]


 

플라스크를 기반으로 GPIO 포트 모니터링

 

플라스크를 이용하여 웹을 통해 라즈베리 파이를 제어해본다. 핀에 on/off 상태를 웹서버에서 확인할 수 있도록 만든다.

 

port 23, 24, 25를 사용하도록 한다.

 

[gpio.html]

 

[check_switch.py]




반응형
Posted by newind2000
Busan IT/정보처리기사2015. 10. 23. 11:54



[필기]

학습기간 - 2주일(주5일 4시간)

1주차 - 정보처리기사 필기책 이론 공부

2주차 - 인터넷에서 기출문제 풀이


[실기]

학습기간 - 3일(하루 4시간)

1 - 2일차 - 데이터베이스 이론 공부(기출문제)

3일차 - 알고리즘 공부(기출문제)

당일 - 시험장 가는 도중에 다른 과목들 눈으로 훑어봄


==> 비전공이지만 프로그래밍을 했기 때문에 알고리즘 부분은 공부하지 않아도 쉽게 풀 수 있었다.


반응형

'Busan IT > 정보처리기사' 카테고리의 다른 글

데이터 통신  (0) 2015.08.14
Posted by newind2000
Busan IT/Assembly2015. 10. 23. 11:46

==================================Outline====================================

LOAD함수 구현

----------------------------------------------------------------------------

 

LOAD함수를 사용하여 실행 파일을 동적할당 받은 메모리에 올린다. 헥사뷰를 사용하여 메모리의 어떻게 적재 되어 있는지 확인해 본다.

 

LOAD함수가 실행되면 우선 사용자로부터 실행파일명을 입력 받고 파일이 존재하는지 검사 후 파일이 존재하면 파일을 동적 할당 받은 메모리에 적재한다.

 

프로그램 적재 후 코드와 데이터 영역을 따로 메모리에 적재하는데 이 때 각 영역의 주소를 알아내기 위해서 PE 파일 포맷에 대해 알아야 한다.

 

해당 블로그에 자세한 설명이 나와 있음으로 참고한다.

 

http://haerakai.tistory.com/18

 

 

우선 PE 파일 포맷의 전체적인 구조를 살펴보자.

헤더와 섹션으로 구분이 되어 있다. 헤더 부분은 각 섹션에 대한 주요 정보를 담고 있으며 헤더의 정보를 참조하여 각 섹션으로 이동할 수 있다.

 

우선 IMAGE_DOS_HEADER를 살펴보자.

 

//구조체의 원형은 Windows.h에 담겨 있음으로 헤더파일을 추가한다.

 

//#include <Windows.h>

다음 섹션으로 넘어가기 위해 보아야 할 구조체의 멤버는 ‘e_lfanew'이다. 4byte로 되어 있으며 다음 헤더의 주소를 담고 있다.

 

이를 통해 다음 헤더인 IMAGE_INT_HEADER로 이동한다.

Signature4byte임으로 이를 포인터의 주소를 4byte이동 시킨 후 IMAGE_FILE_HEADER를 가리키게 한다.

IMAGE_FILE_HEADER의 멤버인 SizeOfOptionalHeader에 말 그대로 Optional_Header의 크기가 담겨져 있다. 이를 활용하여 Optional_Header의 주소에서 Optional_Header의 크기만큼을 더하면 SECTION_TABLE로 넘어갈 수 있다.

SECTION헤더에서 각 헤더에 대한 크기와 위치가 저장되어 있다. 이것을 활용하여 원하는 섹션의 위치에 데이터를 집어 넣으면 된다.





/*** 코드 ***/


void load()
{
  int iFd;
  char cBuf[CMD_SIZE];
  int iRtn;
  IMAGE_DOS_HEADER *stpDosH;
  IMAGE_NT_HEADERS32 *stPNtH;
  IMAGE_SECTION_HEADER *stSH;
  unsigned int iAddr;
  unsigned int uiNH;
  IMAGE_FILE_HEADER * stpFH;
  unsigned int uiSizeofOH;
  //IMAGE_OPTIONAL_HEADER * stpOH;
  unsigned int uiOHaddr;
  IMAGE_SECTION_HEADER * stpSHt;  
  unsigned int uiPRDt;
  unsigned int uiSRDt;
  IMAGE_SECTION_HEADER * stpSHd;
  unsigned int uiPRDd;
  unsigned int uiSRDd;  
  
  printf("읽어 들일 파일명을 입력하세요.\n");
  iRtn = read(0, cBuf, CMD_SIZE);
  if(iRtn < 2)
  {
    return;  
  }  
  cBuf[iRtn-1= 0;
  
  iFd = open(cBuf, O_RDONLY|O_BINARY, 666);
  if(iFd== 0)
  {
    printf("[%s]을 사용할 수 없습니다.\n", cBuf);
    return;
  }
  
  iRtn = read(iFd, vpMem_start, MAX_PRG_SIZE);
  if(iRtn== 0)
  {
    printf("파일을 불러올 수 없습니다..\n");
    return;
  }
  printf("------------------ LOAD PROCEDURE ------------------\n"); 
  printf("vpMem_start         [%08X]\n", vpMem_start);

  
  stpDosH = (IMAGE_DOS_HEADER *)vpMem_start;

  uiNH = stpDosH->e_lfanew;
  printf("IMAGE_HEADER->e_lfanew      [%08X]\n", uiNH);

  stPNtH = (IMAGE_NT_HEADERS32 *)( ( (int)vpMem_start) + uiNH );
  printf("IMAGE_NT_HEADERS32       [%08X]\n", stPNtH);

  stpFH = (IMAGE_FILE_HEADER * )( (int)stPNtH + sizeof(stPNtH->Signature) );
  printf("IMAGE_NT_HEADERS32->IMAGE FILE HEADER  [%08X]\n", stpFH);

  uiSizeofOH = stpFH->SizeOfOptionalHeader;
  printf("Size of Optional Header     [%08X]\n", uiSizeofOH);

  uiOHaddr = (unsigned int) ( &(stPNtH->OptionalHeader) );
  printf("addr. of OH         [%08X]\n", uiOHaddr);

  stpSHt = (IMAGE_SECTION_HEADER*) ((int)uiOHaddr + uiSizeofOH);
  printf("addr. of SH. txt       [%08X]\n", stpSHt);

  uiPRDt = stpSHt->PointerToRawData;
  uiSRDt = stpSHt->SizeOfRawData;
  uiPRDd = uiSRDt + uiPRDt;
  
  printf("size of raw data. txt       [%08X]\n", uiSRDt);
  printf("pointer to raw data. txt    [%08X]\n", uiPRDt);
  printf("pointer to raw data. data     [%08X]\n", uiPRDd);  
  printf("------------------ LOAD PROCEDURE ------------------\n");  

  iRtn = lseek(iFd, uiPRDt, SEEK_SET);
  if(0 > iRtn)
  {
    memory_clear();
    close(iFd);
    printf("프로그램 적재 실패\n");
    return;
  }

  iRtn = read(iFd, vpCode, SECTION_SIZE);
  if(0 > iRtn)
  {
    memory_clear();
    close(iFd);
    printf("프로그램 적재 실패\n");
    return;
  }
  printf("코드영역 적재 완료\n");

  iRtn = lseek(iFd, uiPRDd, SEEK_SET);
  if(0 > iRtn)
  {
    memory_clear();
    close(iFd);
    printf("프로그램 적재 실패\n");
    return;
  }

  iRtn = read(iFd, vpData, SECTION_SIZE);
  if(0 > iRtn)
  {
    memory_clear();
    close(iFd);
    printf("프로그램 적재 실패\n");
    return;
  }
  else if(0 == iRtn)
  {
    memory_clear();
    close(iFd);
    printf("데이터 영역이 존재하지 않습니다.\n");  
    return;
  }    
  printf("데이터영역 적재 완료\n");    
  
  return;
}


반응형
Posted by newind2000
Busan IT/Assembly2015. 10. 22. 08:45

==================================Outline====================================

PE구조체

----------------------------------------------------------------------------

load함수를 구현해보자.

 

프로그램을 메모리에 입력시키기 위해서는 실행 파일이 메모리에 어떻게 적재 되는지 알아야 한다.




 

lseek을 사용하여 “.text"가 있는 곳까지 이동시켜야 한다.

 

도스헤더의 주소를 받은 후 '1D8'만큼 떨어진 Section header(".text")에서 Section(".text")의 주소를 찾아야 한다.

 

http://haerakai.tistory.com/18

 

위에 블로그에 접속하여 정독한다.

 

 

 

 

 

 

 

 

반응형
Posted by newind2000