본문 바로가기

Linux/ARM64

early_ioremap_init(void)

early I/O 매핑을 위해 fixmap 영역에 0~6개의 256k 의 가상 주소 영역을 매핑한다.

 

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
32
33
34
35
36
37
38
__attribute__((optimize("-O0"))) void __init early_ioremap_setup(void)
{
    int i;
    u64 dbg_x1,dbg_x2,dbg_x3;
 
    for (i = 0; i < FIX_BTMAPS_SLOTS; i++)        // FIX_BITMAPS_SLOTS = 7 (0~6)
        if (WARN_ON(prev_map[i]))                 // prev_map[0~6]에 데이터가 있는 경우 경고 출력
            break;
 
 
        dbg_x1 = FIX_BTMAP_BEGIN;                 // 0x5c6
        dbg_x1 = FIX_BTMAP_END;                   // 0x407
        dbg_x1 = TOTAL_FIX_BTMAPS;                // 0x1c0
        dbg_x1 = FIXADDR_TOP;                     // 0xffff7dfffec00000
        dbg_x1 =  PAGE_SHIFT;                     // 0xc
        
    for (i = 0; i < FIX_BTMAPS_SLOTS; i++)        // SLOT 수만큼 돌며 slot_virt 배열에 fixmap의 BTMAP 가상 주소를 설정한다.
        {
            dbg_x2 = NR_FIX_BTMAPS*i;
            dbg_x3 = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i; 
            slot_virt[i] = __fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i);
        }    
         /*   __fix_to_virt = (FIXADDR_TOP - ((x) << PAGE_SHIFT))  
        *   __fix_to_virt = (0xffff7dfffec00000-( x << 12 ))
        *   __fix_to_virt[0] = 0xffff7dfffec00000 - (5c6 << 12) = 0xffff7dfffe63a000
        *   __fix_to_virt[1] = 0xffff7dfffec00000 - (586 << 12) = 0xffff7dfffe67a000
        *   __fix_to_virt[2] = 0xffff7dfffec00000 - (546 << 12) = 0xffff7dfffe6ba000
        *   __fix_to_virt[3] = 0xffff7dfffec00000 - (506 << 12) = 0xffff7dfffe6fa000
        *   __fix_to_virt[4] = 0xffff7dfffec00000 - (4c6 << 12) = 0xffff7dfffe73a000
        *   __fix_to_virt[5] = 0xffff7dfffec00000 - (486 << 12) = 0xffff7dfffe77a000
        *   __fix_to_virt[6] = 0xffff7dfffec00000 - (446 << 12) = 0xffff7dfffe7ba000
        * 
        */
        
       
     
 
}
cs

 

즉 FIXMAP 주소공간에 0~6까지의 SLOT이 생겼다 

 

소스 코드에서 __fix_to_virt 함수를 좀더 들여다 보면 FIXADDR_TOP을 기준으로 FIX_BTMAP_BEGIN을 빼서 나온 값을 시작 주소로 하여 SLOT을 할당한다.

 

실제 할당 후 주소 및 크기는 아래 그림과 같다.

 

참고: https://kjt9109.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F

'Linux > ARM64' 카테고리의 다른 글

arch_local_irq_disable()  (0) 2019.12.27
boot_cpu_init()  (0) 2019.12.27
smp_setup_processor_id()  (0) 2019.12.27
early_fixmap_init(void)  (0) 2019.12.22