티스토리 뷰
sparse init P.269
pageblock_order가 큰 경우, 같은 타입의 페이지를 더 큰 블록 단위로 한꺼번에 할당하고, 이들을 물리 메모리에서 연속적인 공간에 몰아두려는 의도입니다. 이렇게 함으로써 여러 가지 이점이 있습니다.
// 각 SECTION 수마다 만드네.
size = sizeof(unsigned long *) * NR_MEM_SECTIONS;
usemap_map = memblock_virt_alloc(size, 0);
// section->section_mem_map 은 속성을 플래그로 가지고 있다.
#define SECTION_MARKED_PRESENT (1UL<<0)
#define SECTION_HAS_MEM_MAP (1UL<<1)
#define SECTION_MAP_LAST_BIT (1UL<<2)
#define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1))
#define SECTION_NID_SHIFT 2
section->section_mem_map & SECTION_MARKED_PRESENT
section->section_mem_map & SECTION_HAS_MEM_MAP
nid = section->section_mem_map >> SECTION_NID_SHIFT
하나의 section 에서 usemap 에 대한 배열을 만들어두고, 각 페이지가 사용. usemap 은 block flag 로 사용중인걸로 보임
//섹션 수 * pageblock bit
#define SECTION_BLOCKFLAGS_BITS \
((1UL << (PFN_SECTION_SHIFT - pageblock_order)) * NR_PAGEBLOCK_BITS)
unsigned long usemap_size(void)
{
unsigned long size_bytes;
size_bytes = roundup(SECTION_BLOCKFLAGS_BITS, 8) / 8;
size_bytes = roundup(size_bytes, sizeof(unsigned long));
return size_bytes;
}
섹션은 페이지를 관리하는게 아니라, 페이지 블록을 관리하는 것으로 보임. 그래서 page_order 를 미리 설정하는 것 같다!
usemap은 페이지블럭단위로 mobility를 관리하는 것이고,
mem_map은 struct page 구조체의 배열입니다.
물리 메모리가 중간중간 hole이 있는데 그거 상관없이 struct page 구조체의 배열을 만들면
배열 중간에 사용되지 않는 page 구조체가 많아집니다.
그래서 물리 메모리를 1G섹션으로 나누고 각 섹션마다 struct page 배열을 따로
만들어줘서 낭비되는 메모리가 없도록하는게 sparsemem의 대략적인 취지입니다.
핫플러그 메모리등을 사용하는 가상 머신의 물리 메모리를 추가해주면 그만큼
page 배열도 새로 생성해줘야되고 하다보니 이렇게 동적으로 page 배열을 관리할 수 있게됩니다.
아주 초기 커널 버전에서는 그냥 물리 페이지 갯수만큼 배열을 만들어썼는데,
그렇게되면 연속되지 않은 물리 메모리를 사용할때나 핫플러그메모리등을 사용할 때 낭비가
심해지니까 이렇게 발전했습니다.
수신자 모두 5:34 PM
페이지관리 -> 존관리->노드관리 순서대로 보고나면,
메모리 할당할때 노드선택->존선택->페이지선택 순서대로 할당하게되니까,
그래서 관련 코드를 소개하는것 같습니다.
섹션당 use_map 을 가지고 있는데, NUMA 노드의 pgblock 을 관리하는 것과 같은 섹션이라면, 큰 문제 없고 그렇지 않고 다른 섹션에 할당됐다면 반드시 해당 노드가 변경된 후에 usemap 이 지워져야 합니다.
// sparse 메모리에 페이지를 등록할때는 Present 상태를 지우고, HAS_MEM_MAP 이 됨.
ms->section_mem_map &= ~SECTION_MAP_MASK;
ms->section_mem_map |= sparse_encode_mem_map(mem_map, pnum) |
SECTION_HAS_MEM_MAP;
mem_map 은 페이지 속성 및 관리 정보를 표현하는 페이지 디스크립터 배열이다. vmemmap 영역을 사용하면 pfn, page 간 변환속도가 빨라질수 있음 P213
'개발 > 코드로 알아보는 ARM 리눅스 커널 TIL' 카테고리의 다른 글
20240921 4.3.3 vmemmap 을 사용하는 sparse 메모리 모델 (p277) (1) | 2024.11.16 |
---|---|
20240907 4.2.2 메모리 맵 (p249) & 4.3 존 (p.254) (0) | 2024.11.16 |
20240817 페이징과 매핑 (p200) & memblock(p221) (0) | 2024.11.16 |
20240627 - ARMv8아키텍처 (p34) (0) | 2024.11.09 |
20240622 - AArch64 익셉션 핸들링 (0) | 2024.11.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- chrome-extension
- 영상 픽셀화 하기
- boost
- cockroach db
- shared_from_this
- Quest2
- RVO
- vrpit
- 에러 위치 찾기
- hole-punching
- Golang
- 코어 남기기
- red underline
- mysql
- Reciprocal n-body Collision Avoidance
- 클래스 맴버 변수 출력하기
- 잘못된 빨간줄
- ad skip
- 카카오
- SuffixArray
- vr핏
- Visual Studio
- 면접
- C++
- Obstacle Avoidance
- 봄날에 스케치
- print shared_ptr class member variable
- set value
- 우리는 vr핏이라고 부릅니다
- it's called a vrpit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함