objdump -d vmlinux | grep rpi_get_interrupt_info"디버깅을 통해 배우는 리눅스 커널의 구조와 원리"를 보며 실습하던 중, 책에서 하라는 대로 했지만 알수없는 오류가 생겼다.
바로 오늘의 제목인 line 19: echo: write error: Invalid argument이 되겠다.
이 오류는 다음과 같은 쉘 명령어 파일을 실행하다 본 것이다.
#!/bin/bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"
echo 0 > /sys/kernel/debug/tracing/events/enable
sleep 1
echo "events disabled"
echo secondary_start_kernel > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter init"
echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"
echo rpi_get_interrupt_info > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter enabled"
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
echo "event enabled"
echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo 1 > /sys/kernel/debug/tracing/options/sym-offset
echo "function stack trace enabled"
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"
무엇이 문제일까? 19라인을 보자.
"echo rpi_get_interrupt_info > /sys/kernel/debug/tracing/set_ftrace_filter"
책과 다를 것이 없다.
그래서 구글링을 해보았다.
나온 결과는 바로 이것
http://egloos.zum.com/rousalome/v/10020085
저자분께서 오류를 해결하라고 친절히 글까지 써주셨다.
이런 오류가 나타나는 이유는 rpi_get_interrupt_info라는 함수가 실제로 내 리눅스 커널에 설치가 안되어있기 때문이다.
확인을 하려면
cat /sys/kernel/debug/tracing/available_filter_functions | grep rpi_get_interrupt_info
위 명령어를 입력해서 뭔가 나오는지 확인하면 된다. (available_filter_functions는 등록된 함수 목록인것 같다.)
안나온다면 문제가 있는 것이다.
원인은 다음과 같을 수 있다.
1. rpi_get_interrupt_info가 컴파일 과정에서 inline 함수로 변경되어 실제로 함수가 아니게 되었다
함수 앞에 noinline을 붙혀줘서 컴파일러가 inline으로 바꾸지 못하게 하자.
2. 함수를 정의하지 않았거나 이름이 이상함
out 디렉터리에서 "objdump -d vmlinux | grep rpi_get_interrupt_info"를 입력해보고 출력이 없다면 코드를 확인해보자
3. 오타로 인한 컴파일 오류
빌드 로그를 확인해보자. 오류내역이 분명 있을 것이다.
4. 라즈베리 파이 프로세서가 책과 다르다
/proc/cpuinfo를 입력해보자 (이건 왠지 모르지만 ssh연결 방식으로 연결했을때 permission denied가 뜬다)
책의 기준은 bcm2709이다. 라즈베리 파이 4를 쓴다면 명령어를 수정해야 한다.
이건 라즈베리파이 공식 문서를 확인하는것이 좋다.
https://www.raspberrypi.com/documentation/computers/linux_kernel.html
5. 리눅스 버전의 충돌
아무생각없이 라즈비안을 설치하면 최신버전 (현재는 5.x 책은 4.x)이 설치된다.
필자가 이런 케이스였는데, 커널소스를 받을때는 책과 같이 4.x을 다운로드하고 사용하고 있는 커널은 5.x이였다.
그래서 설치가 안됬던 것이였다.
이러면 4.x 버전의 커널을 설치하거나, 커널소스 버전과 내 커널의 버전을 일치시키자.
'디버깅을 통해 배우는 리눅스 커널의 구조' 카테고리의 다른 글
IRQ 스레드 (threaded IRQ) (0) | 2022.06.17 |
---|---|
인터럽트 디스크립터와 인터럽트 디버깅 (0) | 2022.06.15 |
bcm2711 라즈베리파이에서 bcm2835 라이브러리 사용 (0) | 2022.06.12 |
스터디 계획(1주차) (0) | 2022.06.11 |
_do_fork의 행방 (0) | 2022.05.29 |