분류 전체보기 268

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

무엇을 배워야 임베디드 리눅스 개발을 잘 할 수 있을까

무엇을 배워야 임베디드 리눅스 개발을 잘 할수 있을까    좁게 보면 임베디드 리눅스 개발자가 알아야 할 지식은 다음과 같습니다.    - 리눅스 디바이스 드라이버    - 리눅스 커널     - CPU 아키텍처     - SoC ​  조금 넓게 보면 다음 내용도 알면 좋습니다.     - 유저 공간 HAL(Hardware Adaption Layer) 코드 구현     - 빌드 스크립트 구현     - 테스트용 디바이스 드라이버 구현     - git 과 형상 관리​  숙련된 임베디드 리눅스 개발자가 되려면 배워야 할 내용이 많습니다.  문제는 이런 내용을 쉽게 설명한 자료가 부족합니다. 고수 개발자들은 모두 바쁘며 다른 개발자를 위한 개발 문서를 작성하기도 벅찬 것이 현실입니다.​​  신입 임베디드 리..

기기별 운영체제 점유율

기기별 운영체제 점유율 우리가 인지하지 못하는 사이 리눅스는 우리 생활을 이루고 있습니다.이번 시간에는 전 세계에서 IT 각 기기별로 리눅스 운영체제를 얼마나 쓰는지 알아보겠습니다. - 데스크탑(PC)- 휴대폰 - 슈퍼컴퓨터​​  1.  데스크탑 PC 운영체제 점유율 먼저 다음 그림을 보면서 데스크탑 PC 운영체제 점유율을 확인해봅시다.[출처: http://gs.statcounter.com/os-market-share/desktop/worldwide]   위 그래프 가장 윗부분에 Microsoft ‘윈도우 NT 계열’ 운영체제가 73.31% 점유율로 부동의 1위를 지키고 있습니다. 그다음으로 iOS가 15.45% 그리고 리눅스는 4.5% 점유율을 보입니다. 유닉스 계열 운영체제로 분류되는 iOS와 리눅스..

리눅스의 디렉터리 구조

리눅스의 디렉터리 구조    arch  arch 하부 디렉터리에는 아키텍처별로 동작하는 커널 코드가 있습니다.  Ÿ arm: 32비트 계열 ARM 아키텍처 코드가 있으며, 라즈비안도 이 하부 디렉터리 코드를 실행합니다.  Ÿ arm64: 64비트 계열 ARM 아키텍처 코드가 있습니다.  Ÿ x86: 폴더 이름과 같이 인텔 x86 아키텍처 코드가 있습니다. ​  /bin  ​일반 사용자 및 관리자가 사용하는 명령어의 실행파일이 배치되어있는 디렉터리입니다.  특히 시스템과 관련된 중요한 명령어를 포함하고 있습니다.    /dev  디파이스 파일이 배치되어있는 디렉터리입니다. 디바이스 파일이란 디스크나 키보드 등 하드웨어를 다루기 위한 특수파일입니다.​     drivers​  모든 시스템의 디바이스 드라이버..

Wenston

1.  WenstonWayland  - X11을 대체하는 새로운 window manager이며, 클라이언트 및 서버에서 사용할 수 있는 프로토콜, 라이브러리를 제공  - 윈도우 서버(컴포지터)와 클라이언트가 통신하기 위한 프로토콜 정의(wayland.xml)  - 윈도우 매니징, 컴포지팅 역할 수행  - wayland client: wayland 클라이언트 라이브러리를 이용하여 window를 생성(클라이언트 어플리케이션)  - wayland server: wayland 서버 라이브러리를 이용하여 window를 관리하고 화면에 출력 하는 서비스(weston 서버)  - Wayland protocol/compositor을 구현  - Shell plugin 지원(desktop-shell, xdg-shell) ..

Embedded Linux 디스플레이 출력 / DRI / DRM

1.  디스플레이 출력   디스플레이 패널은 CPU/GPU가 준비해 놓은 버퍼를 특정 주기마다 출력한다(AP를 사용하는 임베디드에서는 디스플레이 컨트롤러 H/W IP가 이역할을 담당한다). 이 출력되는 구간을 Vertical Blank(일반적인 패널에서 좌측 위 끝에서 우측아래 끝까지 그려지는 구간)라고 하며 이 주기가 패널의 fps를 결정 하게 된다. 또한 tearing을 방지하기 위해 이 구간 동안 AP의 디스플레이 컨트롤러 IP가 frame buffer에 접근하지 않도록 구현되어 있다.(Vsync, sync/fence 활용) *  tearing: framebuffer가 패널로 출력 되고 있는도중 CPU가 frambuffer 영역을 갱신하여 패널 화면에 다음 frame이 섞여 출력되어 화면이 깨져보이..