본문 바로가기
C언어/Pintos

WIL3 (1)

by lacuca9 2024. 10. 10.

핀토스에는 힙이 없음

 

페이지 디렉토리와 페이지 테이블 페이지로 구성된 2단계 페이징을 가지며 매핑됨

 

프로세스가 실제로 시작될 때 text와 data는 실제 disk에 있

 

 

virtual address 구현은 프로세스가 물리 메모리 주소를 직접 사용하는게 아닌

가상 주소 공간을 사용하는 방식으로 전환을 의미

 

1. Demand Paging 및 Swapping 활성화

Demand Paging은 프로그램 전체를 한 번에 메모리에 로드하지 않고 필요한 페이지만 로드

Swapping은 메모리가 부족할 때, 사용하지 앟는 페이지를 디스크로 보내고 나중에 다시 부름

 

구현 방법

1. 페이지 폴트 처리 :

  • 프로세스가 아직 로드 안된 페이지 접근하면 페이지 폴트
  • 이때 커널이 디스크에서 해당 페이지 읽어와 물리 메모리 로드 후 페이지 테이블에 매핑

2. 스왑 공간 설정 :

  • 디스크의 일부를 스왑 공간으로 할당
  • 페이지 폴트 시 스왑 공간을 사용하여 사용하지 않는 페이지 내보내고 필요 페이지 부름

2. Stack Growth 활성화

스택이 커지면 커널은 자동으로 영역 확장

 

구현 방법

1. 스택의 동적 할당 :

  • 스택이 성장하여 할당 영역 넘으면 페이지 폴트
  • 커널은 새로운 페이지 할당, 스택 영역으로 지정한 후 페이지 테이블에 매핑

2. 스택의 상한 설정 :

  • 무한 성장 막기 위해 제한

3.  스택의 페이지 폴트 시 동적 페이지 할당

스택 영역에서 페이지 폴트 시, 동적으로 페이지 할당

 

구현 방법

1. 페이지 폴트 핸들러 수정 :

  • 커널은 새로운 물리 페이지 할당, 페이지 테이블 업데이트, 해당 페이지를 스택으로 연결

2. 스택 크기 추적 :

  • 페지이 폴트 시점에서 접근한 주소가 스택내에 있는지 확인, 범위 내에서만 동적 할당 허용

4. 메모리 매핑된 파일 (Memory Maped File) 구현

Memory Mapped File은 파일의 내용을 메모리 공간에 직접 매핑, 파일 읽거나 쓸 때 입출력 대신 메모리를 통해 처리

 

구현 방법

1. 페이지 테이블 수정 :

  • 파일의 내용을 가상 메모리에 매핑, 페이지 테이블에 파일의 페이지와 물리 메모리 페이지를 매핑

2. 지연 로딩 :

  • 파일 전체를 한 번에 메모리에 로드하지 않고, 필요할 때마다 해당 페이지를 로드하는 방식을 사용

5. mmap() 및 munmap() 함수 구현

mmap() : 파일을 가상 메모리 공간에 매핑하는 함수

munmap() : 매핑된 메모리 영역을 해제하는 함수

 

구현 방법

1. mmap() :

  • 파일을 가상 주소 공간에 매핑, 페이지들을 물리 메모리 페이지에 매핑
  • 페이지 폴트 시, 파일에서 해당 페이지를 읽어와 물리 메모리로 로드

2. munmap() :

  • 매핑된 메모리 영역을 해제, 필요에 따라 파일의 변경 사항을 다시 디스크에 씀

6. 파일 기반 페이지와 익명 페이지 구분

파일 기반 페이지는 메모리에 매핑된 파일에서 비롯된 페이지,

익명 페이지는 파일에 매핑되지 않은 일반적인 메모리 페이지

 

구현 방법

1. 페이지 구조체에 플래그 추가 :

  • 각 페이지를 파일 기반인지 익명 페이지인지 구분할 수 있는 플래그 추가

2. 페이지 로드 시 구분 :

  • 페이지를 로드할 때, 파일에서 로드된 페이지는 파일 기반 페이지로,
    일반 메모리 할당은 익명 페이지로 구분

7. 사용자 메모리 접근 활성화

사용자 프로그램이 커널 메모리에 안전하게 접근할 수 있도록 해야 함

 

구현 방법

1. 주소 유효성 검사 :

  • 커널에서 사용자 프로그램이 요청한 주소가 유효한지, 해당 주소가 사용자 영역인지 확인 코드 추가

2. 페이지 테이블 접근 권한 설정 :

  • 페이지 테이블의 권한 비트를 사용하여 사용자 모드에서만 접근 가능한 페이지와
    커널 모드에서만 접근 가능한 페이지를 구분

 

 

 

 

Virtual Addressing and Paging System

1. Virtual Page :

  • 구조 : 가상 페이지 번호(VPN, 20비트) + 페이지 오프셋(12 비트)
  • 설명 : 가상 주소는 페이지 번호와 페이지 내 오프셋으로 나뉨.
    페이지 번호는 가상 주소 공간에서 페이지 나타냄. 오프셋은 페이지 내에서의 위치를 나타냄

2. Page Frame :

  • 구조 : 물리 프레임 번호(PFN, 20비트) + 페이지 오프셋(12비트)
  • 설명 : 물리 메모리에서 각 페이지 프레임은 고유한 번호(PFN)를 가지며,
    페이지 오프셋은 페이지 프레임 내에서의 위치를 나타냄

3. Page Table :

  • 매핑 구조 : VPN -> PFN
  • 설명 : 가상 페이지 번호를 물리 프레임 번호로 변환하는 매핑을 저장하는 데이터 구조.
    하드웨어에서 처리되어 메모리 접근을 가속화함

4. Swap Space :

  • 구조 : 페이지 크기 블록들의 배열
  • 설명 : Swap sapce는 물리 메모리가 부족할 때 페이지를 디스크로 내보내기 위한 공간.
    고정 크기의 페이지 블록 배열로 구성되어 있으며, 필요할 때 해당 페이지를 디스크에서 다시 불러옴

 

페이지 로딩 및 메모리 관리 전략

1. 디스크에서 페이지 로드

  • 요청에 따라 디스크에서 페이지 로드 :
    • 페이지 폴트 시, 요청 페이지가 물리 메모리에 없으면 디스크에서 로드
    • 페이지가 파일의 일부분이면, 파일에서 읽어와 메모리에 로드
    • 페이지가 익명 메모리일 경우, 스왑 영역이나 새로 할당된 메모리에서 가져옴

2. 가상 메모리에서의 페이지 상태

가상 메모리(VM)의 각 페이지는 두 가지 상태로 존재할 수 있다

  • In-Memory Only : 메모리에만 존재하는 페이지. 스택, 힙, BSS 영역에 해당
  • Part of a File : 파일의 일부분으로, 파일에서 읽어와 메모리에 매핑되는 페이지.
    텍스트와 데이터 섹션, 그리고 mmap()으로 매핑된 영역에 해당

3. 각 메모리 섹션의 특징 및 관리 방법

  • 텍스트 영역 (Text Section) :
    • 파일의 일부로 존재
    • 실행 파일의 코드가 포함된 영역,실행 중 파일에서 읽어 메모리에 로드됨
  • 데이터 영역 (Data Section) :
    • 파일의 일부로 존재
    • 전역 변수 및 정적 변수가 포함된 영역, 파일에서 읽어와 메모리에 매핑됨
  • BSS 영역 :
    • 메모리 상에서만 존재
    • 초기화되지 않은 전역 변수와 정적 변수가 포함된 영역.
      파일에 포함되지 않고, 메모리 상에서만 관리
  • 스택 (Stack) :
    • 메모리 상에서만 존재
    • 실행 중에 동적으로 확장되는 메모리로, 페이지 폴트 시 새로운 페이지 할당
  • 힙 (Heap) :
    • 메모리 상에서만 존재
    • 동적 메모리 할당에 사용, 프로그램 실행 중 동적으로 확장
  • mmap()으로 매핑된 영역 (Memory Mapped File) :
    • 파일의 일부로 존재
    • mmap()으로 매핑된 파일의 내용을 가상 메모리에 매핑하여,
      입출력 없이 메모리에서 바로 읽고 씀.
      페이지 폴트 시, 파일에서 해당 페이지를 읽어와 메모리에 로드

 

 

page_fault 함수 수정하는 단계별 가이드

페이지 폴트 발생 이유 :

1. 메모리 참조가 유효하지 않음 : 가상 주소가 올바른 사용자 주소 공간에 있지 않거나, 커널 영역에 대한 비정상적인 접근

2. 페이지 미존재 : 가상 메모리 주소에 해당하는 물리 페이지가 메모리에 존재하지 않는 경우

3. 잘못된 권한 : 읽기 전용 페이지에 쓰기 시도, 커널 주소에 사용자 모드로 접근할 때 발생

 

수정 방안

1. 메모리 참조 유효성 검사

  • 가상 주소가 유효한 사용자 영역에 있는지 확인
  • 커널 영역에 접근하려는 시도가 아닌지 확인
  • 권한 오류(읽기 전용 페이지에 쓰기 시도)가 아닌지 검사

2. 페이지 소스 확인

  • 페이지가 파일에서 읽어와야 하는지, 스왑 영역에서 불러와야 하는지, all_zero 페이지 인지 결정

3. 페이지 프레임 할당

  • 새로운 페이지 프레임을 할당

4. 디스크에서 데이터 로드

  • 해당 페이지가 파일이나 스왑에서 오는 경우, 데이터를 디스크에서 페이지 프레임으로 가져옴

5. 페이지 테이블 업데이트

  • 새로운 페이지 프레임을 가상 메모리 주소에 매핑하고, 페이지 테이블을 업데이트

6. 잘못된 접근일 경우 프로세스 종료

  • 유효하지 않은 사용자 주소나 권한 문제가 있을 경우, 프로세스를 종료

 

 

 

 

 

 

 

 

 

 

 

 

 

'C언어 > Pintos' 카테고리의 다른 글

WIL  (0) 2024.10.01
Understanding Threads  (0) 2024.09.25
Synchronization  (0) 2024.09.25
개요  (0) 2024.09.25