페이징과 TLB, 그리고 MMU


    페이징

    물리 메모리는 프레임, 논리 메모리는 페이지라 불리는 같은 크기의 블록으로 나뉜다.

    • 페이지 크기는 일반적으로 4KB~4MB

    CPU에서 나오는 모든 주소는 페이지 번호(p)와 페이지 오프셋(d: offset) 두 개의 부분으로 나뉜다.

    페이지 번호는 프로세스 페이지 테이블(page table)을 액세스할 때 사용된다.

    페이지 테이블은 물리 메모리의 각 프레임의 시작 주소를 저장하고 있으며 오프셋은 참조되는 프레임 안에서의 위치이다.

    ⇒ 접근할 물리 메모리 주소 = 프레임의 시작 주소 + 페이지 오프셋

    • 빠른 컨텍스트 스위치를 지원하고 페이지 테이블을 찾기위해 PTBR(Page Table Base Register)을 둔다.
      • PTBR (feat.claude)PTBR의 주요 기능과 특징:
        1. 페이지 테이블 위치 지정
        • 현재 실행 중인 프로세스의 페이지 테이블 시작 주소를 저장
        • MMU가 가상 주소를 물리 주소로 변환할 때 이 주소를 기준으로 페이지 테이블 접근
        1. 컨텍스트 스위칭 지원
        컨텍스트 스위치 과정:
        1. 현재 프로세스의 상태 저장
        2. PTBR 값을 새로운 프로세스의 페이지 테이블 주소로 변경
        3. 새로운 프로세스의 상태 복원
        
        
        1. 장점:
        • 단일 레지스터 변경만으로 전체 주소 공간 전환 가능
        • 페이지 테이블 접근 시간 최소화
        • 하드웨어 지원으로 빠른 전환 속도
        • TLB flush와 함께 메모리 보호 보장
        이러한 방식으로 PTBR은 효율적인 메모리 관리와 프로세스 전환을 가능하게 합니다.
      • 네, 맞습니다. PTBR(Page Table Base Register, x86에서는 CR3 레지스터로도 알려짐)은 컨텍스트 스위칭과 페이지 테이블 접근에서 핵심적인 역할을 합니다.

    MMU

    MMU는 CPU에 의해 생성된 논리 주소를 물리 주소로 변환한다.

    1. 페이지 번호 p를 추출하여 페이지 테이블의 인덱스로 사용한다. (TLB가 없다고 가정)
    2. 페이지 테이블에서 해당 프레임 번호 f를 추출한다.
    3. 논리 주소의 페이지 번호 p를 프레임 번호 f로 바꾼다.

    논리 주소 공간의 크기가 $2^m$이고 페이지 크기가 $2^n$바이트인 경우 논리 주소의 상위 m -n 비트는 페이지 번호를 지정하고 n 하위 비트는 페이지 오프셋을 지정한다.

    MMU, Memory Management Unit

    프로그램의 실행중에 가상(논리) 주소를 물리 주소로 변환(mapping)을 수행하고 메모리 보호, 캐시 관리를 수행하는 하드웨어 장치

    기준 레지스터=재배치 레지스터, MMU 동작을 단순화해서 보여준다

    위는 세그먼테이션의 경우를 보여주고 있다. base < 적법한 메모리 주소 < base+limit

    페이징 환경에서 메모리 보호는 생각해볼 것이 좀 많다.

    페이징, 메모리 보호

    페이징 환경에서 메모리 보호는 각 페이지에 붙어있는 보호 비트(protection bits)에 의해 구현된다.

    보호 비트(protection bits)는 보통 페이지 테이블에 속해있다.

    각 비트는 페이지가 read-only인지, read-write 인지 정의한다.

    읽기 전용 페이지에 쓰기를 시도하면 OS가 하드웨어로 트랩을 걸어준다.(memory protection violation)

    페이지 테이블의 각 엔트리에는 유효/무효(valid/invalid) 비트가 하나 더 있다.

    이 비트가 valid로 설정되면 관련된 페이지가 프로세스의 합법적인 페이지임을 나타낸다.

    invalid인 경우에는 그 페이지가 현재 프로세스의 논리주소 공간에 속하지 않는다는 것을 나타낸다.

    프로세스가 다른 프로세스의 주소공간에 접근할 때

    Invalid인 경우

    1. MMU는 페이지 폴트(page fault)를 발생시킨다.
    2. OS의 페이지 폴트 핸들러가 호출된다.
    3. OS는 이를 메모리 보호 위반으로 판단하고 일반적으로 SIGSEGV(Segmentation Fault) 시그널을 프로세스에 보낸다.

    이와 같은 과정을 거쳐 적법하지 않은 주소에 접근하려하면 OS가 트랩을 발생시킨다.

    TLB, Translation Lookaside Buffer

    TLB는 가상 메모리 주소를 물리 주소로 변환하는 속도를 높이기 위해 사용되는 주소 변환 캐시를 말한다.

    최근에 일어난 가상 메모리 주소↔물리 주소 변환을 테이블에 저장한다.

    ⇒ 즉, 최근 사용한 프레임 번호를 저장한다.

    TLB가 필요한 이유

    메인 메모리에 페이지 테이블을 저장하면 Context Switch 속도가 빨라지지만 메모리 액세스 시간이 느려질 수 있다. 페이지 테이블에서 실제 주소를 찾는 데 한 번 + 실제 주소에 액세스하는 데 한 번, 총 두 번의 메모리 액세스가 필요하다.

    이러한 문제를 해결하기 위해 TLB라는 소형 하드웨어 캐시를 도입한 것이다.

    TLB는 매우 빠른 연관 메모리로 구성된다. TLB 내의 각 항목은 키-값 쌍으로 구성된다.

    TLB에 페이지를 찾아달라 요청하면, 찾고자 하는 페이지를 동시에 여러 개의 내부 키와 비교한다.

    → 히트하면 그에 상응하는 프레임 번호를 알려주는 것이다.

    TLB는 명령어 파이프라인의 일부로 동작하며 성능에 오버헤드를 불러오지 않는다.

    다만, 이렇게 파이프라인의 일부로 동작하기 위해서는 TLB 크기를 작게 유지할 수 밖에 없어, 통상 32~1024개의 항목만 유지한다.

    TLB 사용

    CPU가 논리 주소를 생성하면 MMU는 해당 페이지 번호가 TLB에 있는지 확인한다.

    → 히트하면 프레임 번호를 즉시 알 수 있고 바로 실제 메모리 주소에 접근한다.

    ⇒ 히트 시, 과정은 CPU 내부에서 명령어 파이프라인의 일환으로 실행되기 때문에 페이징을 사용하지 않는 시스템과 비교해도 성능 저하가 전혀 없다.

    TLB 미스가 일어나면 주소변환 단계가 진행된다.(페이지 테이블에 대한 접근이 일어난다.)

    이 때, 페이지 테이블에서 조회해서 페이지 번호 + 프레임 번호를 TLB에 추가한다.

    • TLB가 가득 찼을 때 교체할 항목을 선택하는 방법은 다양하다(LRU, 라운드 로빈, 무작위 … 등)

    세부사항, ASID와 프로세스 별 TLB

    어떤 TLB는 각 항목에 ASID(address-space identifiers)를 저장한다.

    ASID는 해당 TLB 항목이 어느 프로세스의 것인지 알려주며, 그 프로세스의 정보를 보호하기 위해 사용된다.

    TLB에서 가상 주소를 변환할 때 현재 수행중인 프로세스의 ASID가 TLB 항목의 ASID와 같은지 검사한다.

    ASID가 다르면 TLB 미스(miss)로 처리한다.

    ASID 지원이 있으면 한 TLB 안에 여러 프로세스의 정보를 동시에 함께 보관할 수 있다.

    ASID 지원이 없으면 새로운 페이지 테이블이 선택될 때마다(컨텍스트 스위치가 일어난다던지..) 다음 실행 프로세스가 잘못 변환하지 않도록 하기 위해 TLB는 flush 되어야 한다.

    댓글