KRN-OBJ - Kernel Objects, Lifecycle, and Storage¶
Documentation revision: 2026-10-14 (ADR-039; M1 amendment log). Existing status dates record original design acceptance, not validation of the revised wording. New implementation obligations remain Proposed until implemented and verified.
Group KRN-OBJ. Design: docs/specs/SPEC-009-objects-capabilities-and-storage.md. Related groups: KRN-CAP (handles and rights), KRN-WAIT (flush on destroy), KRN-PART (restart), BLD (storage generator), OBS (debug descriptor).
KRN-OBJ-001 to 005 originate in docs/architecture/03-kernel-architecture.md §7.4 (004 and 005 added by R-003 and ADR-032). All are restated here as the authoritative copy. New requirements start at 006.
Requirements¶
KRN-OBJ-001 Destroy with waiters¶
Statement. Destroying an object with waiters is a kernel fault in checked builds unless the object was created with ABORT_WAITERS, in which case every waiter wakes with DESTROYED.
Rationale. ADR-020: lifecycle bugs are caught; deliberate teardown is explicit.
Status. Accepted 2026-10-07
Verification. Test: wait/destroy_abort_waiters, misuse/destroy_with_waiters; model scenario destroy_with_waiters.
Trace. SPEC-009 §6; SPEC-004 §6.7; ADR-020
KRN-OBJ-002 Generation bump on destroy¶
Statement. After destruction, the object’s generation shall be bumped so stale capabilities fail validation in profiles that check them.
Rationale. Use-after-destroy becomes EMB_ESTALE instead of corruption.
Status. Accepted 2026-10-07
Verification. Test: obj/stale_after_destroy (INDEXED and TABLE models).
Trace. SPEC-009 §3.2, §3.3, §6
KRN-OBJ-003 Caller owns storage¶
Statement. Object storage ownership belongs to whoever provided it; the kernel never frees caller storage.
Rationale. No allocator in the kernel path.
Status. Accepted 2026-10-07
Verification. Analysis: no free call in kernel/; Test: storage reusable after destroy.
Trace. SPEC-009 §5, §6
KRN-OBJ-004 System freeze¶
Statement. emb_system_freeze() shall, once called, make every create and destroy operation fail with EMB_EPERM (fault in checked builds) for the rest of the run; the isolated reference configuration shall call it at the end of initialization.
Rationale. uC/OS-III’s safety-critical start; a frozen object set is what a certification argument wants.
Status. Accepted 2026-10-07
Verification. Test: obj/freeze_blocks_init_destroy; isolated configuration review.
Trace. SPEC-009 §6
KRN-OBJ-005 Thread and partition generations¶
Statement. Thread and partition handles shall carry a generation in every profile that checks generations; a wait on a handle whose generation changed because of a restart shall complete with EMB_ESTALE.
Rationale. ADR-032: restarts are visible to peers.
Status. Accepted 2026-10-07
Verification. Isolated-profile test part/join_restarted_thread_estale; model scenario (SPEC-010).
Trace. SPEC-009 §6; ADR-032
KRN-OBJ-006 Common header¶
Statement. Every object shall begin with the header of SPEC-009 §2 (type_tag, lifecycle, flags, and the configured optional fields); fields not configured shall occupy no storage; the tiny release header shall be one byte.
Rationale. One place for validation, registry, binding, and naming; zero cost where not used.
Status. Accepted 2026-10-07
Verification. Analysis: _Static_assert on header size per configuration; footprint test.
Trace. SPEC-009 §2
KRN-OBJ-007 Lifecycle states¶
Statement. Objects shall move UNINIT to ACTIVE at init, ACTIVE to DESTROYING to UNINIT at destroy; init on active storage shall be EMB_EEXIST (fault in checked builds); operations on a DESTROYING object shall return EMB_ESTATE.
Rationale. Double init and destroy races have defined outcomes.
Status. Accepted 2026-10-07
Verification. Test: misuse/double_init, SMP test obj/op_during_destroy_estate.
Trace. SPEC-009 §6
KRN-OBJ-008 Generated storage types¶
Statement. <emb/storage.h> shall be generated from a layout probe compiled for the target with the final configuration and read with the toolchain’s object reader; kernel sources shall statically assert the real sizes and alignments against it; the header shall carry the configuration hash and a mismatch shall fail the build.
Rationale. ADR-006 without mirrored structs or exposed layouts.
Status. Accepted 2026-10-07
Verification. Build test: a deliberately stale header fails to build; Analysis: generator review.
Trace. SPEC-009 §5.1; ADR-006; BLD-007
KRN-OBJ-009 Init table¶
Statement. _DEFINE macros shall register objects in the bracketed section .emb_init_table; emb_kernel_init() shall construct them in link order before scheduler start; EMB_INIT_AFTER shall order dependent objects; the mechanism shall use the port’s supported section/table mechanism; M1 AVR requires the board linker script to bracket flash entries (A8).
Rationale. Static objects without hand-written init code, on AVR too (09 §7).
Status. Accepted 2026-10-07
Verification. Test: init-table construction during emb_kernel_init() on every port including AVR.
Trace. SPEC-009 §5.2; SPEC-001 §6.4
KRN-OBJ-010 Type-specific destroy conditions¶
Statement. Destroy shall be refused with EMB_EBUSY (fault in checked builds) for an owned mutex, a pool with outstanding blocks, a timer with a pending or running callback, a work queue with items, and a thread that is not inactive or terminated-and-reusable.
Rationale. The kernel never leaves a dangling owner.
Status. Accepted 2026-10-07
Verification. Test: misuse/destroy_* per type.
Trace. SPEC-009 §6, §8
KRN-OBJ-011 Names and registry¶
Statement. With CONFIG_EMB_OBJ_NAMES objects shall keep their attribute name by pointer; with CONFIG_EMB_OBJ_LIST every active object shall be on a per-type list iterable under the scheduler lock; the debug descriptor shall export header offsets, type tags, list heads, and the registry or capability table layout.
Rationale. Debuggers and statistics enumerate objects without symbols (ADR-011).
Status. Accepted 2026-10-07
Verification. Test: debug descriptor consumer lists every object of the conformance run.
Trace. SPEC-009 §7; OBS-008
KRN-OBJ-012 No flash-resident objects in 1.0¶
Statement. Kernel objects shall live in RAM and be constructed at boot; no const-initializer form of an object shall be part of the public API in 1.0. Rationale. A const form would expose the layout the storage type hides. Status. Accepted 2026-10-07 Verification. Analysis: header review. Trace. SPEC-009 §5.3, §12.5
KRN-OBJ-013 Trace¶
Statement. Object init and destroy (with the number of waiters flushed), capability changes, and system freeze shall be trace events. Rationale. Lifecycle debugging. Status. Accepted 2026-10-07 Verification. Test: trace decoder. Trace. SPEC-009 §9; OBS-005