[커널 17차] 51주차

2021.08.21 23:31

ㅇㅇㅇ 조회 수:210

kasan_init_tags()
- for_each_possible_cpu() 매크로로 모든 possible cpu에 대해서 iteration 하면서 get_cycles() 함수로 현재 timer cycle 값을 읽어와서 percpu 변수인 prng_state에 저장한다
- 강력한 randomness는 비싸므로 적당한 pseudo-random number를 사용한다
- percpu를 setup을 안했는데 possible cpu에 대해서 percpu 변수를 업데이트하는 것은 의미가 없어 보임
 
get_cycles()
- 매크로로 arch_timer_read_counter()로 정의되어 있다
 
arch_timer_read_counter()
- CONFIG_ARM_ARCH_TIMER가 정의되어 있는 경우 함수 포인터 arch_timer_read_counter로 정의된다
- drivers/clocksource/arm_arch_timer.c 179 line에서 함수 arch_counter_get_cntvct()로 정의된다
 
arch_counter_get_cntvct()
- __arch_counter_get_cntvct() 함수로 정의됨
 
__arch_counter_get_cntvct()
- isb()로 배리어 수행
- cntvct_el0 레지스터 값을 읽어서 리턴
- 마지막에 함수 arch_counter_enforce_ordering()로 ordering을 강제함
- 최근에는 이 함수 대신 isb() 사용하는 패치를 올렸는데 반영은 안된듯함
- isb()가 비싸서 더 빠른 방법을 고수하기를 원하는 듯
- https://www.spinics.net/lists/arm-kernel/msg885662.html
- https://elixir.bootlin.com/linux/v5.14-rc6/source/arch/arm64/include/asm/arch_timer.h
 
- ARMv8 Generic Counter : CNTFRQ_EL0가 주파수를 나타내며 보통 부트로더나 EL3 펌웨어가 설정한다
- https://community.arm.com/developer/ip-products/processors/f/cortex-a-forum/46679/can-i-change-the-frequency-of-the-generic-timer-in-armv8
 
setup_arch()
- CONFIG_ARM64_SW_TTBR0_PAN on인 경우 init_task.thread_info.ttbr0 를 NULL 페이지로 만들어서 커널에서 user 영역 접근을 차단한다
- 부트로더가 커널에 넘겨준 x0, x1, x2, x3 중에 x1, x2, x3가 NULL이 아니면 경고를 출력한다
- setup_arch() 종료

 

나머지 시간은 head.S에서 시작하여 setup_machine_fdt()까지 복습

XE Login