본문 바로가기

리눅스 커널의 구조와 원리

(88)
[Linux kernel] __switch_to (RISC-V) The following routine performs the context switching: ENTRY(__switch_to) /* Save context into prev->thread */ li    a4,  TASK_THREAD_RA add   a3, a0, a4 add   a4, a1, a4 REG_S ra,  TASK_THREAD_RA_RA(a3) REG_S sp,  TASK_THREAD_SP_RA(a3) REG_S s0,  TASK_THREAD_S0_RA(a3)  // x8 REG_S s1,  TASK_THREAD_S1_RA(a3)  // x9 REG_S s2,  TASK_THREAD_S2_RA(a3)  // x18  REG_S s3,  TASK_THREAD_S3_RA(a3)  // x19..
[Linux kernel] Enable CONFIG_DEBUG_INFO by reverting CONFIG_DEBUG_INFO_NONE The patchset to enable CONFIG_DEBUG_INFO_NONE is proposed to speed-up the compilation time. In real project, the CONFIG_DEBUG_INFO_NONE is not used because the build-server that we are using support powerful performance. When applying the following patch, you will see that CONFIG_DEBUG_INFO is included in the .config file.diff --git a/lib/Kconfig.debug b/lib/Kconfig.debugindex bf0995d328b3..a2f9..
[리눅스 커널] 전처리 파일 생성 (v6.10) During compilation, the compiler may generate various files, such as object file, libraray file and preprocessed file. Among these, preprocessed file contain the valuable information because the compiler parses the representation macro into the readable statement. To get preprocessed in the Linux kernel, we have to modify Makefile. The following is the patchset to generate preprocessed in the Li..
[리눅스커널] 커널이 실행 시각을 관리하는 방식을 왜 잘 알아야 할까? 커널이 실행 시각을 관리하는 방식을 왜 잘 알아야 하는지 생각해봅시다. 첫째, 코드를 읽는 능력을 더 키울 수 있습니다. 리눅스 커널 세부 함수나 드라이버 코드에서 실행 시간을 기준으로 흐름을 제어하는 경우가 많습니다. 커널 코드를 읽으면 타이머 관련 함수를 써서 실행 시간을 제어하는 루틴을 만날 가능성이 높습니다. 드라이버 코드를 읽다가 타이머 관련 함수를 만나면 바로 이해해야 드라이버 구조를 이해할 수 있습니다. 둘째, 커널 타이머 구조를 알면 안정적인 타이머 코드를 입력해 시간 흐름을 제어할 수 있습니다.  다른 드라이버 코드를 참고해 타이머 코드 작성하는 작업은 누구나 할 수 있습니다. 하지만 커널 타이머 전체 실행 흐름을 아는 분은 커널 타이머가 Soft IRQ 서비스로 실행한다는 사실을 알기에..
[Debug] Simple slub configuration If you enable the following configuration, the slub debugging feature is enabled without using SLUB_DEBUG. CONFIG_POMPEII_SLUB_SIMPLE_DEBUG=y CONFIG_POMPEII_SLUB_FREEPOINTER_DEBUG=y The advantage of this patch is that you are not going through any performance degradation.  This patch is generated based on v4.9.[Part.1]slub: simple debug feature added---diff --git a/arch/arm64/mm/pageattr.c b/arc..
[리눅스커널] 커널 타이머 관리: 주요 개념 소개 (HZ, jiffies) 커널 타이머는 리눅스 커널 핵심 기능 중 하나입니다. 커널 내부에서 배경 작업으로 다음 동작을 수행합니다. - 커널 스케줄링 함수들은 커널 타이머를 써서 프로세스를 제어합니다. - 시스템 시간은 타이머 인터럽트를 받아 주기적으로 갱신됩니다. - Soft IRQ 타이머 서비스를 주기적으로 실행해 동적 타이머를 관리합니다. 또한 리눅스 커널 세부 알고리즘과 디바이스 드라이버는 실행 시간을 기준으로 세부 제어를 합니다. 예시를 들면 다음과 같습니다. - 어떤 함수를 현재 시각 기준으로 200ms 초 후에 실행 - 어떤 함수가 500ms 내에 실행 안 하면 예외 처리 - 특정 함수를 1초 주기로 실행해서 시스템 상태를 점검 리눅스 커널이나 드라이버 코드를 분석하면 커널 타이머와 시간 흐름을 제어하는 코드를 만날..
[리눅스커널] IRQ 스레드를 생성하는 시점 확인하기 이번 포스트에서는 IRQ 스레드를 생성하는 과정을 알아 봅시다.IRQ 스레드는 언제 생성할까?IRQ 스레드를 생성하기 위해서는 request_threaded_irq() 함수를 호출하면 됩니다.  IRQ 스레드를 생성하는 흐름도는 다음과 같습니다.   request_threaded_irq() 함수를 호출하면 다음 동작을 수행합니다.  - 전달한 IRQ 스레드 정보를 인터럽트 컨택스트에 설정  - kthread_create() 함수를 호출해서 IRQ 스레드 생성 kthread_create() 함수는 kthread_create_on_node() 함수로 치환됩니다. 위 그림에서 이해를 돕기 위해 kthread_create() 함수를 호출하면 kthread_create_on_node() 함수를 호출하는 것처럼 표..
[리눅스커널] 인터럽트 후반부 처리 기법 종류 및 소개 리눅스 커널이 Bottom Half을 처리하는 대표적인 기법으로 IRQ 스레드와 Soft IRQ이 있습니다. 워크큐는 워크큐를 다루는 포스트에서 살펴볼 예정입니다. 세 가지 기법 인터럽트 후반부 처리하는 방식이 조금씩 다릅니다. 하지만 인터럽트 핸들러에서 해야 할 일을 2 단계로 나눈다는 점은 같습니다.  이 세 가지 기법의 특징이 뭔지 알아보겠습니다.  IRQ 스레드   인터럽트를 처리하는 전용 IRQ 스레드에서 인터럽트 후속 처리를 합니다. 만약 rasp란 24번 인터럽트가 있으면 “irq/24-rasp”란 IRQ 스레드가 24번 인터럽트 후반부를 전담해서 처리합니다. Soft IRQ   인터럽트 핸들러 실행이 끝나면 바로 일을 시작합니다. 인터럽트 핸들러 바로 처리해야 할 일을 마무리한 후 인터럽트..