kmap_init()

pkmap과 fixmap을 사용한 매핑을 하기 위해 각각의 PTE 테이블을 할당 받아 초기화한다.

kmap_init-1

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)
  •   early_pte_alloc(pmd_off_k(FIXADDR_START), FIXADDR_START, _PAGE_KERNEL_TABLE);
    • fixmap 사용을 위해 pte 테이블을 준비한다.
      • FIXADDR_START(0xffc0_0000)

pkmap용 L2 테이블이 없는 경우 할당 받아 초기화 한다. pkmap_page_table은 pkmap용 L2테이블을 가리킨다.

kmap_init-2

fixmap용 L2 테이블이 없는 경우 할당 받아 초기화한다.

kmap_init-3

 

참고

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다