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 |