본문 바로가기

Linux/ARM64

(5)
arch_local_irq_disable() arch_local_irq_disable 분석 boot_cpu_init에 앞서서 먼저 local interrupt requst 모두 disable 시킨다. (문c 블로그 참조: http://jake.dothome.co.kr/alternative/) 1 2 3 4 5 6 7 8 9 10 11 static inline void arch_local_irq_disable(void) { asm volatile(ALTERNATIVE( //조건에 따라 1번 명령어(초기 부팅 할 때), 2번 "msr daifset, #2 // arch_local_irq_disable", //processor state 에서 DAIF 중 I를 1로 setting 하여 irq_disable 함 "msr_s " __stringify(SYS..
boot_cpu_init() boot_cpu_init 분석 cpu 러닝 상태로 만들기 위해 online, active, present, possible 각각 4개 기능을 true 로 설정해 준다. (문c블로그 참조: http://jake.dothome.co.kr/boot_cpu_init/) 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 39 40 41 42 43 44 45 46 47 __attribute__((optimize("-O0"))) void __init boot_cpu_init(void) { int cpu = smp_processor_id(); /* Mark the boot cpu "..
smp_setup_processor_id() smp_setup_processor_id 함수 분석 리눅스는 기본적으로 물리적 id를 사용하지 않고 부트된 물리 cpu를 logical id 0번으로 배치하여 사용한다고 한다. (문c 블로그 참조:http://jake.dothome.co.kr/smp_setup_processor_id/) 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 39 40 41 42 __attribute__((optimize("-O0"))) void __init smp_setup_processor_id(void) { u64 dbg_x1, mpidr; mpidr = read_cpuid_mpidr(..
early_ioremap_init(void) 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
early_fixmap_init(void) early_fixmap_init 코드 분석 gdb에서 변수 확인 및 분석을 튜닝 진행함 Fixmap 영역은 컴파일 타임에 가상 주소공간이 이미 결정된 매핑 메모리 영역이다. 가상 주소와 물리 주소가 fix 되어 있어 두 주소간의 변환 방식이 MMU를 활용해서 변환 하기 보다는 Kimage_offset 을 사용하여 변환하고 있다. 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 ..