Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

16312
2027
233849


[라즈베리파이] 라즈비안: 리눅스 커널 소스의 구조 2. 라즈베리 파이 설정

지금까지 라즈비안 리눅스의 커널 코드를 내려받고 빌드하는 방법을 알아봤습니다. 리눅스 커널 코드를 수정해서 실습 코드를 빌드할 수 있는 준비를 끝낸 것입니다. 이번에는 리눅스 커널 코드의 디렉터리 구조를 살펴보겠습니다. 

참고로 저도 처음으로 리눅스 커널 코드를 내려받고 디렉터리를 봤을 때 어떤 코드를 먼저 봐야 할지 감이 오지 않았습니다. 10여년 동안 커널을 빌드하면서 커널 소스는 다음과 같은 구조로 디렉터리가 구성돼 있다는 것을 알게 됐습니다.

arch

arch 하부 디렉터리에는 아키텍처별로 동작하는 커널 코드가 있습니다.
arm: 32비트 계열 ARM 아키텍처 코드가 있으며, 라즈비안도 이 하부 디렉터리 코드를 실행합니다.
arm64: 64비트 계열 ARM 아키텍처 코드가 있습니다.
x86: 폴더 이름과 같이 인텔 x86 아키텍처 코드가 있습니다.

include 

include에는 커널 코드 빌드에 필요한 헤더 파일이 있습니다.

Documentation

커널 기술 문서가 있는 폴더로, 커널 시스템에 대한 기본 동작을 설명하는 문서를 찾을 수 있습니다. 커널 개발자를 대상으로 작성된 문서이기에 커널에 대한 기본 지식이 없으면 이해하기가 조금 어렵습니다.

kernel

커널의 핵심 코드가 있는 디렉터리로, 다음과 같은 하위 디렉터리를 확인할 수 있습니다.
irq: 인터럽트 관련 코드
sched: 스케줄링 코드
power: 커널 파워 매니지먼트 코드 
locking: 커널 동기화 관련 코드 
printk: 커널 콘솔 관련 코드 
trace: frace 관련 코드 

위 디렉터리에는 아키텍처와 무관한 커널 공통 코드가 있으며, 아키텍처별로 동작하는 커널 코드는 arch/*/kernel/에 있습니다. 라즈비안의 경우 ARMv7 아키텍처 관련 코드를 arch/arm/kernel/에서 확인할 수 있습니다.

mm 

Memory Management의 약자로 가상 메모리 및 페이징 관련 코드가 들어 있습니다.
아키텍처별로 동작하는 메모리 관리 코드는 arch/*/mm/ 아래에 있습니다. 라즈비안의 경우 ARMv7 아키텍처 관련 코드를 arch/arm/mm/에서 확인할 수 있습니다.

drivers

모든 시스템의 디바이스 드라이버 코드가 있습니다. 하부 디렉터리에 드라이버 종류별 소스가 들어 있습니다.

fs 

모든 파일 시스템 코드가 담긴 폴더입니다. fs 폴더에 있는 파일에는 파일시스템 공통 함수가 들어 있고 파일 시스템별로 하나씩 세분화된 폴더를 볼 수 있습니다.

lib 
lib 디렉터리에는 커널에서 제공하는 라이브러리 코드가 있습니다. 아키텍처에 종속적인 라이브러리 코드는 arch/*/lib/에 있습니다.

* 유튜브 강의 동영상도 있으니 같이 들으시면 더 많은 걸 배울 수 있습니다. 







라즈베리 파이 설정 

라즈베리 파이 설치하기
라즈베리 파이 기본 설정하기 
라즈비안 리눅스 커널 빌드

"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


 












핑백

덧글

  • 2021/02/08 12:56 # 삭제 답글 비공개

    비공개 덧글입니다.
  • AustinKim 2021/02/08 20:10 #

    다음 순서대로 진행하시면 됩니다.

    1. 3.1.2 절에 소개된 디버깅 패치를, 갖고 계신 보드에 적용하시면 인터럽트 핸들러 함수의 목록을 확인할 수 있습니다. 인터럽트 핸들러 함수의 이름 중에 usb와 관련된 함수 이름(ex: usb*)이 보이면 이 함수가 USB와 연관된 인터럽트 핸들러 함수라고 추측할 수 있습니다

    2. 이후 89페이지의 내용과 같이 USB와 연관된 인터럽트 핸들러 함수를 set_ftrace_filter에 지정하시고, ftrace를 설정합니다.(USB 인터럽트 핸들러 함수가 usb_irq_handle인 경우)
    echo usb_irq_handle > /sys/kernel/debug/tracing/set_ftrace_filter

    3. ftrace 로깅을 on으로 설정합니다.
    echo 1 > /sys/kernel/debug/tracing/tracing_on

    4. USB를 보드의 USB 단자에 연결했다가, 다시 뺍니다.

    5. ftrace 로깅을 off으로 설정한 후 ftrace 메시지를 추출합니다.
    echo 0 > /sys/kernel/debug/tracing/tracing_on

    6. USB 관련 인터럽트 핸들러가 호출됐는지 확인합니다. 혹은 'cat /proc/interrupts' 명령어를 입력해 USB 관련 인터럽트가 얼마나 올라왔는지 확인합니다.

    하다가 잘 안되면 문의 주세요.

    즐거운 하루 되세요.
댓글 입력 영역