pkmap과 fixmap을 사용한 매핑을 하기 위해 각각의 PTE 테이블을 할당 받아 초기화한다.
kmap_init()
arch/arm/mm/mmu.c
static void __init kmap_init(void) { #ifdef CONFIG_HIGHMEM pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE), PKMAP_BASE, _PAGE_KERNEL_TABLE); #endif early_pte_alloc(pmd_off_k(FIXADDR_START), FIXADDR_START, _PAGE_KERNEL_TABLE); }
- pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE), PKMAP_BASE, _PAGE_KERNEL_TABLE);
- CONFIG_HIGHMEM 커널 옵션을 사용할 수 있으면 pkmap 사용을 위해 pkmap_page_table 전역 변수에 pkmap 시작 주소에 해당하는 pmd 엔트리 주소를 알아온다.
- 만일 pmd 엔트리 값이 없는 경우 pte 테이블을 할당 받는다.
- _PAGE_KERNEL_TABLE
- (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL))
- PKMAP_BASE(PAGE_OFFSET-2M)
- CONFIG_HIGHMEM 커널 옵션을 사용할 수 있으면 pkmap 사용을 위해 pkmap_page_table 전역 변수에 pkmap 시작 주소에 해당하는 pmd 엔트리 주소를 알아온다.
- early_pte_alloc(pmd_off_k(FIXADDR_START), FIXADDR_START, _PAGE_KERNEL_TABLE);
- fixmap 사용을 위해 pte 테이블을 준비한다.
- FIXADDR_START(0xffc0_0000)
- fixmap 사용을 위해 pte 테이블을 준비한다.
pkmap용 L2 테이블이 없는 경우 할당 받아 초기화 한다. pkmap_page_table은 pkmap용 L2테이블을 가리킨다.
fixmap용 L2 테이블이 없는 경우 할당 받아 초기화한다.
참고
- Fixmap | 문c
- Kmap(Pkmap) | 문c
- 페이지 테이블 매핑(create_mapping()) | 문c