Practical RTOS Internals
practical-internals 53
Practical RTOS Internals — 실시간 커널 내부 분석 시리즈 소개
RTOS를 사용하는 것이 아니라 이해하고 구현하는 법. Scheduler, context switch, memory allocator의 내부 동작을 소스 코드 수준에서 분석합니다.
RTOS가 필요한 이유 — 일반 OS와의 결정적 차이
Super-loop는 모든 작업이 직렬화되어 deadline을 보장하지 못합니다. RTOS는 preemption과 우선순위로 실시간성을 확보합니다.
Task와 Thread 개념 — TCB·상태 머신·생명 주기 분석
Task는 stack과 TCB, 상태로 구성됩니다. 5상태 머신(Running·Ready·Blocked·Suspended·Deleted)과 그 전이를 다룹니다.
실시간 스케줄링 알고리즘 비교 — RR·Priority·EDF·RMS
Round Robin, Priority-based preemptive, Earliest Deadline First, Rate Monotonic을 다룹니다. 임베디드 RTOS는 대부분 fixed-priority preemptive를 씁니다.
Preemption과 Cooperation — 강제 전환 vs 자발 양보
Preemptive는 tick과 IRQ에서 강제로 전환합니다. Cooperative는 yield를 명시해야 합니다. latency와 predictability의 trade-off를 다룹니다.
인터럽트와 RTOS — ISR Context·Deferred Processing·FromISR API
ISR은 task가 아니므로 context도 따로 관리됩니다. Long work는 deferred task로 넘기고, FromISR API 패턴을 씁니다.
동기화 기초 분석 — Critical Section·Mutual Exclusion·Race Condition
공유 자원 보호의 3가지 도구로 interrupt disable, spinlock, mutex가 있습니다. 언제 어느 것을 쓰는지 정리합니다.
Semaphore 개념 분해 — Counting·Binary·P/V 연산
Dijkstra의 P/V(1965)에서 출발한 Counting(N 자원)과 Binary(신호) 세마포어를 다룹니다. ISR에서 task로 신호를 전달하는 표준 도구입니다.
Mutex 개념 분해 — Ownership·Recursive·Priority Inheritance
공유 자원 보호의 정답입니다. Owner tracking 덕에 PI가 가능하고, recursive로 재진입도 허용합니다.
큐와 메시지 패싱 — Producer-Consumer·Ring Buffer·전달 의미
Task 간 데이터 전달의 표준입니다. FreeRTOS는 by-value copy이며, 대용량은 pointer queue로 처리합니다.
실시간성 분석 — Latency·Jitter·Deadline·WCET·RMA
4 핵심 지표인 Latency, Jitter, Deadline, WCET를 다룹니다. Hard와 Soft real-time의 차이, Rate Monotonic Analysis로 schedulability를 증명하는 방법을 살펴봅니다.
Ready List 자료구조 분석 — Linked List·Bitmap·O(1) Scheduler
Ready 상태 task를 보관하는 자료구조 선택이 곧 스케줄러 latency를 결정합니다. FreeRTOS의 array-of-lists, bitmap + CLZ 최적화, uC/OS의 8×8 LUT까지 한 번에 정리합니다.
Blocked List 자료구조 — Timeout 정렬·Delta List·Two-List Scheme
Blocked task의 timeout 관리. Sorted list + tick wraparound 처리. FreeRTOS의 2-list scheme.
Scheduler 알고리즘 구현 추적 — Next-Task Selection 로직
FreeRTOS pxCurrentTCB 결정. CLZ 최적화, tie-breaking, scheduler entry points.
Context Switch 원리 분석 — 레지스터 저장·복원·Stack Frame
Context switch는 결국 CPU의 모든 가시 상태를 task 스택에 통째로 복제하는 일입니다. 어디서 발생하고, 무엇을 저장하고, 비용은 얼마인지 아키텍처 중립적으로 정리합니다.
ARM Cortex-M Context Switch — PendSV·MSP/PSP 어셈블리 추적
Cortex-M context switch는 PendSV 예외와 dual-stack 모델로 압축됩니다. FreeRTOS port의 PendSV 핸들러 어셈블리를 한 줄씩 따라가며 EXC_RETURN, BASEPRI, lazy FPU까지 풀어봅니다.
ARM Cortex-A Context Switch — Mode 전환·SVC·Banked Registers
Cortex-A의 7 모드와 모드별 banked register. 모드 간 SP·LR 별도 — Cortex-M보다 복잡.
RISC-V Context Switch 분석 — ECALL·mret·CSR
RISC-V는 모든 레지스터 SW save. ECALL/mret + CSR (mscratch/mepc/mcause/mstatus).
RTOS Tick과 타이머 — SysTick·Generic Timer·configTICK_RATE_HZ
RTOS의 심장 박동. SysTick 1 kHz가 표준 — Hz 선택의 trade-off.
Tickless 모드 구현 — Idle Tick Suppression·Sleep·Wake 보정
Idle 시 SysTick 멈춤 + CPU sleep. 다음 task wake 시점까지 동적 timer 설정. 배터리 IoT 핵심.
Scheduler Latency 측정 기법 — GPIO Toggle·DWT·ftrace·cyclictest
ISR 종료 → ready task 실행까지의 시간. 측정 방법과 worst-case 추적.
RTOS Tracing과 Observability — Tracealyzer·SystemView·ITM/ETM
Percepio Tracealyzer와 Segger SystemView, Cortex-M의 ITM/ETM 하드웨어 트레이스. Task switch·ISR·queue·mutex 이벤트를 시간축에 펼쳐 인과를 추적합니다.
Critical Section 구현 비교 — IRQ Disable·BASEPRI·Spinlock
3 가지 구현 — cpsid/BASEPRI mask, taskENTER_CRITICAL, SMP spinlock. Hold time이 latency 결정.
Semaphore 내부 구현 추적 — Counter·Wait List·ISR-Safe Variant
FreeRTOS semaphore = Queue wrapper. Counter + priority-sorted wait list.
Mutex 내부 구현 추적 — Owner·Recursion Count·ISR 금지
Mutex = Semaphore + pxMutexHolder + uxBasePriority. Recursive variant는 lock-count.
Priority Inversion 문제 — Mars Pathfinder 사례·Bounded vs Unbounded
고우선 task가 저우선 task 때문에 막힘. 1997 화성 탐사선 reset의 원인.
Priority Inheritance 구현 — Inherit·Disinherit·Chain
FreeRTOS PI 코드 분석 — vTaskPriorityInherit, vTaskPriorityDisinherit, chain handling.
Priority Ceiling Protocol — Immediate vs Original 비교
PI의 대안. 각 mutex에 정적 ceiling — take 즉시 boost. Deadlock 방지.
Queue 내부 구현 추적 — Ring Buffer·2 Wait Lists·Atomic Send/Receive
FreeRTOS Queue 코드 — pcWriteTo·pcReadFrom·uxMessagesWaiting + xTasksWaitingToSend/Receive.
Event Group 분석 — Bit Flag·AND/OR Wait·Sync Barrier
FreeRTOS Event Group — 24-bit flag, AND·OR semantics, clear-on-exit, multi-task sync.
ISR-Safe API 설계 — FromISR 패턴·Higher Priority Wake·Deferred Work
FromISR API 내부 구조와 pxHigherPriorityTaskWoken, yield 결정, deferred work 패턴을 정리합니다.
Deadlock 분석 — 4 조건·Wait-for Graph·Lock Ordering·Timeout
Coffman의 네 조건과 wait-for graph 분석, lock ordering, timeout, hierarchical locking을 살펴봅니다.
Stream Buffer와 Message Buffer — FreeRTOS 10의 Lock-Free SPSC
FreeRTOS 10+ 추가된 Stream/Message Buffer. Lock-free SPSC ring buffer로 queue보다 10배 빠른 IPC. ISR-safe variant, byte stream vs variable-length frame의 선택.
실시간 메모리 요구사항 — Determinism·Fragmentation·WCET
동적 할당의 한계와 fragmentation, WCET-bounded allocator, safety-critical 기준을 살펴봅니다.
FreeRTOS Heap_1~5 분석 — 5종 Allocator의 구조와 트레이드오프
FreeRTOS가 제공하는 다섯 가지 heap 구현을 source 수준에서 비교합니다. heap_1의 bump부터 heap_5의 multi-region까지, 실시간성과 단편화 관점에서 어떤 워크로드에 어떤 구현이 맞는지 정리합니다.
TLSF Allocator 분석 — Two-Level Segregated Fit O(1)
Masmano 2004의 TLSF 알고리즘을 풀어봅니다. Bitmap과 CLZ 명령으로 alloc·free·coalesce 모두 O(1)을 보장하며, 자동차·로봇·RT 게임의 표준 dynamic allocator가 된 이유를 살펴봅니다.
Static Allocation — 컴파일 타임으로 동적 위험 제거하기
모든 RTOS 객체를 컴파일 타임에 fixed로 두는 패턴입니다. FreeRTOS Static API, Zephyr 매크로, linker section 배치, MISRA/DO-178C 호환성까지 정리합니다.
Memory Pool — Fixed-Size Block Allocator의 단순함과 강력함
같은 크기 객체를 다수 alloc/free하는 패턴을 위한 fixed-size pool입니다. free list 구조, O(1) 보장, per-class pool, lock-free 변형까지 실전 패턴을 정리합니다.
Stack Overflow 탐지 — Canary·MPU·Watermark 3중 방어
임베디드 가장 흔한 silent bug가 스택 오버플로우입니다. FreeRTOS canary, MPU region 기반 hardware 보호, high-water mark 측정, 정적 분석 도구까지 다층 방어 전략을 정리합니다.
SMP RTOS 설계 — Ready List·Affinity·IPI·Load Balancing
FreeRTOS 11 SMP와 Zephyr SMP를 단일 ready list와 per-CPU ready list 두 축으로 비교합니다. task affinity, IPI, cross-core wake, cache coherency 경계까지 설계 관점에서 정리합니다.
SMP Spinlock 구현 — LDREX/STREX·Ticket Lock·MCS·WFE/SEV
ARM LDREX/STREX exclusive monitor와 ARMv8.1 LSE를 출발점으로 SMP spinlock 구현을 따라갑니다. test-and-test-and-set, ticket lock, MCS lock의 fairness와 cache bouncing trade-off, WFE/SEV로 만드는 저전력 spin을 정리합니다.
Software Timer 분석 — Daemon Task·자료구조·ISR-Safe API
FreeRTOS Software Timer 내부를 따라가며 daemon task 구조, sorted list와 timer wheel 자료구조, one-shot/auto-reload 동작, xTimerStartFromISR과 xTimerPendFunctionCall을 통한 ISR 워크 deferral을 정리합니다.
RTOS System Call — SVC·ECALL·User/Kernel 분리·FreeRTOS-MPU
MPU/MMU로 user task와 kernel을 분리하는 RTOS의 syscall 구조를 정리합니다. Cortex-M의 SVC trap, RISC-V의 ECALL, FreeRTOS-MPU와 Zephyr USERSPACE의 차이, capability 검사, syscall overhead 측정까지 다룹니다.
TrustZone과 TF-M — Secure/Non-Secure·NSC Veneer·PSA
Cortex-M33/M55/M85의 TrustZone-M과 TF-M secure firmware를 정리합니다. SAU/IDAU로 메모리를 secure/non-secure로 가르고, NSC veneer + SG 명령으로 안전하게 cross-world call을 수행하는 구조, PSA Crypto/Storage/Attestation API, secure boot chain까지 다룹니다.
AMP와 OpenAMP — Heterogeneous SoC·RPMsg·remoteproc
Cortex-A와 Cortex-M이 한 칩 위에서 별도의 OS를 돌리는 AMP 구조를 정리합니다. OpenAMP framework(libmetal/RPMsg/remoteproc), virtio-vring 기반 shared memory IPC, mailbox 인터럽트, i.MX·STM32MP·RP2350 사례까지 다룹니다.
C++ in RTOS — RAII·std::thread·ETL·Coroutine
RTOS C API를 C++ 객체로 감싸는 패턴을 정리합니다. RAII MutexGuard와 ScopedIRQDisable, std::thread/std::mutex의 한계와 직접 xTaskCreate가 결정성을 갖는 이유, ETL로 STL을 대체하는 법, C++20 coroutine을 RTOS 위에 얹는 방식까지 다룹니다.
FreeRTOS 소스 분석 — tasks.c·queue.c·port.c 추적
FreeRTOS-Kernel 저장소의 핵심 파일 셋을 따라가며 xTaskCreate부터 PendSV까지의 흐름을 정리합니다. TCB·ready list·port 계층 사이의 경계가 어떻게 그어져 있는지 source 수준에서 살펴봅니다.
Zephyr 커널 분석 — k_thread·k_sem·Driver Model
Zephyr 커널 서브트리를 따라가며 sched.c·thread.c·sem.c의 핵심을 읽습니다. devicetree로 드라이버 인스턴스가 만들어지는 경로와 KConfig·west 빌드 체계까지 한 지도 위에 모읍니다.
RT-Thread 분석 — Object 모델·Components·Smart·Studio
RT-Thread의 object-oriented C 설계와 component 생태계를 따라갑니다. FreeRTOS급 경량 kernel 위에 DFS·LwIP·POSIX·FinSH가 어떻게 얹히는지, Smart variant가 무엇을 더 가져오는지 정리합니다.
RTOS 포팅 가이드 — 새 아키텍처에 옮기는 절차
FreeRTOS와 Zephyr의 port 계층을 따라가며 새 아키텍처에 RTOS를 옮기는 절차를 정리합니다. initial stack frame, context switch assembly, tick source, critical section primitive까지 한 번에 잡습니다.
RTOS 선택 가이드 — Footprint·License·Certification·Ecosystem
FreeRTOS·Zephyr·ThreadX·RT-Thread·NuttX·VxWorks·QNX·INTEGRITY·SafeRTOS·µC/OS·PX5를 한 표에 모아 비교합니다. IoT·자동차·항공·산업·의료·웨어러블·드론별 추천과 결정 기준을 정리합니다.
Apache NuttX 분석 — POSIX·PX4·NASA Ingenuity
NuttX의 POSIX-compliant 구조를 따라가며 PX4 autopilot과 NASA Ingenuity 화성 헬리콥터 채택 배경을 정리합니다. Flat/Protected/Kernel 빌드, VFS, 네트워크, NSH, micro-ROS 통합까지 한 지도로 모읍니다.
PREEMPT_RT Linux — Mainline 6.12·Xenomai 4·EVL
2024년 9월 Linux 6.12 mainline에 합류한 PREEMPT_RT의 핵심 변경을 정리하고, Xenomai 4·EVL과 함께 RTOS와의 선택 기준을 비교합니다. threaded IRQ·sleeping spinlock·cyclictest까지 한 지도에 모읍니다.