주기억장치와 프로그램
메모리의 구조
메모리는 주소와 데이터로 이루어진다.
프로그램 개발
- 소스파일 (Source File) : 고급언어 또는 어셈블리어로 작성된 파일
- 목적파일 (Object File) : 컴파일 또는 어셈블 결과
- 실행파일 (Executable File) : 링크 결과
- 컴파일러 (Compiler) : 소스파일을 컴파일하여 목적파일을 생산한다.
- 어셈블러 (Assembler) : 어셈블리 코드를 어셈블하여 목적파일을 생산한다.
- 링커 (Linker) : 목적파일과 라이브러리를 연결하여 실행파일을 생산한다.
- 로더 (Loader) : 실행파일을 메모리에 적재한다.
프로그램의 실행
-> 프로세스가 생성되고 메모리에 프로세스 주소 공간이 할당됨
프로세스 주소 공간
- 코드 Segment
- 프로그램 소스코드 저장
- 데이터 Segment
- 전역 변수, 정적 변수, 배열, 구조체 등 저장
- 스택 Segment
- 함수 호출 주소, 파라미터, 리턴 값, 지역 변수 등 저장
👉 구역을 나눈 이유?
- 최대한 데이터를 공유하여 메모리 사용량을 줄여야 한다.
- Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유한다.
- Stack과 데이터를 나눈 이유는, 스택 구조의 특성과 전역 변수의 활용성을 위해서이다.
프로그램을 메모리에 올리기
MMU (메모리 관리 장치)
논리주소(Logical Address) -> 물리주소(Physical Address)로 변환
- 논리 주소(Logical Address)
- 물리 주소(Physical Address)
- 재배치 레지스터(Relocation register)
- 논리주소를 물리 주소로 변환시켜 주는 메모리 관리 장치(MMU)내의 레지스터
👉 주소 변환이 필요한 이유?
- 다중 프로그래밍 환경에서 로더(Loader)는 메모리의 빈자리에 실행파일을 올려주는데, 이 빈자리의 위치는 항상 일정하지 않아 매 실행시 프로그램의 적재 주소는 다르다.
- 따라서 프로그램 내에 작성된 Logical Address는 실제 메모리 접근 시 프로그램 적재 주소만큼 오프셋을 더하여 Physical Address로 변환될 필요가 있다.