본문 바로가기
코스웨어/10년 스마트폰BSP

[bsp]업무일지 -한경수-

by 알 수 없는 사용자 2010. 9. 10.
728x90
반응형

메모리 구조.

#include<stdio.h>

int a;
int b;
int c;

int d=1;
int e=2;
int f=3;

int g;
int h;
int i;


int main()
{
  int j=4;
  int k=5;
  int l=6;

  static int m=7;
  static int n;
  
  int o=1;
  int p=2;
  int q=3;
  
  printf("code [0x%08X]\n",&main);
  printf("code [0x%08X]\n",&printf);
  printf(" a bss   code [0x%08X]\n",&a);
  printf(" d data  code [0x%08X]\n",&d);
  printf(" g bss   code [0x%08X]\n",&g);
  printf(" j st    code [0x%08X]\n",&j);
  printf(" m -     code [0x%08X]\n",&m);
  printf(" n -     code [0x%08X]\n",&n);
  printf(" o stack code [0x%08X]\n",&o);
  
  return 0;
}




  
stack에서 변수가 선언되면 순서대로 밑에서 부터 올라간다.

1. code
   - 프로그램의 실행 코드인 기계어 코드와 읽기 전용 데이터 등을 가진다.
     (CPU가 읽어들여 수행한다고 해서 텍스트라고 부르며, 코드 영역이라고 한다.)
   - 프로그래머가 작성한 소스를 컴파일 후 링크 과정을 거쳐서 만들어진 프로그램의 기계어 코드.
   - 디버깅과 같은 제한된 환경에서 크기의 변경이 가능

2. data
   - C 언어에서 전역변수, 정적변수, 초기화된 배열과 구조 등으로 선언된 변수 영역 (읽기 / 쓰기 가능)
   - 프로그램이 실행될 때 생성되고 프로그램이 종료될 때 시스템에반환
   - malloc 계열의 시스템콜을 이용해서 확장하는 것이 가능

3. heap
   - 프로그램 수행 중 malloc(), free() 등의 시스템 콜로 할당되고, 해지되는 메모리 영역

4. stack
   - C 언어의 함수 호출 시 지역 변수와 인수, 함수의 수행이 끝났을 때 리턴할 주소(return address)를 푸시한다.
     (함수가 끝나면 이 값을 팝하고 리턴하게 된다.)
   - 자동 변수 (auto variable) 저장
   - 함수로 인수를 보내기
      ( 함수로 인수를 보낼 때는 인수를 역순으로 보낸 뒤 복귀 번지를 저장.)
   - 복귀 번지(return address) 저장의 용도로 사용
   - 스택 프레임 단위로 적재
     ( 함수 역시 호출 시에 스택 영역에 생성되고 사용된 후 시스템에 사용영역이 반환)
   - 프로세스의 실행과 함께 커널에 의해서 스택 세그먼트가 자동으로 확장

※ - 텍스트(코드), 데이터, 힙 영역은 하위 메모리로부터 할당되며, 스택 영역은 상위 메모리로부터 할당
    - 데이터와 스택 세그먼트는 읽기, 쓰기가 모두 가능한 영역
       - 단, 차이점은 데이터 세그먼트는 초기화된 데이터와 그렇지 않은 데이터가 함께 존재
         스택 세그먼트는 실행시간에 초기화된 값들을 보관


* 변수의 수명

전역 변수는 프로그램이 시작되었을 때 한 번만 초기화 되고, 그 후에 프로그램이 종료될 때까지 존속합니다.
한편 함수 내부에서 선언, 초기화된 지역 변수는 함수가 불릴 때마다 초기화 되고(초기화 코드가 있는 경우),
함수 호출 중에만 존속하며, 함수 호출이 끝나면 소멸됩니다. 이 때문에 지역 변수의 수명은 <함수가 불려진> 기간 뿐입니다.

 그러나 지역 변수 선언 앞에 C의 static 키워드를 붙이면 지역 변수의 수명이 바뀝니다. static 지역 변수는
함수 호출이 시작될 때 단 한 번만 초기화 되고 프로그램이 종료될 때까지 존속하게 됩니다. 즉, static 지역 변수의
수명은 전역 변수의 수명과 동일한 것입니다. 다만 static 지역 변수의「통용 범위(스코프, scope)」는 일반 지역 변수와 같기 때문에
전역 변수의「통용 범위」와는 다릅니다. 전역 변수의 경우 파일이 분할되어 있는 장소에 따라서 약간 제약을 받기는 하지만
「통용 범위」는 원칙적으로 프로그램 전체입니다.





728x90