본문 바로가기

Core BSP 분석

(119)
[리눅스커널] 커널 로그 레벨 수정 - 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_..
[리눅스커널] ARMv8: 슬럽 오브젝트의 트랙(track) 구조체를 TRACE32로 디버깅하기 이번 시간에는 64비트 기반 ARMv8 아키텍처(커널 4.19 버전)에서의 슬럽 오브젝트의 디버깅 정보를 확인해보겠습니다. 슬럽 오브젝트의 패턴을 빨리 확인하는 좋은 컨텐츠였으면 좋겠습니다. 크래시 유틸리티로 슬랩 페이지(kmalloc-256)를 확인 ffffffbf50925d00 슬럽 오브젝트의 속성을 확인하기 위해 'kmem ffffffbf50925d00' 명령어를 입력하겠습니다. 여기서 kmem 오른쪽에 보이는 주소는 슬랩 페이지 디스크립터입니다. crash64> kmem ffffffbf50925d00 1 CACHE OBJSIZE ALLOCATED TOTAL SLABS SSIZE NAME 2 ffffffd3c08e7780 256 36025 36046 1718 16k kmalloc-256 3 SLAB..
[리눅스커널] ftrace: 콜 스택을 메시지로 출력하기(CALLER_ADDR0~CALLER_ADDR3) Overview ftrace로 다양한 디버깅 정보를 출력할 수 있다. 물론 function, function_graph 트레이서를 활용해 화려한 디버깅 정보를 볼 수 있는데, nop 트레이서로 다음과 같은 정보를 보면 유용할 것이다. rcu_preempt-9 [000] ...1 5429.091523: sched_preemption_execute: delta=8890468(ns) Callers: (schedulecaller_addr0 = (void *)caller_addr0; + __entry->caller_addr1 = (void *)caller_addr1; + __entry->caller_addr2 = (void *)caller_addr2; + __entry->caller_addr3 = (void *)..
[리눅스커널] 특정 CPU를 Isolation 시키고 싶은 경우 프로젝트를 진행하다 보면 특정 CPU를 Isolation 시키고 싶을 때가 있습니다. 이 때 다음 패치(CPU2와 CPU3를 Isolation)를 적용하면 됩니다. * 커널 4.19 버전 diff --git a/kernel/cpu.c b/kernel/cpu.c index d9f855c..816bf4f 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -1126,6 +1126,10 @@ static int do_cpu_up(unsigned int cpu, enum cpuhp_state target) { int err = 0; + if(cpu == 2 | cpu ==3) { + return -EINVAL; + } + if (!cpu_possible(cpu)) { pr_er..