본문 바로가기

Core BSP 분석/리눅스 커널 핵심 분석

(90)
[리눅스] 프로세스를 지정한 CPU에서 실행: sched_setaffinity() 함수 소형 임베디드 장비를 제외하고는 대부분 시스템은 멀티 CPU 코어 환경에서 개발됩니다. 멀티 프로세스(Multiprocess) 기반으로 작성된 데몬을 실행하면 여러 CPU 코어에 적당히 나뉘어 실행되는 것을 쉽게 볼 수 있습니다. CPU0에서 실행됐다가 CPU2에서 실행되는 것이죠. 그런데 가끔은 특정 작업을 수행하는 프로세스가 특정 CPU 코어에서 실행되도록 설정해야 할 때가 있습니다. 여러가지 이유가 있지만 요약하면 다음과 같습니다. * 실행하는 프로세스와 관련된 인터럽트가 특정 CPU 코어에서만 트리거됨(IRQ Affinity라고 하죠.) * 프로세스가 여러 CPU 코어에 옮겨 다니면서 실행할 때 요구되는 오버헤드(마이그레이션)을 최소화하자 참고로 커널이 프로세스를 어떤 CPU 코어에 할당하는지는,..
[리눅스커널] CONFIG_FUNCTION_TRACER를 키는 방법 defconfig 파일에서 아래 컨피그를 추가하면, CONFIG_IRQSOFF_TRACER=y CONFIG_SCHED_TRACER=y CONFIG_STACK_TRACER=y .config에서 아래 내용을 확인할 수 있다. CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_IRQSOFF_TRACER=y # CONFIG_PREEMPT_TRACER is not set CONFIG_SCHED_TRACER=y
[리눅스] LK(Little Kernel): 전처리 파일을 위한 설정(--save-temps) LK(Little Kernel)에서 전처리 파일을 추출하기 위해서 아래 패치 코드를 반영하면 됩니다. diff --git a/engine.mk b/engine.mk index 74f289c..51ff0f1 100644 --- a/engine.mk +++ b/engine.mk @@ -204,7 +204,7 @@ endif # default to no ccache CCACHE ?= -CC := $(CCACHE) $(TOOLCHAIN_PREFIX)${TOOLCHAIN} +CC := $(CCACHE) $(TOOLCHAIN_PREFIX)${TOOLCHAIN} --save-temps LD := $(TOOLCHAIN_PREFIX)ld OBJDUMP := $(TOOLCHAIN_PREFIX)objdump OBJCOPY ..
[리눅스커널] 커널 로그 레벨 수정 - console_printk 확인 리눅스 시스템을 개발할 때 가장 많이 활용하는 로그는 무엇일까요? * 커널 로그죠. 그런데 가끔 실전 개발에서 커널 로그 레벨을 조정해야 할 때가 있어요. 예를 들면 개발 버전이 아니라 릴리즈 버전을 배포할 때 변경하죠. 이번 시간에는 커널 로그 레벨을 3으로 내리는 방법에 대해 소개합니다. 코드 수정 커널 로그 레벨을 3으로 내리려면 다음과 같이 코드를 수정해야 합니다. 1. 커널 코드(컨피그) 다음과 같은 커널 컨피그를 추가해야 합니다. CONFIG_MESSAGE_LOGLEVEL_DEFAULT=3 2. 디바이스 트리 혹은 board make file 다음 커널 커맨드 라인이 추가 되도록 부트로더 코드를 수정해야 합니다. rcupdate.rcu_expedited=2 rcu_nocbs=0-7 loglev..
[리눅스커널] cpu_frequency ftrace 이벤트: CPU 코어의 주파수 리눅스 커널에서는 CPU Frequency를 트레이싱할 수 있는 ftrace event를 제공합니다. 그 정체는 cpu_frequency 이벤트입니다. 먼저 ftrace 이벤트를 정의하는 코드를 보겠습니다. 다음은 cpu_frequency 이벤트의 선언부입니다. https://elixir.bootlin.com/linux/v4.19.30/source/include/trace/events/power.h 01 DEFINE_EVENT(cpu, cpu_frequency, 02 03 TP_PROTO(unsigned int frequency, unsigned int cpu_id), 04 05 TP_ARGS(frequency, cpu_id) 06 ); 01번째 줄과 같이 cpu_frequency 이벤트는 cpu란 이벤..
[리눅스커널] CPU 코어의 주파수(Frequency) 확인하기 - cpufreq_cpu_data 리눅스 커널에서 CPU Frequency는 성능을 측정할 때 중요한 척도 중 하나입니다. 이번 시간에는 리눅스 커널에서 CPU Frequency와 관련된 자료 구조를 소개합니다. cpufreq_cpu_data 선언부 cpufreq_cpu_data는 커널에서 CPU 주파수를 저장하는 중요한 변수입니다. 먼저 cpufreq_cpu_data 변수의 선언부를 봅시다. https://elixir.bootlin.com/linux/v4.19.30/source/drivers/cpufreq/cpufreq.c static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data); 보시다시피 DEFINE_PER_CPU 키워드와 함께 cpufreq_policy 구조체로 선언된 변..
[리눅스커널] 디버깅: 커널 로그 레벨(/proc/sys/kernel/printk)을 누가 설정하나? Background 부팅 도중에는 '/proc/sys/kernel/printk' 파일이 다음과 같았다가, austin:/ $ cat /proc/sys/kernel/printk 6 6 1 7 부팅이 끝난 후 '/proc/sys/kernel/printk' 파일이 다음과 같이 바뀝니다. austin:/ $ cat /proc/sys/kernel/printk 7 6 1 7 부팅 과정에서 어딘가 rc 파일에서 다음 명령어로 '/proc/sys/kernel/printk'을 바꾸는 것 같다는 생각이 듭니다. echo "7 6 1 7" > /proc/sys/kernel/printk 분석 리눅스 시스템을 구동하기 위해 설정되는 정보는 '/proc/sys/kernel' 폴더에서 확인할 수 있습니다. 이번에는 커널 로그 레벨..
[리눅스커널] 유저 프로세스의 레지스터 세트인 struct pt_regs 파악하기 리눅스 커널에서 sys_enter ftrace 이벤트를 키면 syscall_trace_enter() 함수가 호출된다. syscall_trace_enter() 함수의 첫 번째 인자로 'struct pt_regs *regs' 가 전달되는데 이 정체를 확인해보자. 다음은 syscall_trace_enter() 함수의 구현부이다. https://elixir.bootlin.com/linux/v4.19.122/source/arch/arm/kernel/ptrace.c asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) { current_thread_info()->syscall = scno; if (test_thread_flag(TIF_SYSCALL_..