SoC : : Architecture 32

커널 빌드 / 설치

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..

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_..

Docker in i.MX

0.  Intro 이 설정은 docker를 사용하여 격리된 환경에서 i.MX BSP를 구축하는 데 도움이 됩니다.    1.  사전 설정   1.1  Install Docker  docker를 설치하는 방법에는 docker 스크립트를 사용하는 등 다양한 방법이 있습니다.  $ curl -fsSL https://get.docker.com -o get-docker.sh$ sudo sh get-docker.sh    1.2  Run Docker without sudo  sudo 없이 docker를 더 잘 사용하려면 사용자를 docker 그룹에 추가하세요.$ sudo usermod -aG docker    그룹 멤버십을 재평가하려면 로그아웃했다가 다시 로그인하세요.    1.3  Set Docker to wor..

Raspbian - 리눅스 커널 소스코드 다운로드, 빌드, 설치

1.  리눅스 커널 소스 코드 다운로드   1.1  git clone​리눅스 커널 소스 코드를 다운로드 받는 방법을 소개합니다. 터미널에서 다음 명령어를 입력하면 라즈비안 최신 커널 소스를 내려 받을 수 있습니다.(물론, git은 사전에 설치되어있어야 합니다.) root@raspberrypi:/home/pi/RPi_kernel_src# git clone --depth=1 https://github.com/raspberrypi/linuxCloning into 'linux'...remote: Enumerating objects: 85646, done.remote: Counting objects: 100% (85646/85646), done.remote: Compressing objects: 100% (657..