KERNEL

포스트: 183|조회수: 0|PERSON
Items

Posts

183 posts

IRQ Stack(ARM64) - Overview

Guillermo Austin Kim|2017년 12월 26일

IRQ Stack을 소개할까 해요. ARM64 비트 아키텍처 기반 리눅스 커널 4.4 버전부터는 IRQ Stack을 지원하거든요. 이게 뭔 소리냐?IRQ가 Trigger되면IRQ Stack Bottom 주소로 점프해서 IRQ Stack을 써서 함수 호출 및 로컬 변수를 처리한다는 거에요. 간단히 설명을 하면 A -> B -> C -> IRQ Trigger ->D 이런 순서로 호출된다고 보면 되요..[스택주소]0x9880x990 D0x9980xA000 irq_el1 //<<-- IRQ Stack Bottom 주소 // .. 생략 ...0x700x780x80 C0x880x90 B0x980xa00 A 그럼 왜 IRQ 용 스택을 따로 쓸까요? 여러가

spin_lock() vs spin_lock_irq() vs spin_lock_irqsave() - 분석

Guillermo Austin Kim|2017년 12월 26일

자 그 동안 궁금해왔던 아래 API들의 차이점에 대해서 알아보는 시간을 갖도록 하겠습니다.spin_lock(), spin_lock_irq(), spin_lock_irqsave() 리눅스 커널 책에서 마르고 닳도록 설명을 많이 하고 있는데요. 직접 소스를 열어서 분석하는게 가장 좋은 리눅스 커널을 마스터하는 길인 것 같아요. 소스 코드가 오픈되어 있잖아요. 1> spin_lock()아래 순서로 실제 구현부는 __raw_spin_lock() 함수 라는 걸 알 수 있어요. spin_lock -> raw_spin_lock -> __raw_spin_lockstatic inline void spin_lock(spinlock_t *lock){ raw_spin_lock(&lock->rlo

ARM64(Aarch64) - 함수 호출시 Stack Push(스택 푸쉬) 규약

Guillermo Austin Kim|2017년 12월 25일

아래와 같은 콜 스택에서 유저 공간에서 돌던 레지스터 Stack Push와 Exception 발생 시 Stack Push에 대해서 살펴봤어요. 이제는 평상시 함수 호출 시 어떻게 Stack Push를 하는 지 점검하려고 해요. 자 계속 그 동안 다뤄왔던 아래 "rild"란 프로세스의 콜스택에서 msm_ipc_router_sendmsg()-> msm_ipc_router_send_to() 으로 함수가 호출된 후 스택 푸쉬가 어떻게 수행되는 지 점검해볼께요.-000|do_mem_abort()-001|el1_da(asm) -->|exception-002|ch_pop_remote_rx_intent()-003|glink_tx_common()-004|glink_txv()-005|ipc_router_glink

특정 CPU를 끄는 패치(특정 CPU에서 커널 크래시)

Guillermo Austin Kim|2017년 12월 24일

가끔 타겟 보드에서 특정 CPU에서만 커널 패닉으로 시스템이 리셋되는 경우가 있어요.이럴 때 테스트할 수 있는 유용한 디버깅 패치를 소개하고자 해요. 아래 패치는 부팅 할 때 CPU3을 sys node에서 아예 제거시키거든요. 아예 CPU3가 안 돌게 되는거죠.diff --git a/kernel/cpu.c b/kernel/cpu.cindex 5b4440d..14cce91 100644--- a/kernel/cpu.c+++ b/kernel/cpu.c@@ -510,7 +510,7 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen) cpu_hotplug_begin(); - if (cpu_online(cpu) || !cpu_presen