ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Static Memory Allocation
    지식 조각들/컴퓨터 2018. 8. 13. 23:09

    목차

  • Static Memory Allocation
  • 프로그램이 로딩되기까지 전반적인 과정
  • 컴파일 과정과 링킹 과정 자세히 살펴보기

  • Static Memory Allocation

    컴퓨터 사이언스에서 static이라는 말이 붙으면 보통 실행 전(=컴파일 타임)에 일어나는 일을 말한다. Static memory allocation은 프로그램이 수행되기 전에 미리 메모리를 할당하는 것을 뜻한다. 풀어서 쓰면 컴파일 타임에 code section, data section, BSS section이 메모리에 미리 올라가는 것을 말한다[각주:1]. Static allocation의 특징은 변수들의 life cycle이 프로그램의 시작과 종료가 일치하는 것이다.

    프로그램이 로딩되기까지 전반적인 과정

    소스 파일(source file) : 사람이 읽을 수 있는 언어로 작성된 파일이다. ex) C언어 소스 파일, C++ 소스 파일, ...

    목적 파일(object file) : 기계어 및 심볼 테이블, 재배치 테이블을 포함한 여러가지 데이터를 포함하는 파일이다.

    실행 파일(executable file) : 실행 가능한 파일이다. 실행 파일에는 section 별로 몇 번지에 있어야 하는지에 대한 정보가 저장되어 있다.

    컴파일러(compiler) : 각각의 소스 파일을 목적 파일로 변환시키는 도구이다. (실제로는 .s 파일로 변환한다. 자세한 내용은 [여기]를 참조하자)

    링커(linker) : 여러 개의 목적 파일을 묶어서 하나의 실행 파일로 만들어주는 도구이다. section 주소 정보를 가지고 있는 linker script에 따라 레이아웃된다. GCC에는 디폴트로 설정된 linker script가 있다. 만약 linker script를 변형하고 싶다면 충분히 변형 가능하다.

    로더(loader) : OS의 일부분으로 fork()와 exec() 기능을 한다. 실행 파일을 읽어 메인 메모리에 내용을 전부 레이아웃을 하고 context를 빌드한다. 마지막으로 PC를 executable file entry point로 셋팅한다.


    컴파일 과정과 링킹 과정 자세히 살펴보기

    컴파일 과정과 링킹 과정을 보면 몇 가지 문제점을 발견할 수 있다. 첫번째로 소스 코드에 있는 symbolic name을 컴퓨터가 어떻게 아느냐이다. 이는 심볼들을 전부 주소로 변환하면 해결할 수 있다. 두번째로 소스 파일은 대부분 여러 개로 나누어져 있고 목적 파일도 나누어져 있기 때문에 한 목적 파일을 만드는 동안 cross-reference들의 주소를 알 방법이 없다. cross-reference란 현재 소스 코드 외에 다른 파일에서 주소의 위치가 정해진 심볼들을 뜻한다. 이 문제를 해결하기 위해 심볼 테이블재배치 테이블이 등장한다.

    심볼 테이블

    심볼 테이블(symbol table)은 심볼이 나오면 해당 주소 및 기타 정보(섹션 정보, 오프셋)들을 한 곳에 모아둔 자료 구조이다. 심볼 테이블의 인덱스는 심볼의 이름이다. 컴파일러가 주소를 알 수 있는 심볼의 경우, 주소를 생성할 때 PC relative addressing(PC+offset)을 한다[각주:2]. 컴파일러는 해당 소스 코드에 정의된 심볼들의 정보들은 심볼 테이블에 기록할 수 있지만 cross-reference의 경우에는 불가능하다. 따라서 주소를 알 수 없는 심볼의 경우 0x0으로 처리한 후, 다음 작업을 계속 수행한다.

    재배치 테이블

    재배치 테이블(relocation table)은 cross-reference가 나타난 위치를 작성하는 자료 구조이다. 링커에 의해서 모든 심볼 주소를 기록하게 되면 재배치 테이블 내용을 바탕으로 최종 심볼 테이블이 작성된다.


    위 내용은 서울대학교 평생 교육원에서 제공하는 운영체제의 기초 강의를 정리한 것입니다.

    1. data segment에서는 BSS section과 data section처럼 나눌 필요가 없다. BSS도 메모리에 로딩되야하는 영역이기 때문이다. 초기화되지 않은 값은 보통 운영 체제에 의해서 0으로 세팅된다(zero fill). [본문으로]
    2. 링커가 목적 코드를 전부 처리하게 되면 linker script에 따라서 각 섹션들의 위치가 완전히 정해지게 된다. 그 결과 섹션 안에서 정의된 심볼들의 실제 주소를 얻을 수 있다. [본문으로]

'지식 조각들 > 컴퓨터' 카테고리의 다른 글

LINUX 메모리 보호 기법  (0) 2018.08.19
Dynamic Memory Allocation  (0) 2018.08.14
GCC 동작 과정  (0) 2018.08.13