[커널 20차] 20주차
2023.09.17 16:05
2023.09.16 (20주차) - 약 10명 참여
1) head.S : primary_entry의 dcache_clean_poc 까지 진행
2) create_idmap에서 VA_BITS = 48, Page 크기 4K 이외의 경우 확인
< dcache_clean_poc >
dcache_clean_poc dcache_by_line_op cvac, sy, x0, x1, x2, x3 dcache_line_size dcache_by_myline_op cvac, sy, x0, x1, x2, x3 __dcache_op_workaround_clean_cache cvac, x0 alternative_if_not ARM_64_WORKAROUND_CLEAN_CACHE dc cvac, x0 alternative_else dc civac, x0 alternative _endif .endm |
ALTERNATIVE() 매크로
위치 : arch/arm64/include/asm/alternative-macros.h
관련 설명 :
- http://jake.dothome.co.kr/alternative/
- https://blog.csdn.net/Rong_Toa/article/details/124636910
< create_idmap >
1) 페이지 레벨을 만드는 코드 분석
#define ARM64_HW_PGTABLE_LEVELS(va_bits) (((va_bits) - 4) / (PAGE_SHIFT - 3))
-
PAGE_SHIFT - 3을 하는 이유는, VA_BITS에 맞게 page table entries를 구하기 위함.
-
그리고 페이지 테이블이 가지고 있는 각 엔트리는 주소이기 때문에, 8Byte이다.
-
만약 VA_BITS가 48이고, Page 크기가 4K인 경우,
-
48 - 12 = 36 (VA에서 Offset을 제외한 페이지 테이블 영역)
-
12 - 3 = 9 (각 페이지 테이블 엔트리의 개수 - 승수로 표현된다)
-
36 / 9 = 4 (페이지 테이블의 영역을 페이지 테이블 엔트리 개수로 나눔)
-
= 따라서, Page Table의 레벨이 4임을 알 수 있다.
위 매크로는 페이지 크기(PAGE_SHIFT)와 가상주소 크기(VA_BITS)를 바탕으로, 해당 가상 주소에서 몇 단계의 페이지 테이블이 만들어지는지 알려주는 역할을 한다.
만약 페이지 테이블 영역이 엔트리 개수로 바로 나누어 떨어지지 않는다면, ROUND UP 하여 상위 페이지 테이블 영역을 하나 더 생성한다.
2) 블럭 매핑
커널의 이미지가 2M align 되어있기 때문에, 페이지 크기가 4K 인 경우에는 블럭 매핑을 할 수 있다. 이에 관련된 코드는 SWAPPER_BLOCK_SIZE 이다.
/* Initial memory map size */ #ifdef CONFIG_ARM64_4K_PAGES #define SWAPPER_BLOCK_SHIFT PMD_SHIFT #define SWAPPER_BLOCK_SIZE PMD_SIZE #define SWAPPER_TABLE_SHIFT PUD_SHIFT #else #define SWAPPER_BLOCK_SHIFT PAGE_SHIFT #define SWAPPER_BLOCK_SIZE PAGE_SIZE #define SWAPPER_TABLE_SHIFT PMD_SHIFT #endif |
4K 페이지인 경우 SWAPPER_BLOCK_SIZE는 PMD_SIZE 이다. 이와 다르게 4K가 아닌 경우에는 PAGE_SIZE 이다.
(1) 블럭 매핑을 한 경우
(2) 블럭 매핑을 하지 않은 경우
3) 가상 주소로 표현할 수 있는 범위보다 물리 주소가 더 큰 경우
(1) VA_BITS < 48
추가 페이지 테이블을 구성한다.
위와 같이 구성된다. (값은 정확하지 않을 수 있음..)
(2) VA_BITS = 48
추가 페이지 테이블을 구성하지 않고, PGD의 엔트리 수를 늘려서 해결한다.
다시 말하면, VA_BITS가 48인 경우 L1 table은 6비트를 사용해 엔트리 개수는 64개이다. 이 때, VA_BITS가 52인 것처럼 확장해 1024개의 엔트리를 활용한다는 것이다.
4) PA_BITS = 52인 경우의 주소 표현
populate_entries에서 phys_to_pte 매크로를 확인해보면, 다음과 같다.
#ifdef CONFIG_ARM64_PA_BITS_52 /* * We assume \phys is 64K aligned and this is guaranteed by only * supporting this configuration with 64K pages. */ orr \pte, \phys, \phys, lsr #36 and \pte, \pte, #PTE_ADDR_MASK #else mov \pte, \phys #endif .endm |
PTE_ADDR_MASK 값은 0x0000_ffff_ffff_f000이다.
주소의 [51:48] 비트를 [15:12]로 옮긴다고 이해하면 된다.
5) 상위 레벨 페이지 테이블에서 count = 1 인 경우 페이지 테이블 구성 확인
댓글 2
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [공지] 스터디 정리 노트 공간입니다. | woos | 2016.05.14 | 588 |
237 | [커널 20차] 29주차 | brw | 2023.11.27 | 62 |
236 | [커널 20차] 27주차 | brw | 2023.11.21 | 41 |
235 | [커널 20차] 26주차 | brw | 2023.11.21 | 14 |
234 | [커널 20차] 28주차 | 이민찬 | 2023.11.19 | 21 |
233 | [커널 20차] 25주차 | 이민찬 | 2023.10.30 | 92 |
232 | [커널 20차] 24주차 | 이민찬 | 2023.10.22 | 55 |
231 | [커널 20차] 23주차 | 이민찬 | 2023.10.14 | 55 |
230 | [커널 20차] 22주차 | 이민찬 | 2023.10.08 | 49 |
229 | [커널 20차] 21주차 | 이민찬 | 2023.09.23 | 87 |
» | [커널 20차] 20주차 [2] | 이민찬 | 2023.09.17 | 112 |
227 | [커널 20차] 19주차 | 이민찬 | 2023.09.10 | 76 |
226 | [커널 20차] 18주차 | 이민찬 | 2023.09.03 | 63 |
225 | [커널 20차] 17주차 | 이민찬 | 2023.08.27 | 84 |
224 | [커널 20차] 16주차 | 이민찬 | 2023.08.20 | 98 |
223 | [커널 19차] 64 주차 | Min | 2023.08.19 | 50 |
222 | [커널 20차] 15주차 | 이민찬 | 2023.08.13 | 90 |
221 | [커널 19차] 63 주차 | Min | 2023.08.12 | 34 |
220 | [커널 19차] 62 주차 | Min | 2023.08.05 | 59 |
219 | [커널 20차] 13주차 | 이민찬 | 2023.07.30 | 84 |
218 | [커널 19차] 61 주차 | Min | 2023.07.30 | 40 |
.
민찬님, 수고가 많습니다. 같이 스터디하던 구성원 변종현입니다. 제가 모임에서 쫒기다는 기분이 들고 지금 재취업으로 너무 바빠서 중도하차했습니다. 비대면 모임을 계속 이어가긴 힘들어도 여기 과거 기록들을 보고, 추천해주신 책들과 자료들을 바탕으로 커널스터디는 혼자 해 나가보도록 하겠습니다. 앞으로 좋은 결실 맺으시길 바랍니다.