하드웨어 기반 주소 변환 == 주소변환
- 제한적 직접 실행 방식에 부가적으로 사용되는 기능
- 주소 변환을 통해 HW는 명령어 반입, 탑재, 저장 등의 가상 주소를 정보가 실제 존재하는 물리 주소로 변환
- 프로그램의 모든 메모리 참조를 실제 메모리 위치로 재 지정하기 위해 HW가 주소 반환
이 모든 작업의 목표는 결국 메모리 가상화로 환상 제공
15.2
- 메모리에서 값 탑재 후 3 증가 시키고 다시 메모리에 저장하는 코드
void func() {
int x = 3000;
x = x + 3;
컴파일러는 코드를
- 어셈블리 코드로 변환
- 그 결과는 x86 어셈블리로 아래와 같음
128: movl 0x0(\%ebx) , \%eax ; 0+ebx를 eax에 저장
132: addl \$0x03, \%eax ; eax레지스터에 3을 더한다
135: movl \%eax, 0x0(\%ebx) ; eax를 메모리에 다시 저장
명령어의 실행 과정
- 주소 128의 명령어 반입
- 명령어 실행(주소 15KB에서 탑재)
- 주소 132 명령어 반입
- 명령어 실행(메모리 참조 없음)
- 주소 135 명령어 반입
- 명령어 실행(15KB에 저장)

이 프로그램 관점에서 주소공간은 0부터 16KB까지
가상화로 실제 0~16이 아닌 특정 주소로 재배치 하고 싶음

베이스와 바운드(base and bound)
동적 재배치 라고도 함
- 각 CPU마다 2개의 하드웨어 레지스터 필요
- CPU는 각각 베이스 레지스터, 바운드 레지스터(한계 레지스터)
배이스
- 베이스와 바운드는 원하는 위치에 주소공간 배치를 가능하게 함
- 배치와 동시에 프로세스가 오직 자신의 주소공간만 접근하는것을 보장
- 프로그램은 주소 0에 탑재되는 것 처럼 작성되고 컴파일 됨
- 실제 프로그램이 탑재될 물리 메모리 주소는 베이스 레지스터
- 때문에 프로세스에 의해 생성되는 모든 주소는 아래와 같음
physical address = virtual address + base
virtual address: 프로세스가 생성하는 메모리 참조
바운드
바운드 레지스터는 보호를 지원하기 위해 존재
- 프로세서는 메모리 참조가 합법적인가 확인하기 위해 가상 주소가 바운드 안에 있는지 확인
- 위의 예시에서 바운드는 항상 16KB
- 프로세스가 바운드보다 큰 가상주소 or 음수 가상주소 참조시 CPU는 예외 발생 후 프로세스 종료
베이스 & 바운드는 CPU 칩 상 존재하는 하드웨어 구조
주소변환에 도움주는 프로세서 일부를 메모리 관리 장치 라고도 함
바운드 레지스터는 두가지 방식 중 하나로 정의될 수 있음
- 주소 공간의 크기를 저장하는 방식
- 하드웨어는 가상 주소를 베이스 레지스터에 더하기 전 바운드 레지스터와 비교
- 주소 공간의 마지막 물리주소를 저장하는 방식
- 하드웨어는 베이스 레지스터를 더하고 그 결과가 바운드 안에 있는지 검사
15.4 하드웨어 지원 : 요약
주소변환에 필요한 하드웨어 지원

15.5 운영체제 이슈
하드웨어가 새로운 기능을 제공하는 것처럼 운영체제도 개입되어야 하는 세 개의 시점이 존재

- 프로세스가 생성 시 OS는 주소 공간이 저장될 메모리 공간을 찾아 조취를 취해야 함
- 각 주소 공간은 물리 메모리 크기보다 작고 크기가 일정하다는 가정 하에 OS가 쉽게 처리 가능
- 프로세스 생성시 OS는 새로운 주소 공간 할당에 필요한 영역을 free list 자료구조를 검색
- 프로세스 종료시 프로세스가 사용메모리 회수해 다른 프로세스 or OS 가 사용할 수 있게 해야 함
- 문맥 교환이 일어날 때도 몇가지 추가 조취 취해야 함
- CPU마다 한쌍의 베이스-바운드 레지스터 존재(당연히 프로세스마다 다른 값)
- 프로세스 전환 시 베이스 바운드 쌍을 저장하고 복원해야 함
- 프로세스 중단 결정 후 메모리에 존재하는 프로세스 별 자료구조 안에 베이스 바운드 레지스터 값을 저장해야 함 이 자료구조는 프로세스 구조체(프로세스 제어블록)이라 불림
- 예외 핸들러 or 호출 함수를 제공해야 함
- 프로세스가 바운드 밖 메모리 접근 시도 시 CPU는 예외핸들러 설치