Embedded : : Linux/: : Linux Kernel 15

perf 설명 및 간단 사용법 (Performance Counter for Linux)

1. perf란?2. perf설치3. perf 종류 및 사용법1. perf란?  리눅스 시스템 성능 프로 파일링하는 도구이다. 더보기더보기프로파일링 (profiling, 프로그램 프로파일링/소프트웨어 프로파일링) 또는 성능 분석은 프로그램의 시간 복잡도 및 공간(메모리), 특정 명령어 이용, 함수 호출의 주기와 빈도 등을 측정하는 동적 프로그램 분석의 한 형태이다. 프로파일링 정보는 대개가 프로그램 최적화를 보조하기 위해 사용된다. 프로파일링은 프로파일러(profiler)라는 도구를 사용하여 프로그램 소스 코드나 이진 실행 파일을 계측 분석함으로써 수행한다. linux kernel에 포함된 systeml 영역부터 user-level까지 한번에 성능(프로세스 및 코어별 사용량, 캐시 미스 등)에 대한 tr..

patch 명령어와 옵션

patch [option]    1.  옵션 -p[NUM] : 패치 파일에 명시되어있는 '패치할 파일의 위치'를 제대로 찾아주기 위한 "patch에서 제거할 prefix의 개수"​예를 들어보자. patch file path a/arch/x86/mm/fault.c-p0 : a/arch/x86/mm/fault.c-p1 : arch/x86/mm/fault.c-p2 : x86/mm/fault.c-p3 : mm/fault.c-p4 : fault.c​※ patch 결과를 미리 확인하는 옵션 patch --dry-run -p1 ~.diff​​   2.  patch 후, 출력 메시지​  - 패치가 성공적으로 이루어 졌을 때 :Hunk #1 Succeeded at 1 with fuzz 2  - 패치에 실패했을 때 :H..

Linux Kernel Image Header - ARM64

1.  Linux Kernel Image Header - ARM64   1.1  커널 이미지 헤더의 사용배경​ 리눅스 커널이 빌드 된 후, 커널 이미지의 헤더에 대해서 알아보도록 한다.임베디드 환경에서(통상 ARM Architecture),리눅스 커널과 같은 운영체제는 메모리에 로드가 된 후 실행된다. 그렇다면 여기서!, 드는 질문 2가지?!메모리에 적재시켜주는데... 메모리 몇 번지에 로드시켜야 하는가?커널 이미지는 누가 메모리에 로드시켜 주는가? Ⅰ. 메모리에 적재시, 메모리 몇번지에 로드시켜야 할까?  딱히 어느 메모리에 로드웨어야 한다 이런것은 없다.  리눅스 커널은 PIC(Position Independent Code)라고 하여, 메모리 어디에 올려도 스스로 원하는 메모리 주소로 Copy해서 동..

Linux Module

1.  Linux Module   1.1  리눅스 모듈이란​ 커널에서 작업해야하는 기능이 있는데 이를 추가하기 위해서는 커널을 수정해서 재컴파일해야한다. 하지만 매번 재컴파일하기에는 번거로우므로, 리눅스 등의 운영체제에서는 모듈이라는 기능을 제공하여 특정 커널의 기능을 사용하고자 할 때 실시간(동적)으로 추가할 수 있게 하고 있다.    1.2  USB 드라이버 예시 USB 드라이버를 생각해보자. USB를 연결하면, 장치가 추가되었기 떄문에 이를 처리하기 위해 커널은 처리를 하게 된다. 하지만 커널이 각 벤더사의 모든 USB드라이버를 설치해둘 수 없으니, USB 드라이버를 통해 커널에 특정 기능을 추가하여 처리할 수 있도록 한다. 만약 특정 기능을 추가하지 못한다면 USB를 꽂기 위해 USB 드라이버의 ..

[Linux Kernel] configuration files / Kconfig

0.  Intro Linux kernel에 관계된 directory들에는 Kconfig와 makefile이 함께 존재한다. ※  Makefile : 파일을 생성하는 스크립트. obj-변수(CONFIG_XX_*) 의 값이 y라면 해당 *.o 파일을 오브젝트 파일로 만들겠다.변수 위치 : 최상위 디렉터리 안 (Kconfig를 참고해 .config 파일은 자동으로 생성됨)  obj-$(CONFIG_FOO) += foo.o  # CONFIG_FOO의 값이 y라면 해당 *.o 파일을 오브젝트 파일로 만들겠다는 의미​​  1.  configuration files   1.1  Kconfig​Kconfig: kernel에 대한 설정에 대해 정의되어있는 파일을 의미 make menuconfig를 했을 때, 보이는 화면..

커널 로그 분석: WARN 매크로

1.  커널 로그 분석 방법    1.1  커널 로그 분석 순서  1. 오류 메시지를 커널 어느 코드에서 출력했는지 확인한다.  2. 소스코드에서 에러 메시지를 출력한 이유를 살펴본다.   3. 필요에 따라 디버깅 코드를 작성해 다시 문제가 발생했을 때 추가 커널 로그 확보를 시도한다.      1.2  WARN 매크로​WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq_desc_get_irq(desc));WARN 매크로를 어떤 함수에서 실행되면 시스템 정보를 커널 로그로 출력한다.1. 콜스택2. 현재 수행중인 프로세스 정보 : CPU 번호, 프로세스 이름, pid3. 함수 이름과 라인 정보 ​ WARN 매크로는 시스템에 뭔가 논리적 오류가 있을 경우..

Debugging the kernel using Ftrace

Debugging the kernel using Ftrace 이 기사는 Steven Rostedt가 기고했습니다.Ftrace는 Linux 커널에 직접 내장된 추적 유틸리티입니다. 많은 배포판은 이미 최신 릴리스에서 다양한 Ftrace 구성을 활성화했습니다. Ftrace가 Linux에 제공하는 이점 중 하나는 커널 내부에서 무슨 일이 일어나고 있는지 볼 수 있다는 것입니다. 따라서 문제 영역을 찾거나 이상한 버그를 추적하는 것이 더 쉬워집니다.Ftrace는 충돌로 이어지는 이벤트를 보여주는 기능을 통해 충돌의 정확한 원인을 찾을 수 있는 가능성이 높아지고 개발자가 올바른 솔루션을 만드는 데 도움이 될 수 있습니다. 이 기사는 Linux 커널을 디버깅하는 데 Ftrace를 사용하는 다양한 방법을 다루는 2부..

태스크 디스크립터: 프로세스 간 관계

1.  태스크 디스크립터: 프로세스 사이간의 관계   1.1  프로세스의 부모-자식 관계​유저 공간에서 생성한 모든 프로세스의 부모 프로세스는 init 이고 커널 공간에서 생성한 커널 스레드(프로세스)의 부모 프로세스는 kthreadd라고 했습니다. 태스크 디스크립터에서는 프로세스의 부모와 자식 관계를 상세히 알 수 있습니다. struct task_struct  *real_parent; 프로세스를 생성한 부모 프로세스의 태스크 디스크립터 주소를 저장합니다. struct task_struct *parent; 부모 프로세스를 의미합니다. real_parent 란 멤버는 해당 프로세스를 생성해준 프로세스를 의미합니다. 그런데 자식 프로세스 입장에서 부모 프로세스가 소멸된 경우 부모 프로세스를 다른 프로세스로 ..

커널 스레드

1.  커널 스레드   1.1  커널 스레드란?​커널 프로세스는 커널 공간에서만 실행하는 프로세스를 의미하며 대부분 커널 스레드 형태로 구동합니다. 커널 스레드는 리눅스 시스템 프로그래밍에서 데몬과 비슷한 일을 합니다. 데몬과 커널 스레드는 백그라운드 작업으로 실행하면서 시스템 메모리나 전원을 제어하는 역할을 수행합니다.  커널 스레드는 커널 내부에서 백그라운드로 구동하면서 커널 시스템에 도움을 주는 역할을 수행합니다. 데몬과 커널 스레드의 차이점은 보통 유저 영역와 시스템 콜을 받지 않고 동작한다는 점입니다. 리눅스 커널 개발자나 드라이버 개발자가 구현하는 경우가 많습니다.   커널 스레드의 3가지 특징    1. 커널 공간에서만 실행하며 유저 공간과 상호작용을 하지 않는다.    2. 실행, 휴면 등..

do_fork() 함수, 그리고 5.x 이후

1.  Intro    1.1  do_fork() 함수 소개​  리눅스에서 구동 중인 모든 프로세스는 _do_fork() 함수가 실행할 때 생성됩니다(kernel version 4.x까지). 프로세스는 누가 생성할까요? 리눅스 시스템에서 프로세스 생성을 전담하는 프로세스가 있습니다. 주인공은 init과 kthreadd 프로세스입니다.   유저레벨프로세스는 init 프로세스, 커널 레벨 프로세스(커널 스레드)는 kthreadd 프로세스가 생성합니다. 그런데 프로세스는 생성이 아니라 복제된다고 말할 수 있습니다.     1.2  프로세스 생성      "그러면 프로세스를 생성할 때 부모 프로세스를 복제하는 이유는 무엇일까?"    프로세스를 생성할 때 프로세스에게 필요한 리소스를 각각 할당 받으면 시간이 오..