SoC : : Architecture 34

커널 빌드 / 설치

1.  raspbian .config   1.1  make menuconfig커널 빌드시 각종 옵션을 지정할 수 있다. 이전엔 모두 pass하고 빌드해본 것. 디바이스 드라이버 개발시 체크 설정/해제하면서 테스트하며 개발    1.2  kernelsource/out/.config​ .config (bcm2712_defconfig) General SetupIRQ subsystemTimers subsystemBPF subsystemCPU/Task time and stats accountingRCU Subsystem 등 make Manuconfig 설정에서 본 내용들이 저장됨.     2.  Kernel Build / Install   2.1  Build Script를 이용하여 리눅스 커널 빌드​./build..

안드로이드/라즈베리 파이 부팅 실패를 100% 해결하는 디버깅 패치

안드로이드 / 라즈베리파이 부팅 실패를 100% 해결하는 디버깅 패치    0.  Overview 많은 개발자들은 '브링업'이란 개발 업무를 맡고 있습니다. 이 과정에서 다음과 같은 어려움을 많이 겪습니다.​* 보드 브링업을 하다 보니 컴퓨터의 시작 화면까지 보이지 않는다.* 부팅 과정에서 출력하는 화면이 계속 출력된다.​이런 이슈를 겪은 적이 있나요? 보통 이런 상황을 겪으면 굉장히 답답하고 짜증이 납니다. 그 이유는 무엇일까요?​* 뭔가 문제가 생겨서 부팅이 안되는 상황인데 그 원인을 파악하기 어렵기 때문입니다. ​달리 말씀을 드리면 정확히 어디에 문제가 생겨서 부팅이 안되는지 알 수 없기 때문입니다. 이번 포스팅에서는 이런 상황에서 사용하면 아주 유용한 커널 패치를 소개합니다.​   1.  아이디어..

dump_stack() 함수

dump_stack() 함수는 콜스택을 커널 로그로 출력합니다. 커널 로그로 콜스택을 보고 싶은 코드에 삽입하면 됩니다. 이 함수를 호출하려면 C 코드 윗부분에 다음과 같이 "linux/kernel.h" 해더 파일을 추가해야 합니다. #include  dump_stack() 함수 선언부를 봅시다.asmlinkage __visible void dump_stack(void); 인자와 반환값 타입이 모두 void입니다. 커널 소스 코드 어디든 dump_stack() 함수만 추가하면 됩니다. dump_stack() 함수로 커널 로그에서 콜스택 확인하기이번엔 dump_stack() 함수를 써서 커널 로그로 콜스택을 볼 수 있는 패치 코드를 소개합니다.diff --git a/kernel/fork.c b/kernel..

printk() 함수

printk는 printf와 유사한 기능입니다. printf는 윈도우 콘솔 프로그램이나 리눅스 시스템 프로그램에서 로그를 출력합니다. 마찬가지로 printk() 함수를 호출하면 커널 로그를 볼 수 있습니다. printk 를 커널 함수에 적절히 추가하면 유용한 디버깅 정보를 얻을 수 있습니다. 리눅스 커널 핵심 함수도 printk를 이용해 시스템 정보를 출력합니다.커널 핵심 코드에서 printk를 쓰는 예시 코드를 소개합니다.[https://elixir.bootlin.com/linux/v4.14.70/source/arch/arm/kernel/process.c]01 void __show_regs(struct pt_regs *regs)02 {...03 printk("pc : []    lr : []    ps..

(2) 디버깅과 코드 학습 능력

2.  디버깅과 코드 학습 능력 ​디버깅을 하며 리눅스 커널 코드를 함께 분석하면, 다음과 같은 정보를 더 얻을 수 있습니다.   분석하는 코드가 동작하는 콜 스택  함수가 실행될 때 변경되는 자료구조  함수가 실행되는 빈도와 실행 시각  분석 대상 코드를 실행하는 프로세스​커널 소스코드 분석과 함수의 실행흐름과 실행 빈도를 함께 알아두면 좋습니다.       ex.  리눅스 커널 코드 분석의 예​ $ cat /proc/interrupts 명령어를 입력하면 인터럽트의 세부 속성을 알 수 있습니다. show_interrupts() 함수가 이 정보를 터미널로 출력합니다. 만약, 아래와 같은 정보를 확인하고싶다면?  인터럽트 디스크립터인 irq_desc 구조체의 action 필드에 저장된 인터럽트의 속성 정보..

(1) 디버깅은 문제 해결 능력의 지름길

디버깅 : 오류 해결   1.  디버깅이 중요한 이유 이번 절에서 디버깅 방법을 소개하기 전 디버깅이 중요한 이유를 다음 관점으로 알아보겠습니다. - 문제 해결 능력 - 커널 코드 학습 능력 필자는 디버깅을 단지 버그를 잡는 과정으로만 보지 않습니다. 리눅스 커널과 드라이버가 정상 동작할 때 자료구조와 함수 호출까지 파악하는 과정을 디버깅이라고 생각합니다. 그 이유를 더 알아볼까요?  신입 개발자들은 실전 리눅스 개발에서 어떤 업무를 하는지 궁금해합니다. 임베디드 리눅스는 ‘클라우드 서버’, ‘휴대폰’, ‘자동차’ 까지 다양한 분야에서 쓰고 있습니다. 따라서 실전 개발 업무가 어떻다고 설명하긴 어렵습니다. 그런데 임베디드 리눅스 프로젝트 개발 중 다양한 문제를 겪습니다. 임베디드 리눅스는 활용 분야가 다..

Kernel Source 구조

리눅스 커널 소스 구조   1.  common sourceArchitecture와 무관하게 공통으로 사용하는 소스들 kernel/irq : 인터럽트kernel/sched : OS 스케줄링kernel/power : 전원관리 소스kernel/locking : OS의 동시성 지원 - Mutex, Semaphore 등kernel/printk : log 출력 함수kernel/trace : ftrace 등 추적 프로그램    2.  Archecture 종속 코드,  linux linux/arch : Architecture별로 다른, CPU 종속성을 띄는 코드linux/mm : memory management - 가상메모리 등linux/drivers : I2C, I3C, GPIO, GPU 등 드라이버 코드linux/..

리눅스 커널(Linux Kernel) 전처리 파일 생성하기

1.  리눅스 커널 전처리 파일 생성 목적   1.1  전처리 코드 생성 목적   리눅스 커널 소스 코드를 분석하다 보면 수 많은 매크로를 만납니다. 그런데 이 매크로가 소스 분석의 큰 걸림돌입니다. 리눅스 커널에서 캡슐화와 다형성과 객체지향 방식을 구현하다 보니 매크로로 구현된 코드가 많습니다.   전처리 코드는 이 매크로를 모두 풀어서 표현해서 훨씬 편하게 소스 코드를 분석할 수 있습니다. 리눅스 커널 코드를 분석할 때 전처리 코드를 함께 보시기 바랍니다.   전처리 코드는 GCC 컴파일 오브젝트를 생성하는 과정에서 추출됩니다.     2.   전처리 파일 전체 생성방법   2.1  MakeFile 수정먼저 리눅스 커널 전체 소스 코드를 전처리 파일로 추출하는 방법을 소개합니다.   $ ~ /rpi_..