[커널 20차] 32주차

2023.12.16 22:06

brw 조회 수:390

 

지난주차 진행했던 early_fixmap_init() 및 fixmap_remap_fdt() remind 복습 후

arm64/mm/mmu.c -> init_pmd()부터 시작 

 

-set_fixmap()내부에 fixmap_pte()는 가상주소를 pte에 direct로 넣어준다.

ex) Idx = FIX_PMD일 경우 ADDR = 0xfffffbfffdc34000이며 bm_pte[0][52]의 주소를 가져옴

-set_pte()는 FIX_PTE, FIX_P*D의 virtual addr(ptep)을 set_pte()를 통해 bm_p*d(phys)를 매핑한다.BjzX9kpYSzvi7fNnvPnJ7Oi4Q0Uh8TXxPFbsTOmR


 

Set_pte를 통해 pte내의 FIX_Pxx를 넣어줌.

CONT_PTE_SIZE는 연속된 16개의 page size를 뜻함

 

Q. 아래코드에서 __boundary  < end 을 하지않고 -1을 빼서 비교를 하는지 ? 

#define pte_cont_addr_end(addr, end)                                            \                                                                                                                                                        ({      unsigned long __boundary = ((addr) + CONT_PTE_SIZE) & CONT_PTE_MASK;    \                                                                                                                                                        (__boundary - 1 < (end) - 1) ? __boundary : (end);                      \                                                                                                                                                        })   

A. 유추해보기에는 __boundary값이 long 사이즈를 넘어섰을경우를 대비하여 작성된 코드로보이나 확실하진 않음.

granule size |  cont PTE  |  cont PMD  |                                                                                                                                                                                                   -------------+------------+------------+                                                                                                                                                                                                        4 KB    |    64 KB   |   32 MB    |                                                                                                                                                                                                       16 KB    |     2 MB   |    1 GB*   |                                                                                                                                                                                                    64 KB    |     2 MB   |   16 GB*   | 

 

Q. 초반에 FDT를 매핑해줬는데, FIXED_MAP에 이중으로 매핑하는이유는 ? 

lKczh1y6eJAOlSxgqPjed8mHSoZ6x-9NXcYnHphc

vaWdKgulsAKkd5i8TxO6_aDQW4PjwXfucqgTVj_W

A.초반에 매핑한이유는 boot_args 와 같은 필요한 항목을 가져오기위해 매핑했고, fixed map의 매핑한이유는 이제 커널에서 사용하기위해서 매핑하는것으로 보인다.


 

*위내용 정리 이미지(FDT 1page 까지 매핑)

 

5OB51xUxU2fcGFAsT32VzxW42P8pppfwY8ru5vzF

8HXd9OivMREHRRRyCDnqPPc_IDB9nZerYfY0XoH3

- 위 그림에서 FDT를 1 Page 를 맵핑한 이후

FDT의 크기 (약 74038 byte) 를 page크기로 나누면 약 ROUND_UP(18.07)page 만큼 맵핑을 해야한다.

 

* 추가 정리 이미지(FDT 전체 맵핑)

Ta4xZ6kFupnQcTkFk3lL-wJVMOmgJGtBkp5L7RiQ

- 위에서 한개의 bm_pte는 512page까지 표현가능하므로, 512 ~ 528은 다음 pte table에 fdt 영역이 매핑된다. 

cva_tQ0ur7V6fdfNh6IA8iFh1Fm9A7MSRHAYD7IUn5CKJ7QlvEzJtpWyOLX2YmYX1W3xuZqp4k0ERMd2

Q. PE란?

A. https://developer.arm.com/documentation/102404/0201/Common-architecture-terms

코어텍스 종류마다 pe 정의가 다르긴한데 그냥 지금처럼 코어라고 생각하고 진행하는게 좋을것 같습니다.

Cortex-A8 is a single core, single-thread processor. The entire processor is a PE.

Cortex-A53 is a multi-core processor, each core is a single thread. Each core is a PE.

Cortex-A65AE is a multi-core processor, each core has two threads. Each thread is a PE.

XE Login