컴파일 과정에서 가장 중요한 것은 메모리를 확보하고 정리하는 부분이다. 컴파일러는 프로그래머가 지정한 자료형의 크기에 따라 메모리를 확보하고 그곳에 적당한 값을 집어넣는다. 모든 변수에 대해 메모리를 확보하고 오류를 찾기 위해 심벌 테이블(symbol table)을 유지한다.
- symbol table : 컴파일러 또는 인터프리터 같은 언어 변환기에서 사용되는 데이터 구조로 이름, 종류, 범위, (시작)주소를 포함.
symbolic address >>컴파일>> logical address >>실행시작>> physical address
-
symbolic address : 프로그래머 입장에서 주소값을 기억하기 어려워 변수를 메모리 주소로 사용함. 변수명 등의 소스코드.
-
logical address (relative address, 상대 주소) : 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용하는 주소 지정 방식으로 실행파일. cpu입장에서의 주소이기도 함.
-
physical address (absolute address, 절대 주소) : 컴퓨터에 꽂힌 램 메모리의 실제주소.
(1) 주소 바인딩 (address binding)
메모리 번지를 언제 결정할 것인가.
- Compile time binding : 물리적 주소가 컴파일할때 알려짐. 시작 위치 변경시 재커마일해야함. 컴파일러는 절대 코드(absolute code) 생성.
- Load time binding : loader의 책임하에 물리적 주소 부여. 컴파일러가 재배치가능 코드(relocatable code) 생성.
- Run time binding (Execute time binding) : 현재 가장 많이 쓰이고 있는 방법으로, 수행 후에도 메모리 위치 옮길 수 있음. CPU가 주소를 참조할때마다 address mapping table을 이용해 binding 점검. MMU의 base and limit register 같은 하드웨어의 지원 필요.
(2) 메모리 주소 변환 과정 (논리적 주소 > 물리적 주소)
- 메모리 관리자 (memory managment unit, MMU) : 상대주소를 절대주소로 mapping해주는 하드웨어 장치로, 주소 변환과정에서 재배치 레지스터 (relocation register, base register)과 한계 레지스터(limit register)를 이용.
- 논리적 주소에 relocation register값을 더해서 물리적 주소를 얻음.
- limit register에 프로세스의 크기가 저장돼있어, 논리적 주소가 limit register값보다 큰 경우 trap: addressing error 이 발생. 다른 프로그램을 접근할 수 있는 비정상 접근이기 때문.