커널

포스트: 228|조회수: 0|CIVILIZATION
Items

Posts

228 posts

[라즈베리파이] 인터럽트 디버깅 - in_interrupt #CS

Guillermo Austin Kim|2018년 6월 4일

in_interrupt 함수는 현재 구동 중인 프로세스 스택 Top 주소에 위치한 current_thread_info()->preempt_count 멤버이며 인터럽트 서비스 루틴이 실행되기 전 __irq_enter 함수에서 HARDIRQ_OFFSET를 더하고 인터럽트 서비스 루틴이 종료되면 해제합니다. 이제 커널 소스를 조금 수정해서 라즈베리안에서는 in_interrupt 매크로 값이 뭔지 확인하겠습니다. 인터럽트 핸들러에 아래 코드를 반영하고 로그를 받아보면 in_interrupt() 함수 리턴값을 볼 수 있습니다.diff --git a/drivers/mmc/host/bcm2835-sdhost.c b/drivers/mmc/host/bcm2835-sdhost.cindex 273b1be05..5f5

[Linux][Kernel] 커널 크래시란

Guillermo Austin Kim|2018년 6월 3일

커널 패닉이란 말을 들어본 적이 있나요? 혹시 여러분이 임베디드 리눅스 개발자면 몇 번 쯤은 들어봤을 겁니다. 하지만, 리눅스를 자주 안 쓰거나 리눅스를 학습 용도로 쓰시는 분들에겐 단어가 낯설게 들릴수도 있죠. 여러분들은 대부분 컴퓨터나 노트북을 윈도 운영체제로 쓰실 겁니다. 그런데 혹시 컴퓨터를 오래 쓰다가 블루 스크린을 본 적이 있나요? 밝은 파란색 배경 화면에 흰색으로 이상한 경고 문구가 떠있죠. 이 때 컴퓨터는 아무런 동작을 안합니다. 이런 화면을 처음 봤을 때 어땠나요? 좀 짜증나지 않았나요? 전 예전 처음 이 블루 스크린을 봤을 때 엄청 당황했었어요. 왜냐면 “전원을 다시 키면 부팅은 할까?”, “혹시 컴퓨터에 저장된 자료가 날아가는 건 아닌가”? 이런 걱정을 했죠. 정말 뭔가 컴퓨터에 큰

[라즈베리파이] 인터럽트 디버깅 - proc/interrupts #CS

Guillermo Austin Kim|2018년 5월 30일

새로운 리눅스 시스템을 접했을 때 인터럽트의 개수와 종류를 바로 파악하려면 proc 파일 시스템을 활용할 필요가 있습니다. 그럼 라즈베리안에서 인터럽트 종류와 개수를 바로 알려면 어떤 명령어를 입력해야 할까요? 우선 리눅스 커널 proc 파일 시스템이 알려주는 인터럽트 정보(/proc/interrupts)를 활용할 필요가 있습니다. 그럼 이 정보부터 같이 점검하기 위해 다음 명령어를 입력해볼까요?root@raspberrypi:/home/pi# cat /proc/interrupts 그럼 다음과 같은 정보를 볼 수 있습니다. CPU0 CPU1 CPU2 CPU3 16: 0 0 0 0 b

[라즈베리파이] 인터럽트 디버깅 - 인터럽트 핸들러 파악 #CS

Guillermo Austin Kim|2018년 5월 29일

우리는 다음 __handle_irq_event_percpu 함수 13번째 코드에서 인터럽트 핸들러가 호출된다고 배웠습니다. 1 irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc, unsigned int *flags)2 {3 irqreturn_t retval = IRQ_NONE;4 unsigned int irq = desc->irq_data.irq;5 struct irqaction *action;67 record_irq_time(desc);89 for_each_action_of_desc(desc, action) {10 irqreturn_t res;1112 trace_irq_handler_entry(irq, action);13 res = act