Guillermo Austin Kim

Sources

Posts

998 posts

[Linux][Kernel] 인터럽트(Interrupt) - request_threaded_irq 디버깅

Guillermo Austin Kim|2017년 12월 9일

irq_thread, request_threaded_irq 관련 데이터 구조와 코드에 대해서 이제 디버깅 좀 해볼까요? 실제 IRQ Descriptor 멤버들에 어떤 값들이 실려 있고 각 값들이 어떤 의미인지 정밀하게 파악하는 게 중요해요.이 값들로 며칠 야근할 껄 하루 몇 시간 디버깅으로 마무리할 수 있거든요. [1]: irq번호가 328[2]: 하드웨어적인 핀먹스 값이 13인가 보네요[3]. irq_data.state_use_accessors 값이 0x4002이네요 아주 중요한 정보를 담고 있으니 이 놈은 따로 분석 좀 해야 겠네요.[4]: kstat_irqs는 각 per-cpu 별로 얼마나 IRQ가 Trigger되었는지 카운트 값을 알 수 있어요.[5]: thread_fn으로 touch

[Linux][Kernel] 인터럽트 - request_threaded_irq 기초

Guillermo Austin Kim|2017년 12월 9일

개요 하드웨어 관점에서 인터럽트는 인터럽트 콘트롤러에 의해 인가되는 전기신호 인데요. 이 신호는 인터럽트 컨트롤러 입력 핀으로 전달됩니다. 각각 보드마다 인터럽트 컨트롤러는 연결된 여러 개의 인터럽트 배선을 하나의 배선에 묶어서 프로세서에 전달해준다. 인터럽트를 받으면 인터럽트 콘트롤러는 프로세서에 신호를 보낸다. 신호를 감지하면 프로세서는 인터럽트를 처리하기 위해 현재 실행하던 일을 잠시 중단한다. 그다음 프로세서는 커널에 인터럽트가 일어났다는 것을 알리고, 커널은 상황에 맞게 인터럽트를 처리한다. 위에서 설명한 인터럽트가 처리되는 과정은 어느 플렛폼이나 거의 유사하다. 주의해야 할 점 인터럽트가 올라오면 인터럽트 서비스 루틴(ISR)이 호출이 된다. 이 때 프로세서는 기존에 하던 일을 잠시

[Linux][Kernel] 인터럽트(Interrupt) - request_threaded_irq overview(1)

Guillermo Austin Kim|2017년 12월 9일

리눅스 커널 인터럽트 개념 중에 top/bottom half란 용어를 많이 들어봤죠? 하드웨어적으로 인터럽트가 처리될 때는 되도록 실시간으로 처리할 데이터만 빨리 처리하고,빨리 처리해도 안되는 동작은 쓰레드 레벨로 수행한다는 거죠. 수 없이 이런 글을 읽어봤는데, 사실 인터럽트 서비스 루틴에서 발생하는 수 많은 이슈를 대응하기 전까지는 개념이머리 속에 잘 들어오지 않더라구요. 그래서 이번 시간에 좀 좀 정리를 해보려고 해요. 리눅스 커널에서 bottom half로 처리되는 루틴은 크게 세 가지가 있어요.1> softirq2> workqueue3> irq_thread 이번 시간에는 irq_thread에 대해서 touch 드라이버를 예를 들어서 분석을 해보려구요.touch의 IRQ 관련

[Linux][Kernel] panic@___might_sleep

Guillermo Austin Kim|2017년 12월 7일

리눅스 커널 synchronization의 꽃 중의 하나인 Mutex Lock에 대해서 조금 짚어 볼께요. Mutex Lock은 보통 스핀락(Spinlock)과 많이 비교하죠. 사실 소스 코드를 보면 Mutex Lock이 스핀락보다 훨씬 소프트웨어적으로 복잡해요. 그 이유는?1> Mutex Lock을 잠근 프로세스만 해제할 수 있어요2> 이미 다른 프로세스가 Mutex Lock을 획득한 상태면 struct mutex.wait_list에 대기하고 Wait Queue에 넣고 잠들어야 해요.음, 이 소리는. Mutex Lock을 잡고 있는 프로세스가 Mutex Lock을 해제하면 누군가가 다시 대기 중이던 프로세스를 WaitQueue에서 끄집어 내서 런큐에 큐잉을 해줘야겠죠. 마지막으로 Mutex

[Linux][Kernel][Stability] Kernel panic @0x0 from xfrm_local_error+0x4c

Guillermo Austin Kim|2017년 12월 7일

커널 패닉이 났어요.네트워크 드라이버 리눅스 커널 코드에서 발생한 것 같은데요. 음.일단 당황하지 마시구요. 차근 차근 커널 로그와 코어 덤프를 살펴보면, 정답이 나와요. 일단 커널 로그를 보면, 프로그램 카운터가 0x0을 가르키고 있네요.음... 그리고링크 레지스터(R14)가 0xc0adc274(LR is at xfrm_local_error+0x4c/0x58) 을 가르키고 있습니다.[ 262.401303] Unable to handle kernel NULL pointer dereference at virtual address 00000000[ 262.401365] pgd = dbdc4000[ 262.401389] [00000000] *pgd=00000000[ 262.401433] Internal