1. Paging
1.1 Segmentation의 문제점
세그멘테이션은 가변적인 메모리 조각들을 다루기 때문에 항상 Memory compaction를 해줘야한다. 하지만 이 과정이 마냥 간단하지는 않다.
1.2 paging
페이징은 실제 메모리를 페이지 프레임이라고 하는 고정 크기의 슬롯의 배열로 보는 방법이다. 프로세스가 주소 공간을 사용한느 방법에 관계없이 주소 공간의 추상화를 효과적으로 사용할 수 있다. 어떤 용도로 쓸건지에 대한 정보가 필요 없다. free 공간을 다루를 것이 더 간단해 질 수 있다.
1.3 Address Translation (Page table)
Page table 에는 주소 공간의 각 가상페이지에 대한 물리 주소가 저장되어있다. 가상 주소는 인덱스 번호와 같으므로 생략하고 물리주소 즉 페이지 프레임의 번호가 적혀있다.
virtual adress 에는 앞에 2비트로 Virtual page number를 표현하고 나머지는 offset을 표현한다.
Address Translation 과정에서는 offset은 그대로 오고 VPN은 Page table을 거져 PFN로 변환된다
2. Questions about page
2.1 tables가 너무 메모리차지
2.2 page table을 어디다가 저장하나
OS가 관리하는 물리적 메모리에 페이지 테이블을 저장한다. 하드웨어에 넣기에는 크기가 너무 크다
2.3 page table에는 어떤 정보가 있어야 Address Translation 을 할 수 있을까
선형 페이지 테이블이다. VPN별로 어레이를 인덱싱하고 해당 인덱스에서 PTE를 배치한다.
여기서 PTE란 page table entry의 약자로 여러 정보를 담은 원소가 들어있다. 내용은 CPU마다 다름으로 일반적인 내용만 설명하겠다.
1) Valid bit
- 접근된적이 있는가, mapping이 되었는가를 표현
2) Protection bits
- 해당 페이지의 접근 제한 표현
3) Present bit
- 이 페이지가 메모리에 있는가? 사용하지 않은 메모리는 잠시 디스크에 넣어놓음 이런 경우에는 메모리에 없는 경우
4) Dirty bit
- 네용에 무언가가 써있다.
5) Reference bit
- 프로세스가 실행 되면서 이 페이지에 접근했는가 (메모리가 부족할 때 메모리를 비워두기도하는데 자주 접근하면 비우지 않음)
2.4 Address translation 과정
하드웨어는 실행중인 프로세스의 페이지 테이블 위치를 저장하고 있는 레지스터가 있다.
Address translation 과정을 봐보겠다.
VPN = (VirtualAddress & VPN_MASK) >> SHIFT // 앞의 두비트 알아내기
PTEAddr = PTBR + (VPN * sizeof(PTE)) // 페이지 테이블 주소 + 엔트리의 크기 * 개수
PTE = AccessMemory(PTEAddr)
//검사
if (PTE.Valid == False)
RaiseException(SEGMENTATION_FAULT) // 예외처리
else if (CanAccess(PTE.ProtectBits) == False) // 안지킨게 있는가
RaiseException(PROTECTION_FAULT) // 예외처리
else // 검사 통과
offset = VirtualAddress & OFFSET_MASK //오프셋 겟또 (001111)
PhysAddr = (PTE.PFN << SHIFT) | offset // PFN 값 게또 왼쪽으로 4개 밈
Register = AccessMemory(PhysAddr)
'학부 내용 정리 > [ 2-1 ] 운영체제' 카테고리의 다른 글
[ OS ] Concurrency and Thread (0) | 2022.06.11 |
---|---|
[ OS ] Translation-Lookaside Buffer (0) | 2022.04.19 |
[ OS ] Segmentation (0) | 2022.04.18 |
[ OS ] Address Spaces (0) | 2022.04.18 |
[ OS ] Multiprocessor Scheduling (1) | 2022.04.17 |