49 class SharedBufferTraceSink final :
public ITraceSink
52 explicit SharedBufferTraceSink(std::shared_ptr<BufferSink> sink)
53 : sink_(std::move(sink))
56 void write(
const TraceEvent &event)
override
62 std::shared_ptr<BufferSink> sink_;
65 struct DemoKernelBuild
67 Result<std::unique_ptr<IKernel>> kernelResult;
68 std::shared_ptr<BufferSink> traceSink;
109 std::vector<Block> code;
110 code.reserve(nops + 1);
111 for (std::size_t i = 0; i < nops; ++i)
121 std::string line =
"[" + std::to_string(event.
timestamp) +
"]";
123 line +=
event.subsystem +
"." +
event.operation;
126 line +=
" :: " +
event.details;
133 const auto events = sink.
snapshot();
134 std::vector<std::string> lines;
135 lines.reserve(events.size());
136 for (
const auto &event : events)
146 const auto events = sink.
snapshot();
149 dump.reserve(events.size() * 64 + 128);
150 dump +=
"\n=== Kernel Trace Dump ===\n";
151 for (
const auto &event : events)
156 dump +=
"=== End Kernel Trace Dump (";
157 dump += std::to_string(events.size());
158 dump +=
" entries) ===\n";
164 auto traceSink = std::make_shared<BufferSink>();
166 auto clock = std::make_unique<SimulationClock>();
167 auto tracerSink = std::make_unique<SharedBufferTraceSink>(traceSink);
168 auto tracer = std::make_unique<Tracer>(std::move(tracerSink), *clock);
169 auto memory = std::make_unique<PhysicalMemory>(64);
170 auto replacement = std::make_unique<FifoReplacement>();
171 auto mmu = std::make_unique<Mmu>(*memory, std::move(replacement), *tracer);
172 auto virtualMem = std::make_unique<VirtualMemory>(*mmu, 1024);
173 auto cpu = std::make_unique<Cpu>(*memory);
174 auto engine = std::make_unique<InterpreterEngine>(*cpu, *memory);
175 auto policy = std::make_unique<RoundRobinPolicy>(4);
176 auto scheduler = std::make_unique<Scheduler>(std::move(policy), *tracer);
177 auto syscallTable = std::make_unique<SyscallTable>();
178 auto dispatcher = std::make_unique<Dispatcher>(*scheduler, *engine, *virtualMem, *clock, *tracer, *syscallTable);
179 auto fs = std::make_unique<SimpleFS>(128);
180 auto deviceManager = std::make_unique<DeviceManager>();
181 auto ioManager = std::make_unique<IoManager>(*fs, *deviceManager);
182 auto ipc = std::make_unique<IpcManager>();
202 return DemoKernelBuild{std::move(kernelResult), std::move(traceSink)};
212 std::vector<Block> code;
215 const std::vector<Demo> demos = {
224 for (
const auto &d : demos)
238 if (build.kernelResult.isError())
240 std::cerr <<
"Failed to build kernel\n";
244 auto kernel = std::move(build.kernelResult).value();
253 TuiController controller(readModel, [&kernel](std::size_t step) {
return kernel->runForTicks(step); }, 512);
259 .defaultIntervalMs = 300,
261 .frameIntervalMs = 33,
263 .maxIntervalMs = 2000,
264 .logProvider = [traceSink = build.traceSink] {
return formatKernelLogs(*traceSink); },
Block — the fundamental unit of simulated memory.
In-memory trace sink implementation for tests and diagnostics.
Trace sink that stores events in memory.
std::vector< TraceEvent > snapshot() const
Returns a copy of all captured trace events.
Full interactive TUI application using FTXUI ScreenInteractive.
void run()
Starts the interactive event loop. Blocks until the user quits.
virtual Result< ProcessId > createProcess(const ProcessConfig &config)=0
Creates and admits a process.
Sink interface that receives structured trace events.
Fluent builder that assembles Kernel dependencies.
KernelBuilder & withClock(std::unique_ptr< IClock > clock)
Injects simulation clock dependency.
KernelBuilder & withFileSystem(std::unique_ptr< IFileSystem > fileSystem)
Injects filesystem dependency.
KernelBuilder & withMmu(std::unique_ptr< IMMU > mmu)
Injects MMU dependency.
Result< std::unique_ptr< IKernel > > build()
Builds a kernel instance from explicitly injected dependencies.
KernelBuilder & withVirtualMemory(std::unique_ptr< IVirtualMemory > virtualMemory)
Injects virtual memory dependency.
KernelBuilder & withCpu(std::unique_ptr< ICPU > cpu)
Injects CPU dependency.
KernelBuilder & withExecutionEngine(std::unique_ptr< IExecutionEngine > executionEngine)
Injects execution-engine dependency.
KernelBuilder & withTracer(std::unique_ptr< ITracer > tracer)
Injects tracing dependency.
KernelBuilder & withDeviceManager(std::unique_ptr< DeviceManager > deviceManager)
Injects device manager dependency.
KernelBuilder & withScheduler(std::unique_ptr< IScheduler > scheduler)
Injects scheduler dependency.
KernelBuilder & withDispatcher(std::unique_ptr< IDispatcher > dispatcher)
Injects dispatcher dependency.
KernelBuilder & withDefaultTickBudget(std::size_t ticks)
Configures default dispatcher tick budget used by Kernel::tick(0).
KernelBuilder & withIoManager(std::unique_ptr< IIoManager > ioManager)
Injects unified I/O manager dependency.
KernelBuilder & withSyscallTable(std::unique_ptr< SyscallTable > syscallTable)
Injects syscall table dependency.
KernelBuilder & withMemory(std::unique_ptr< IMemory > memory)
Injects physical memory dependency.
KernelBuilder & withIpcManager(std::unique_ptr< IpcManager > ipcManager)
Injects IPC manager dependency.
Diagnostics adapter that captures snapshots from IKernel facade.
Default implementation that adapts kernel snapshot data into TUI models.
Default MVC controller implementation.
IClock interface and SimulationClock implementation.
Cpu — concrete implementation of the ICPU interface.
DeviceManager — registry and dispatcher for I/O devices.
Dispatcher implementation.
FIFO page replacement policy — evicts the oldest loaded page.
Full interactive TUI application built on FTXUI ScreenInteractive.
IKernel facade interface for top-level kernel operations.
Read-model adapter interface that maps kernel state to TUI snapshots.
TUI controller contracts and default controller implementation.
Instruction enum class — all opcodes for the bytecode interpreter.
InterpreterEngine — bytecode interpreter execution engine.
Interrupt enum class — hardware and software interrupt codes.
IoManager implementation of the unified I/O layer.
IpcManager registry for IPC channels.
KernelBuilder dependency-injection assembler.
Default IKernelDiagnostics adapter implementation.
static std::vector< Block > makeProgramAddOnePlusOne()
static std::string formatTraceEventLine(const TraceEvent &event)
static std::vector< Block > makeProgramCpuHeavy()
static std::string renderKernelTraceDump(const BufferSink &sink)
static std::vector< std::string > formatKernelLogs(const BufferSink &sink)
static DemoKernelBuild buildDemoKernel()
static void spawnDemoProcesses(IKernel &kernel)
static std::vector< Block > makeProgramCounterLoop()
static std::vector< Block > makeProgramLongNop(std::size_t nops)
MMU implementation — translates virtual addresses to physical addresses.
PriorityLevel
Discrete priority levels, from highest (Realtime) to lowest (Idle).
@ High
Above-normal urgency.
@ Normal
Default priority for user processes.
@ Realtime
Highest — time-critical, preempts everything.
@ Idle
Lowest — runs only when nothing else is ready.
@ Mov
Move immediate/register → register.
@ Mul
Multiply: dst = dst * src.
@ Compare
Compare two registers (sets flags).
@ Sub
Subtract: dst = dst - src.
@ Add
Add: dst = dst + src.
constexpr std::string_view traceLevelToString(TraceLevel level) noexcept
Converts TraceLevel to a human-readable string.
PhysicalMemory — RAM simulation backed by std::vector<Block>.
Register enum class and RegisterFile — the CPU's register bank.
Round Robin scheduling policy.
Scheduler implementation hosting a pluggable policy.
Simple in-memory inode-based filesystem implementation.
Configuration for FtxuiApp behaviour.
Composite priority descriptor for a process.
Configuration payload used to create a process.
std::vector< Block > code
Program code segment. Required for interpreter-backed processes.
Priority priority
Initial scheduling priority.
std::string name
Human-readable process name.
Structured trace event record.
std::string details
Optional human-readable details payload.
Tick timestamp
Simulation timestamp when the event was emitted.
TraceLevel level
Event severity level.
SyscallTable registry and dispatch for system calls.
Trace severity levels used by the tracing subsystem.
Trace sink interface for trace event consumers.
Active tracer implementation writing events to a sink.
VirtualMemory — manages virtual address slots for processes.