Core BSP 분석/리눅스 커널 핵심 분석 (90) 썸네일형 리스트형 [리눅스커널] 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.. [리눅스커널] GCC: notrace 옵션 - no_instrument_function walk_stackframe() 함수의 구현부를 보면 notrace 키워드로 선언됐음을 알 수 있습니다. https://elixir.bootlin.com/linux/v4.19.30/source/arch/arm/kernel/stacktrace.c void notrace walk_stackframe(struct stackframe *frame, int (*fn)(struct stackframe *, void *), void *data) { while (1) { int ret; if (fn(frame, data)) break; ret = unwind_frame(frame); if (ret < 0) break; } } EXPORT_SYMBOL(walk_stackframe); 이 함수를 전처리 코드에서 확인하면 .. [리눅스커널] ssize_t와 size_t의 실체 ssize_t와 size_t 타입의 실체를 확인해보자. 아래 코드를 전처리 코드로 확인해볼까? static ssize_t default_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos) { return 0; } size_t 타입의 정체 먼저 size_t의 정체를 확인해보자. 280 # 55 "/root/src/kernel_src/linux/include/linux/types.h" 281 typedef __kernel_size_t size_t; size_t 는 __kernel_size_t로 캐스팅 된다. 201 # 68 "/root/src/kernel_src/linux/include/uapi/asm-generic/posix.. [Crash-Utility][리눅스커널][디버깅] Radix Tree(라덱스-트리) 디버깅 하기(크래시 유틸리티) 리눅스 커널에서는 라덱스 트리로 핵심 자료구조를 관리합니다. 이번 시간에는 크래시 유틸리티로 라덱스 트리를 디버깅하는 방법을 소개합니다. 라덱스 트리를 보기 위한 명령어 크래시 유틸리티로 라덱스 트리 노드를 보기 위한 명령어 포멧은 다음과 같습니다. tree -t radix -N (struct radix_tree_node *) 구조체 주소 struct radix_tree_node 구조체 시작 주소만 알면 됩니다. struct radix_tree_node 구조체 주소가 0xFFFFFFFF3A806E79 인 경우 출력 결과는 다음과 같습니다. crash64_kaslr> tree -t radix -N 0xFFFFFFFF3A806E79 ffffffff3f53c180 ffffffff3f53c4c0 ffffffff.. [리눅스커널] 비트 마스크를 어셈블리 코드로 빨리 읽는 방법 - HARDIRQ_MASK, SOFTIRQ_MASK, NMI_MASK 이번에는 비트 마스크를 C 코드가 아닌 어셈블리 코드로 읽는 방법을 소개합니다. in_interrupt() 함수 소개 in_interrupt() 함수는 현재 프로세스가 인터럽트 컨택스트인지 알려주는 기능입니다. [https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/preempt.h] #define in_interrupt() (irq_count()) in_interrupt() 함수 코드를 보면 irq_count() 함수로 치환됩니다. [https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/preempt.h] #define irq_count() (preempt_count() & (HARDI.. [리눅스커널] smp thread에 대해서 smpboot(smp thread) 스레드 사용 배경 최근에 사용되는 대부분 시스템은 멀티 프로세서 기반으로 실행됩니다. 예를 들어 인터넷이나 TV 광고에서 "최신 인텔 멀티 프로세서 코어가 적용된 제품"이란 이야기가 들리죠. 일반 대중이 하나 이상 쓰고 있는 휴대폰도 멀티 프로세서 시스템 기반입니다. 휴대폰에는 Arm 프로세서가 탑재됐는데, CPU 코어의 갯수가 8개 이상 구성돼 있죠. 리눅스 커널에서도 이런 멀티 프로세서 구조에서 이를 소프트웨어로 처리하는 드라이버와 같은 존재가 있는데요. 이를 smpboot 혹은 smp 핫 플러그 스레드라고 합니다. smpboot(smp thread) 스레드 확인하기 그렇다면 smpboot로 등록한 커널 프로세스는 어떻게 확인할 수 있을까요? 리눅스 터미널에서 'p.. 이전 1 2 3 4 5 6 7 8 ··· 12 다음