티스토리 뷰
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
'개발 > 코드로 알아보는 ARM 리눅스 커널 TIL' 카테고리의 다른 글
20240907 4.2.2 메모리 맵 (p249) & 4.3 존 (p.254) (0) | 2024.11.16 |
---|---|
20240831 - sparse init (p269) (0) | 2024.11.16 |
20240627 - ARMv8아키텍처 (p34) (0) | 2024.11.09 |
20240622 - AArch64 익셉션 핸들링 (0) | 2024.11.09 |
코드로 알아보는 ARM 리눅스 커널 TIL 카테고리 추가 (0) | 2024.11.09 |
- Total
- Today
- Yesterday
- vrpit
- 봄날에 스케치
- mysql
- RVO
- chrome-extension
- 코어 남기기
- vr핏
- Obstacle Avoidance
- 우리는 vr핏이라고 부릅니다
- Golang
- print shared_ptr class member variable
- it's called a vrpit
- Visual Studio
- 클래스 맴버 변수 출력하기
- set value
- Reciprocal n-body Collision Avoidance
- SuffixArray
- 잘못된 빨간줄
- hole-punching
- boost
- 영상 픽셀화 하기
- C++
- 면접
- ad skip
- Quest2
- 카카오
- shared_from_this
- cockroach db
- 에러 위치 찾기
- red underline
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |