티스토리 뷰

memblock 이랑 vmemmap 을 까먹었다

memblock ->부팅 초기에 사용, vmemmap -> 가상 메모리 맵

이제 page 별로 어떤 zone 이랑 노드에 들어가는지 알기 때문에, 이 페이지에 정보를 설정해줌 __init_single_page
노드, 존, 참조카운트, 테이블 매핑 카운트, 마지막 접근 cpu pid 등을 기록

update_defer_init
 - 저주소인경우에는 지연시킬 수없음
 - if (zone_end < pgdat_end_pfn(pgdat)) return true; -> spanned count 가 movable 포함안시키니깐.
 - 섹션에 대해서 처리
- (pfn & (PAGES_PER_SECTION - 1)) == 0) {

버디 시스템
- order 는 2의 배수, 페이지는 2^(order - 1) 개씩 관리
- 자주 사용되는 페이지는 리스트의 선두쪽에 있고 (hot), 그렇지 않은 경우 후미에 있어 (cold) 많이 사용되지 않는 페이지는 order 를 높여 다음 order 로 갈 수 있다.

page block order -> 페이지 블록이 관리하는 페이지수 2^page_block_order = pages per block 
 - 버디의 order 와 별개


CONFIG_SPARSEMEM_VMEMMAP 가 아닌 경우에만 사용하는 이유는, 페이지 구조체를 이미 연속된 공간에 할당했기 때문인가?

 

void __init mem_init(void)
{
swiotlb_init(1);

set_max_mapnr(pfn_to_page(max_pfn) - mem_map);

#ifndef CONFIG_SPARSEMEM_VMEMMAP
free_unused_memmap();
#endif
/* this will put all unused low memory onto the freelists */
free_all_bootmem();



memmap 을 완전 까먹었었다. memblock 이랑 다른거임

memmap
flat 메모리 시절에는 페이지의 속성 정보를 알기위해서 struct page[] 를 하나만 관리하면 됐음
그래서 memmap 이 하나뿐이었음
근대 sparse 메모리를 하려니까, 사용하는 공간만 섹션 단위로 page 정보를 관리하게되서 memmap 이 됨
이걸 vmemmap 에다 저장하는 SPARSE_VMEMMAP 도 있음.

근데 이게 섹션단위이다보니까 안쓰는 페이지에 대한 page 구조체도 저장중이었는데, 이걸 버디시스템 초기화 하기전에 지웠음.

memblock 은 메모리에서 어떤 영역을 사용할지 미리 FDT 를 읽어두고 저장해둔거임.

free 시킨다 -> 버디시스템으로 회수한다와 똑같은 말이구나
첨 할당을 버디시스템에서 안해서 그런듯

 

spin_lock_irqsave(&zone->lock, flags); // 인터럽트를 비활성화 하고 락, flags 에 현재 인터럽트 상태를 flags 에 저장
local_irq_restore(flags);                         // 인터럽트 상태 복원

 

댓글