<aside> 💡 “운영체제 : 아주 쉬운 세가지 이야기”를 읽으면서 핵심 내용을 정리하였습니다. 이화여대 반효경 교수님의 운영체제 강의를 듣고 복습 차원에서 책 한권을 완독해보고자 합니다. 잘못된 정보가 있다면 댓글 남겨주시면 감사하겠습니다!

</aside>

동적 재배치의 한계

https://blog.kakaocdn.net/dn/c0ew0o/btrYV86EnO7/szPj7gKgPqBQMFSkhLaSc0/img.png

지금까지 메모리를 가상화하는데 필요한 주소변환의 원리에 대해 알아 보았다. 동적 재배치라는 하드웨어의 지원을 받아 주소를 변환하는 방법은 간단하였지만 다음과 같은 한계가 있었다.

  1. 프로그램의 전체 주소공간을 물리 메모리에 탑재하여 발생하는 내부 단편화

세그멘 테이션의 등장 : 베이스/바운드의 일반화

상기 한계를 극복하기 위해 세그멘테이션이 등장하게 되었다. MMU안에 한쌍의 베이스 바운드 쌍만 존재 하는 것이 아니라 주소공간의 논리적인 단위인 세그먼트의 갯수 만큼 여러 쌍의 베이스/바운드 레이스터를 가지고 있게 된다.

이로써 운영체제는 아래와 같이 물리 메모리의 각기 다른 위치에 세그멘테이션을 배치 할 수 있게 됨으로서 내부 단편화를 방지할 수 있게 되었다.

만약 그림 19.1에서 힙의 가상 주소 공간인 4200번지를 물리주소로 변환하기 위해서는 가상 주소공간에서 힙의 시작위치(4096, 4KB) 부터 떨어진 오프셋(104)을 구하고 그것을 힙의 베이스 레지스터에 더해 주면 된다.

https://blog.kakaocdn.net/dn/bhojk3/btrYVgqhJZ1/rR73C1dmwCbbOujpKXHtuK/img.png

세그먼트 폴트

세그멘트 종류의 파악

하드웨어는 가상 주소를 보고 세그먼트의 종류가 무엇인지 알 수 있어야 하고 해당 세그먼트안에서 오프셋이 얼마인지 알수 있어야 한다.

https://blog.kakaocdn.net/dn/UsKod/btrYTovQdwW/Fo7QCEhOwKG8NuyjcfZQ1k/img.png

//14bit VA중 2bit 얻어오기// SEG_MASK = 2, SEG_SHIFT = 12, OFFSET_MASK = 0xFFF
segment = (virtualaddr & SEG_MASK) >> SEG_SHIFT
// offset 얻어오기
offset = virtualaddr & OFFSET_MASK
// 예외 검사if (offset >= bound[segment])
	raiseExpection(PROTECTION_FAULT)
else
	physaddr = base[segment] + offset
    register = accessMemory(physaddr)