OS별 페이지 테이블 엔트리(PTE) 개수의 차이
- Page Table의 크기 : page단위로 할당되고 pintos에서는 page의 크기를 4KB로 하고 있기 때문에 4KB(2¹²Byte)다.
- Page Table Entry의 크기 : 포인터의 크기를 가지기 때문에 각 운영체제 별로 다르다.
- 32bit OS에서의 포인터 크기 : 4byte(2²)
- 64bit OS에서의 포인터 크기 : 8byte(2³)
- PTE에 들어갈 수 있는 PTE의 개수는 N
- Page Table의 크기를 Page Table Entry의 크기로 나눈 값
- N = sizeof(PT)/sizeof(PTE)
- 따라서 OS별로 PT에 들어가는 PTE의 개수는 다음과 같다.
- 32bit는 2¹²/2² = 1024개
- 64bit는 2¹²/2³ = 512개
데이터와 물리, 가상 주소
데이터는 물리 메모리에 존재하고 그곳을 가리키는 주소는 단 하나의 물리주소와 여러개의 가상주소들을 가질 수 있다.
KERN_BASE & USER_STACK의 용량 계산

- 위 그림에서 확인 할 수 있듯이 가장 상위에 값이 1인 bit 다음에 만나게 되는 값이 1인 bit는 값이 무시할 수 있을 정도로 작다.
- VM은 주소당 1byte의 cell로 구성되기 때문에, 특정 주소 아래에 위치한 영역의 크기는 주소*Byte다.
- Pintos에서 VM의 va(유저영역)은 KERN_BASE 아래 영역이며 그 위의 영역은 kva(커널영역)이다. 유저 스택은 USER_STACK 아래 영역이다.(실제로는 점점 내려오다가 heap에서 멈추지만 일단 USER_STACK아래로 가정하자 )
- kva - 커널영역의 크기 : 256TB - 512GB
- va - 유저영역의 크기 : 512GB
- 유저스택의 크기 : 1GB
Swap File(Area)
- vm를 위한 공간은 disk에 있고, disk는 data를 file의 형태로 저장하기 때문에 Swap "File" 이라고 한며 Swap Area라고도 한다.
- 페이징 기법은 프로그램을 페이지 크기로 자른다. 그리고 당장 필요한 최소한의 페이지들만 Frame으로 올리고, 나머지 페이지들은 Swap File에 저장한다.



Page Table의 위치
- 메모리 사용을 효율적으로 하기 위해 paging기법을 만들었다. 그런데 paging기법에서 사용하는 page table은 각 프로세스 별로 페이지 테이블이 필요하며, 또한 그 크기는
- (해당 프로세스를 사용하는 page 개수) * ( 포인터 크기 + valid와 같은 추가 데이터 공간 )이다.
- 근데 이걸 disk에 넣을거면 애초에 그냥 disk를 읽으면 되는거고, cpu에는 공간 크기상 불가능하다. 즉, 메모리에 넣어야 한다.
- 그래서 shared page, multi level page table등을 사용한다.
Context switching을 하면서 vm은 어떻게 바뀌는지?
- pml4가 thread 마다 다른 값을 가지고 있는데, context switching 할때마다 pml4_activate()함수를 사용해서 각 process의 pml4를 활성화 시킨다. 그래서 같은 va를 넣어도 다른 pa를 받을 수 있다. 즉, vm을 갈아끼울 수 있다는 것이다.
Process 별로 pml4 table을 만드는데 base_pml4를 복사하는 과정이 포함된 이유
- 모든 process들은 kernel관련 코드와 데이터들은 돌일한 것을 공유한다. 그런데 kernel 관련 table을 따로 만들기에는 메모리가 아깝다. 그래서 커널 연관된 pte를 index 1에 저장한 table인 base_pml4를 복사해, 커널 괄련 table을 따로 만들지 말고 pml4 table 하나만 사용하도록 했다.
- 이렇게 해서 process 당 pml4 table은 하나만 만들면 된다.
'SW 정글 일지' 카테고리의 다른 글
정글 개발일지 week10 핀토스의 마무리 (0) | 2024.05.28 |
---|---|
정글 개발일지 week08 (0) | 2024.05.14 |
정글 개발일지 week07 (0) | 2024.05.02 |
정글 개발일지 week02 (0) | 2024.03.31 |
정글 에세이 : 과거와 앞으로의 정글 (1) | 2024.03.16 |
OS별 페이지 테이블 엔트리(PTE) 개수의 차이
- Page Table의 크기 : page단위로 할당되고 pintos에서는 page의 크기를 4KB로 하고 있기 때문에 4KB(2¹²Byte)다.
- Page Table Entry의 크기 : 포인터의 크기를 가지기 때문에 각 운영체제 별로 다르다.
- 32bit OS에서의 포인터 크기 : 4byte(2²)
- 64bit OS에서의 포인터 크기 : 8byte(2³)
- PTE에 들어갈 수 있는 PTE의 개수는 N
- Page Table의 크기를 Page Table Entry의 크기로 나눈 값
- N = sizeof(PT)/sizeof(PTE)
- 따라서 OS별로 PT에 들어가는 PTE의 개수는 다음과 같다.
- 32bit는 2¹²/2² = 1024개
- 64bit는 2¹²/2³ = 512개
데이터와 물리, 가상 주소
데이터는 물리 메모리에 존재하고 그곳을 가리키는 주소는 단 하나의 물리주소와 여러개의 가상주소들을 가질 수 있다.
KERN_BASE & USER_STACK의 용량 계산

- 위 그림에서 확인 할 수 있듯이 가장 상위에 값이 1인 bit 다음에 만나게 되는 값이 1인 bit는 값이 무시할 수 있을 정도로 작다.
- VM은 주소당 1byte의 cell로 구성되기 때문에, 특정 주소 아래에 위치한 영역의 크기는 주소*Byte다.
- Pintos에서 VM의 va(유저영역)은 KERN_BASE 아래 영역이며 그 위의 영역은 kva(커널영역)이다. 유저 스택은 USER_STACK 아래 영역이다.(실제로는 점점 내려오다가 heap에서 멈추지만 일단 USER_STACK아래로 가정하자 )
- kva - 커널영역의 크기 : 256TB - 512GB
- va - 유저영역의 크기 : 512GB
- 유저스택의 크기 : 1GB
Swap File(Area)
- vm를 위한 공간은 disk에 있고, disk는 data를 file의 형태로 저장하기 때문에 Swap "File" 이라고 한며 Swap Area라고도 한다.
- 페이징 기법은 프로그램을 페이지 크기로 자른다. 그리고 당장 필요한 최소한의 페이지들만 Frame으로 올리고, 나머지 페이지들은 Swap File에 저장한다.



Page Table의 위치
- 메모리 사용을 효율적으로 하기 위해 paging기법을 만들었다. 그런데 paging기법에서 사용하는 page table은 각 프로세스 별로 페이지 테이블이 필요하며, 또한 그 크기는
- (해당 프로세스를 사용하는 page 개수) * ( 포인터 크기 + valid와 같은 추가 데이터 공간 )이다.
- 근데 이걸 disk에 넣을거면 애초에 그냥 disk를 읽으면 되는거고, cpu에는 공간 크기상 불가능하다. 즉, 메모리에 넣어야 한다.
- 그래서 shared page, multi level page table등을 사용한다.
Context switching을 하면서 vm은 어떻게 바뀌는지?
- pml4가 thread 마다 다른 값을 가지고 있는데, context switching 할때마다 pml4_activate()함수를 사용해서 각 process의 pml4를 활성화 시킨다. 그래서 같은 va를 넣어도 다른 pa를 받을 수 있다. 즉, vm을 갈아끼울 수 있다는 것이다.
Process 별로 pml4 table을 만드는데 base_pml4를 복사하는 과정이 포함된 이유
- 모든 process들은 kernel관련 코드와 데이터들은 돌일한 것을 공유한다. 그런데 kernel 관련 table을 따로 만들기에는 메모리가 아깝다. 그래서 커널 연관된 pte를 index 1에 저장한 table인 base_pml4를 복사해, 커널 괄련 table을 따로 만들지 말고 pml4 table 하나만 사용하도록 했다.
- 이렇게 해서 process 당 pml4 table은 하나만 만들면 된다.
'SW 정글 일지' 카테고리의 다른 글
정글 개발일지 week10 핀토스의 마무리 (0) | 2024.05.28 |
---|---|
정글 개발일지 week08 (0) | 2024.05.14 |
정글 개발일지 week07 (0) | 2024.05.02 |
정글 개발일지 week02 (0) | 2024.03.31 |
정글 에세이 : 과거와 앞으로의 정글 (1) | 2024.03.16 |