iamroot 17기 스터디를 다행히 아직 참여하고 있다. 요새 진도 내용을 잘 못 따라가고 있기도 하고, 이전 스터디에 대한 복습이 필요한 것 같아, 내용을 정리하려 한다.
이전보다는 리눅스 커널 소스도 직접 읽어보고, 추가적으로 공부한 지식이 있으니, 당시 있던 의문에 더 정확한 결론을 내릴 수 있을 것 같다.
스터디 초기에는 커널의 내부 구성, 역할 등에 대한 이론을 이해하기 위해 리눅스 커널 내부 구조를 참고해 이론 스터디를 진행했다.
2주차 진도는 Chapter.4 (p96 ~ p127)이었다.
Chapter.4 메모리 관리
Q. 가상주소보다 물리주소공간이 더 큰 경우 어떻게 해결하는가? (p96)
가상 메모리 개념을 도입해서 얻는 효과에는 어떤 것이 있을까?
- 물리 메모리의 크기가 일정하지 않아도 (실행하려는 프로그램의 메모리 크기보다 작아도) 호환 가능하다.
- 여러 프로그램을 동시에 구동하는 데 있어 다른 프로그램의 메모리 주소 영역을 고민하지 않아도 된다.
이 중 기술 발달에 의해 가상 메모리의 크기보다 물리 메모리보다 큰 경우가 일반화 될 수 있는 세상이 왔다. (32-bit 기준 2^32인 4GB 이상의 RAM을 쉽게 구매할 수 있다.)
이런 경우 PAE(Physical Address Extension) 기술을 사용하여 물리 주소 접근을 위한 주소 공간의 크기를 늘린다. 좀 더 쉬운 설명은 여기를 참고하면 좋을 것 같다.
PAE 기술을 대략 요약하자면 다음과 같다.
- 원래 접근 가능한 물리 주소의 범위는 2^32인데, 이를 늘린다. (32bit -> 36bit)
- Page frame의 크기가 4KB(2^12)일때, Page directory / Page table은 4 bytes(2^2) 크기 entry를 1024(2^10)개 가리킬 수 있었다.
- Page directory / Page table의 entry를 8 bytes(2^3) 크기 entry를 512(2^9)개 가리키게 변경한다.
- 기존에는 Page directory (2^10) + Page table (2^10) 방식의 2단계 paging으로 2^32 주소 공간의 Page frame을 가리킨다.
- PAE 적용시 Page directory pointer (2^2) + Page directory (2^9) + Page table (2^10) 방식의 3단계 paging으로 2^36(2^64로 표현됨) 주소 공간의 Page frame을 가리킨다.
여기서 물리 주소 공간의 크기가 늘어나는 핵심은 paging level이 증가해서가 아니라, 가리키는 Page frame의 주소 공간이 커졌기 때문이다.
NUMA에서의 메모리 뱅크 접근 방식 변경 (p97)
책에서 기록된 커널 버전까지는 메모리 모델 중 FLATMEM
, DISCONTIGMEM
만을 다루고 있다. 최근에는 SPARSEMEM
메모리 모델이 사용된다. 자세한 설명은 문c블로그 글을 참고하자.
Q. watermark와 vm_stat은 무엇인가? (p100)
- watermark: 메모리 할당 상태를 알려주는 지표
- vm_stat: 현재 zone의 통계 값을 기록 (다양한 정보를 기록)
watermark는 현재 가상메모리가 얼마나 할당되었는지를 간략하게 나타내서, 페이지 프레임 회수가 얼마나 급한지 결정하게 한다.
vm_stat은 watermark의 상태 기준, 어떤 페이지 프레임을 회수할 지 결정하기 위한 통계 값을 기록하는 것으로 보인다.
좀 더 자세한 정보는 여기를 참고하자.
Q. Lazy Buddy에서 비트맵 대신 nr_free로 계산은 어떻게 진행하는 것인가? (p108)
현재 명확한 답을 찾지 못함, 커널 코드 리딩 시 확인 가능할 듯.
Buddy의 free_area 계산 타이밍은 앞에서 설명한 watermark에 따라 페이지 프레임 회수가 필요함을 판단하고 계산을 시작하는 것으로 예상된다.
Q. 커널 주소공간이 가상 주소와 물리주소가 1:1 매핑되어있다는 것이 무슨 뜻인가? (p124)
32-bit의 경우, (가상주소-3GiB) == 물리주소라고 하는데, 그렇다면 32-bit system은 물리 메모리가 무조건 1GiB 이상 있어야 한다는 것인가? (ZONE_HIGHMEM 을 제외하더라도 896MiB 이상 필요한 것으로 보임)
개념적으로 헷갈리는데, 커널 자체가 가지는 주소공간을 의미하는것인지, 각 Task의 커널 영역 주소공간을 말하는 것인지? 그리고 각 Task의 커널 영역 주소공간인데, 물리 주소가 같다는 것은 이 영역이 모두 공유가 된다는 것인지?