본문 바로가기

Core BSP 분석

(119)
Reboot - Kernel Rebooting(커널 리부팅) Sequence 보통 시스템이 리부팅될 때 동작에 대해 상세히 다룬 글이 없는 것 같아요. 그래서 유저 스페이스에서 reboot 시스템 콜을 수행하면 어떤 흐름으로 시스템이 리셋되는지 살펴볼께요. 가끔 시스템이 리부팅하는 과정에서 락업이나 커널 크래시가 발생하거든요. 이럴 때 어떤 흐름으로 리부팅 되는지에 대한 정보를 알면 어느 포인트에서 디버깅을 해야 할 지 빨리 파악할 수 있어요. sys_reboot이란 함수는 아래 코드로 정의되어 있구요. kernel_restart() 함수가 호출되요. SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg) { struct pid_namespace *pid_ns = task_ac..
[Linux][Kernel] 타이머(Timer) Overview 리눅스 커널에서 아주 중요한 Subsystem 중 하나인 타이머에 대해서 간단히 짚어 볼께요. init_timer 아래 함수 콜로 do_init_timer() 함수에서 struct timer_list *timer 초기화를 수행해요. __init_timer((timer), 0) init_timer_key((_timer), (_flags), #_timer, &__key); do_init_timer(timer, flags, name, key); MIPS 아키텍쳐에서 아래와 같이 타이머를 세팅하는 코드가 있네요. static inline void ip32_power_button(void) { // .. 생략.. blink_timer.data = POWERDOWN_FREQ; blink_timeout(POWERDO..
파레트 -리눅스 커널 전처리 파일 추출 방법(마무리) irq 워닝 매크로 - slab 디버거 기본 코드 + 디버깅 정보 - stack canary에 대해서 - ftrace에 대해서 - T32 여러 기본 명령어들 y.l.line 등등 - IRQ에 대해서 irq desriptor + ftrace 분석 방법 + handler private 변수 -last kernel message 저장, ramoops 저장 조건 -tty_drivers 전역 변수 -workqueue: ftrace 분석 + T32 점검 -P1V: stack corruption, 구글 패치 건!!!! -P1V: 세마 포어 락업 건!!! -리부팅 시 일어나는 현상 - notifier call -cds lock - ipi call -file descript..
[Kernel]panic @__wake_up Debugging "ndroid.systemui" 프로세스가 raw_spin_lock_irqsave() API 동작 중에 aee_wdt_atf_entry() Trigger -000|aee_wdt_atf_entry() -001|prefetchw(inline) -001|arch_spin_lock(inline) -001|do_raw_spin_lock_flags(inline) -001|__raw_spin_lock_irqsave(inline) -001|raw_spin_lock_irqsave(lock = 0xDD82725C) -002|__wake_up(q = 0xDD82725C, mode = 1, nr_exclusive = 1, key = 0x0) -003|mmc_wait_data_done -004|msdc_irq..
세마포어 https://www.linux.co.kr/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=11129 까다롭고 어려운 동기화 문제 리눅스 커널이 2.0으로 발전하면서 SMP(SymmtricMultiprocessing)을 지원하기 시작했고 이로 인하여 커널의 공유 자원에 대한 Lock은 복잡해지기 시작했다. SMP를 지원하기 시작하면서 어떤 커널 코드이건 2개 이상의 CPU에서 수행될 수 있기 때문에 스택에 할당된 자원을 제외하고는 동시에 하나 이상의 CPU가 접근할 수 있게 됐으며 그로 인해 프로그래머는 여러 가지 고려해야 할 것이 많아졌다. 반면, 여전히 하나의 CPU만을 갖는 환경의 개발자들은 SMP 를 고려하지 않아도 되기 때문에 사실 동기화에 대해서는..
리눅스 커널 디버깅 http://www.dedoimedo.com/computers/crash-analyze.html
stack_overflow_check static inline void stack_overflow_check(struct pt_regs *regs) { #ifdef CONFIG_DEBUG_STACKOVERFLOW #define STACK_TOP_MARGIN 128 struct orig_ist *oist; u64 irq_stack_top, irq_stack_bottom; u64 estack_top, estack_bottom; u64 curbase = (u64)task_stack_page(current); if (user_mode_vm(regs)) return; if (regs->sp >= curbase + sizeof(struct thread_info) + sizeof(struct pt_regs) + STACK_TOP_MARGIN && reg..
Debug config arch/x86/kernel/x8664_ksyms_64.c:62:#ifndef CONFIG_DEBUG_VIRTUAL arch/x86/kernel/amd_gart_64.c:308:#ifdef CONFIG_IOMMU_DEBUG arch/x86/kernel/test_nx.c:145:#ifdef CONFIG_DEBUG_RODATA arch/x86/kernel/Makefile:79:obj-$(CONFIG_DEBUG_RODATA_TEST) += test_rodata.o arch/x86/kernel/Makefile:80:obj-$(CONFIG_DEBUG_NX_TEST) += test_nx.o arch/x86/kernel/Makefile:81:obj-$(CONFIG_DEBUG_NMI_SELFTEST) += nmi_se..