티스토리 뷰

3.4 I/O 메모리 매핑

 

paging init 이 되기전에 io mapping 이 되야 하는 경우?

ACPI 테이블, EFI 테이블, 일부 디바이스 에 접근해서 설정 정보를 가져와야 하는 경우
early ioremap : early IO 매핑하기
IO mapping 전 먼저 처리 위해 fixmap 영역을 사용하는 early io mapping -> FIX_PAGE_IO

early memremap: early 메모리 매핑하기
IO 가 아닌 normal 메모리인데, fixmap 영역을 사용 -> FIX_PAGE_NORMAL

 

4.1 early 메모리 할당자: memblock

 

커널의 메모리 할당

- memblock: 메인 메모리 할당자가 초기화 되기 전 사용
- 페이지 할당자 : 페이지 단위 할당
- 메모리 모델과 존의 개념, per-cpu 변수를 위한 per-cpu 할당자

memblock

메모리 범위를 등록하여 사용. 주로 부팅 타임에 사용

memory, reserved, physmem 을 사용하며, physmem 은 일부 메모리에서 사용
- memory : 앞으로 사용할 공간 . 디바이스 트리를 읽어서 사용할 메모리를 memblock_add 를 통해 등록한다
- reserved : 앞으로 사용할 공간 혹은 사용중인 공간

memblock -> memblock_type -> memblock_region

ex)
|------------memory0-----------|------------memory1-----------|
-----|--res1--|-----|--res2--|---------------------------------------|

 


memblock.type.reserved


- 부트업 타임에 엔트리를 등록합니다. (커널 영역, initred 영역, 페이지 테이블 영역, DTB 영역, CMA-DMA 영억) -> 영역이 뭔지는 아직 잘
- arm64 는 커널 가상 주소의 절반을 사용

linear_region_size = -(s64)PAGE_OFFSET
BUILD_BUG_ON(linear_region_size != BIT(VA_BITS - 1));

 * PAGE_OFFSET - the virtual address of the start of the kernel image (top
 *  (VA_BITS - 1))
#define PAGE_OFFSET (UL(0xffffffffffffffff) << (VA_BITS - 1))

#define BIT(nr) (1UL << (nr))



arm64_memblock_init 1:1 영역에서 사용할수 있는 memblock 만 걸러 냈음.

arm64/kernel/vmlinux.lds.S 의 segment 를 보면 text ~ bss, swapper, idmap 을 포함하는 가상 공간을 memblock 에 할당

memblock 의 함수


1. memblock_add: 메모리 블록을 memblock에 추가합니다.
2. memblock_reserve: 메모리 블록을 예약하여 이후의 할당에서 사용되지 않도록 합니다.
3. memblock_alloc: 요청된 크기와 정렬에 맞는 메모리 블록을 memblock에서 할당합니다.

memblock 을 추가할때, 처음에는 data 영역등에 있다가, 결국 2배로 늘릴때 다시 memblock 에서 할당받거나 슬랩이 활성화 됐다면 슬랩으로 처리한다.

memblock_find_in_range 이건 memory 영역에 속하고 reserve 에 없는 곳을 뱉고, 여기서 준 addr 을 기준으로 reserved 를 추가한다

memblock 에 reserved 영역을 추가하는 공간이 두배로 늘리는 곳에 사용한 reserve 영역과 겹칠수 있음. 그냥 병합되는것으로 보임

 

memblock_remove -> memory 삭제, memblock_free -> reserve 삭제

memblock_isolate_range 에서 뒤쪽으로 자를 경우 Idx-- 를 하기때문에 다시 똑같은 region 도는것을 생각해야함

여기까지 memblock 으로 메모리 모델을 사용하기 전이 었음.

이제 메모리 모델 (FLATEN, DISCONTIG, SPARSE) 를 사용할거임

핫플러깅 -> 전원이 켜진상태에서 ON/OF가 가능

메모리 단편화 : 메모리가 할당되고 해제되는 과정에서 메모리 공간이 비효율적으로 분할되어 사용 가능한 연속적인 큰 메모리 블록을 찾기 어려워지는 현상

NUMA 시스템의 노드당으로 관리 할 수 있고, Movalble 은 페이지를 옮길수 있기 때문에 단편화를 막을 수 있다. 할당을 못하는 경우 옮길 수 있기 때문

1:1 로 매핑 영역에서 memblock 의 정보를 설정하고, 이 정보로 Zone 을 초기화

pfn_to_section_nr -> nr = page 가 속한 section number

sparse, dynamic 쓰면 2단계 테이블 씀.
usemap_map 으로 사용 여부, mem_map 으로 페이지 #p.264

댓글