[커널 20차] 29주차

2023.11.27 23:09

brw 조회 수:161

2023.11.25 (29주차) - 약 8명 참여

__primary_switched 의 ldr_l  x4, kimage_vaddr 이후부터 진행 -> pudp까지 분석

 

Q. set_cpu_boot_mode_flag 요약

u32 __boot_cpu_mode[] = { BOOT_CPU_MODE_EL2, BOOT_CPU_MODE_EL1 };

boot_cpu_mode는 배열형태이며, mode에 따라 boot_cpu_mode[0] &[1]이 하나의 형태(full boot status)로 채워짐

ex) EL1일경우 __boot_cpu_mode[] =  {BOOT_CPU_MODE_EL1, BOOT_CPU_MODE_EL1}

 

Q. bss 영역이란?

50TcXe3vkoYukXB5KjWT-jkJpn5-Zsi1vaWpq7Ev

-Bss영역이란 초기화 되지 않은 데이터 세그먼트라고 불린다. 프로그램의 실행과 함께 커널에 의해 0으로 초기화 된다. 

(참고 : https://m.blog.naver.com/techref/222270185816)

-초기화되지 않은데이터(bss영역)는 데이터 세그먼트 공간의 끝에서 시작되며 명시적인 초기화가 없는 모든 전역변수와 static 정적 변수를 포함한다.

 

-Data 세그먼트는 초기값을 가지고 있는 데이터세그먼트이며 rom 메모리에 저장 이후, 변수로써 사용하기 위해서는 프로그램 실행과 함께 ram으로 가져와서 사용.

 

-arm64의 bss 영역 위치 (include/asm-generic/vmlinux.lds.h)

G8fFFQdVxW_NKVtQVG9myff8qg3DydgBfOmBgpyj

 

Q. dsb  ishst 이란?

A. ARM 64 592page
Xmiicdm-MYfpF4ul5n8n6FOH988y213qGlub-P9r


Q. x25에 저장된값?

y0ipdhI4-eMDtMLkTioI78Mj0e7m6JoQmhR7mR84

(위 코드 : primay_entry)

 

#if VA_BITS > 48

        adr_l   x8, vabits_actual               // Set this early so KASAN early init

        str     x25, [x8]                       // ... observes the correct value

        dc      civac, x8 

#endif

A. VA_BITS > 48일경우, HW 지원여부에 따라 X25에 48이상의 값(ex.52)인지 아니면 VA_BITS_MIN을 넣어준다.


 

Q. page크기가 다를수도 있는데 lo12로 주소를 가져오는 이유

 

#ifdef CONFIG_RANDOMIZE_BASE

    adrp x5, memstart_offset_seed                     // adrp는 4k (2^12) 정렬로 가져온다.

    strh  w24, [x5, :lo12:memstart_offset_seed]  // 그렇기 때문에 lo12로 (page크기) 가져온다.

#endif

 

A.

위 코드 strh(store half word)는 w24의 값을 memstart_offset_seed 변수가 가리키는 메모리 주소를 half word(16비트)로 저장하는 명령어. 즉 x5에 memstart_offset_seed의 하위 12비트를 추가한 주소값으로 저장한다. 

(참고 : 나중에 나오는 arm64_memblock_init 함수안에서 memstart_offset_seed 변수가 사용되는거 같습니다. arm64_memblock_init 함수는 arch/arm64/mm/init.c 여기 있어요)

 

*ADRP :

  Form PC-relative address to 4KB page adds an immediate value that is shifted left by 12 bits, to the PC value to form a PC-relative address, with the bottom 12 bits masked out, and writes the result to the destination register.

 

 

Q. 아래 KASAN 관련  config의 설정 조건은?

#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)

 

A.

5GQDRPUQTAQBC66rDe5pTSFkjY6sdWM-PEAQLFQS(path : arch/arm64/configs/defconfig)

 

위 CC_HAS의 의미는 컴파일러 버전에 따라 KASAN 관련 Define이 설정될수 있는것으로 보인다. 아래코드 마지막줄을 보면, 

7Mx8LF3_FbtNKjSAWKmt9zf8iskD8hgApunSinG9

요구되는 cc 가 충족이 됐을때 해당 config가 설정될수 있는것으로 추측된다.

 

Q. _kasan_eraly_init  역할은?

A. Pmd - Pte까지 초기화를 해준다 

쉐도우 메모리가 성능에 (카산태그를 확인하기위해서) 영향을 많이 주기 때문에, arm64에서는 kasan이 사용되지 않는것으로 보인다. 

 

<early_fixmap_init() 분석>g0KcULXtM-qow9x0hAlKsOGRNcfwQjiAsQKGIfQT

 

MVTQpIN-uY1y5kxuxK0AEbVegkn8x7L3DjQF2m_G

아래는 FIXADDR과 관련된 Define값 분석

74LEkDxeveL7rGLInfjP0WSdgv2yCd6wBCemJOpI

8PYvFH-kcrpZcYPd9XUD3gGG03KnMSbMTX_A1L77

// VMEMMAP_START = 0xFFFF_FC00_0000_0000

lFkjt0EQyigAGKVB5Jbp9u2IoUbVLrUfCXoi6gVB

// 위 캡처본의 계산이 잘못됨. 

FIXADDR_TOP = 0xFFFF_FC00_0000_0000 - (1<<25) = 0xFFFF_FBFF_FE00_0000

ayR8-iJs9fdZ4SZd3TWZQcGV8xhiqi4gTHoKK7rC

위 코드는 fixed_address의 enum이며, 맨마지막에 __end_of_fixed_address을 찾기위해 카운팅을 한결과, __end_of_fixed_addresses의 enum value는 0x3CF임을 계산하였다.

 

FLabFiCx9vQsg_pbugTS0HcUV3oPdfzw-uCCrJJM

// FIXADDR_TOT_SIZE =  0x3CF << 12= 0x3C_F000

// FIXADDR_TOT_START = 0xFFFF_FBFF_FE00_0000 - 0x3C_F000 =  0xFFFF_FBFF_FDC3_1000


 

즉, 위에서 구한 FIXADDR 관련 Define 값을 addr과 end를 바탕으로 PGD와 P4D init을한다. (참고내용으로, p4d는 arm에서 안쓰고 intel에서 사용하는것인데 arm에서는 종종 PGD를 아무것도 하지않고 P4D를 호출하는것을 종종 볼수 있다고 한다. 아래 c코드에서는 PGD=P4D 같은역할이라고 추측해본다.)

즉, PGD-> PUD-> PMD->PTE를 호출하면서 init을 한다.

EWeVDTxW-qgfEVxw1IAIGxjM9b6iYKzYF36mpn0e

dRWSYixvFQ9eWK7FhoLMXxt2pZ88DBZMiLBtZ9kf

init_mm 내부에 pgd가  swapper_pg_dir이 아닌 init_pg_dir 이다.

7d9tw0Bct-sEYlcZXjaRilkv-dT6gh5glQg2n0S6

chzqV0p_gN6TMOWAmoHqVP-NBZOpx_3Q3LrmknJr

위에서 INIT__MM_CONTEXT에서 .pgd를 변경해주는 코드가 있다.

나중에 arch/arm64/mm/mmu.c 의 void init paging_init(void)에서 .pgd를 swapper_pg_dir로 변경해주는것으로 보임.



 

W6JDRyQr1ulvH0TiPkIUI3j1--212YGjku494IY7


 

Q. KASAN 이란 ?

A. Kernel Address Sanitizer 이며, 모든 메모리 접근 명령어에 대해 해당 접근이 유효한지 확인하는 명령어를 삽입해서 메모리 접근의 유효성을 판별한다. KASAN은 메모리 접근 명령어마다 각각 유효성을 확인하는 명령어를 삽입하기 때문에 컴파일러에 크게 의존한다. 

(출처 : https://hyeyoo.com/165)

 

  1) generic kasan

    - 메모리 load, store 마다 kasan shadow    memory에 접근해서 유효한 접근인지 확인함. 컴파일 타임에 컴파일 타임에 명령어를 삽입하는 방식으로 아키텍처 의존성 없이 소프트웨어로만 동작함.

  2) sw tag-based kasan

    - arm64의 Top Byte Ignore 기능을 활용함. TBI는 64bit의 주소 공간 중 상위 8bit(1byte)를 mmu가 무시하도록 하여 해당 부분에 다른 데이터를 저장할 수 있음. 주소의 상위 1byte에 random한 tag 값을 부여하고 이 주소로 메모리 접근 시 shadow memory에 저장된 tag값과 비교함.

  3) hw tag-based kasan

    - arm64의 Top Byte Ignore 기능을 활용함. 주소에 random tag를 부여하고 하드웨어가 memory tagging extension을 지원하면 shadow memory에 저장해논 tag를 하드웨어가 비교해주므로 속도가 가장 빠름.

 

*참고 : MTE(Mermory Tagging Extension)이라는 기능을 발표한후 HW-tag-based가 갤럭시 같은 제품에서 해당기능이 도입유무가 이슈임. HW적으로 하다보니 속도가 아주빠르지만, shadow memory가 어쨋든 필요하므로, 성능이 낮아질수 있다.

 

 <fixmap을 매핑하기 위해 페이지테이블 구성 분석>

 

addr = 0xFFFF_FBFF_FDC3_1000

end = 0xFFFF_FBFF_FE00_0000

 

init_pg_dir 0xffff_8000_0a6e_8000

 

VA_BITS = 48

page size = 4k

CONFIG_PGTABLE_LEVELS = 4

 

PGDIR_SHIFT = 39

PTRS_PER_PGD = 1 << 9

 

PTRS_PER_PUD = 1 << 9

 

pgd_index(addr) = 0x1F7

 

--------------------------------

bm_pud = 0xffff_8000_0a65_2000

kimag_voffset = 0xFFFF_7FFF_C7E0_0000

pa_symbol(bm_pud) = 0x4285_2000

0x4285_2003

 

---------------------------------

p4dp = 0xffff_8000_0a6e_8fb8

addr = 0xFFFF_FBFF_FDC3_1000

 

PUD_SHIFT = 30

PTRS_PER_PUD = 1<<9

 

pud_offset_kimg(p4dp,addr) 

((pud_t *)phys_to_kimg(pud_offset_phys((p4dp), (addr))))

 

pud_offset_phys((p4dp), (addr)) = 0x4285_2FF8

 

p4d_page_paddr(READ_ONCE((p4dp))) + pud_index(addr) sizeof(pud_t)

 

READ_ONCE(*(p4dp)) = 0x4285_2003

p4d_page_paddr(0x4285_2003) = 0x4285_2003 & 0xFFFF FFFF F000 = 0x4285_2000

 

pud_index(addr) = 0x1ff

 

pudp = 0xFFFF 8000 0A65 2FF8

 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 626
248 [커널 19차] 103 주차 Min 2024.04.28 4
247 [커널 20차] 48주차 무한질주 2024.04.25 22
246 [커널 19차] 102 주차 Min 2024.04.20 37
245 [커널 19차] 101 주차 Min 2024.04.13 63
244 [커널 19차] 100 주차 Min 2024.04.13 16
243 [커널 19차] 99 주차 Min 2024.03.30 82
242 [커널 19차] 98 주차 Min 2024.03.23 55
241 [커널 19차] 97 주차 Min 2024.03.16 50
240 [커널 19차] 96 주차 Min 2024.03.14 32
239 [커널 19차] 95 주차 [2] Min 2024.03.03 111
238 [커널 20차] 32주차 brw 2023.12.16 386
» [커널 20차] 29주차 brw 2023.11.27 161
236 [커널 20차] 27주차 brw 2023.11.21 86
235 [커널 20차] 26주차 brw 2023.11.21 48
234 [커널 20차] 28주차 이민찬 2023.11.19 64
233 [커널 20차] 25주차 이민찬 2023.10.30 120
232 [커널 20차] 24주차 이민찬 2023.10.22 743
231 [커널 20차] 23주차 이민찬 2023.10.14 81
230 [커널 20차] 22주차 이민찬 2023.10.08 76
229 [커널 20차] 21주차 이민찬 2023.09.23 116
XE Login