Vonku's Blog

Keep calm or 烫烫烫

拆解 NuttX 如何将单核 RTOS 改造为对称多处理器操作系统——从 CPU 启动、任务分配、跨核 IPI、自旋锁到临界区的完整实现路径。

阅读全文 »

一个 ELF 文件躺在文件系统里,NuttX 怎么把它变成一块可运行的内存、一个独立的任务?本文从 exec() 开始,逐函数追踪——打开文件、解析 header、分配内存、修正符号引用,直到第一条用户指令执行。

阅读全文 »

kill(pid, SIGUSR1) 之后,信号数据怎么跨进程投递?handler 怎么在用户态被调用,执行完又怎么回到被中断的代码?本文从 sigaction 注册出发,穿越 sigqueue、trampoline 和上下文恢复,完整还原 NuttX POSIX 信号的投递链路。

阅读全文 »

进程 A 怎么把一条带优先级的消息发给进程 B?共享内存又为什么能做到零拷贝?本文从信号量到消息队列、从管道到共享内存,用源码回答每种 IPC 的内核实现——不只看 API,看完数据结构、阻塞队列和 MMU 映射。

阅读全文 »

open("/dev/ttyS0") 背后发生了什么?为什么 /dev 下的设备节点不需要格式化磁盘也能读写?本文从伪文件系统的 inode 树入手,穿过设备驱动注册和文件操作表派发,再到 mount() 接入真实文件系统,拆解 NuttX 统一 I/O 抽象层的内核实现。

阅读全文 »

串口收到一个字节后,CPU 怎么从用户态代码跳进内核 ISR?中断完成后又怎么决定”继续跑当前任务”还是”切到刚被唤醒的高优先级任务”?本文从 GICv2 硬件分发器出发,穿越向量表、irq_dispatch、中断级上下文切换,拆解 NuttX 中断处理的完整调用链路。

阅读全文 »

用户态的 malloc(100) 在 KERNEL 模式下经历了什么?本文从用户堆管理往下追踪,穿过 kmm_malloc → pgalloc → L2 页表写入,拆解四层内存分配器如何协作——每一层的算法、数据结构和临界区。

阅读全文 »

NuttX 怎么做到”每个进程有独立地址空间”?用户态函数调用怎么穿过 SVC 陷阱进入内核?高优先级任务就绪后,调度器如何当场抢走 CPU?本文基于 ARMv7-A MMU,从地址环境、系统调用陷入、双栈切换到优先级继承,完整拆解 KERNEL 模式下的任务生命周期。

阅读全文 »

从 CPU 上电复位到 NSH Shell 出现提示符,NuttX 内核经历了汇编级 MMU 初始化、OS 子系统逐层构建、ELF 可执行文件加载和用户态地址空间创建四个阶段。本文以 qemu-armv7a:knsh 配置为实例,逐行追踪完整的启动调用链。

阅读全文 »

从 arm_head.S 的 boot 初始化到每进程复制 L1 页表,再到 ELF 加载与 syscall 调度——一条完整链路拆解 NuttX 如何在 ARMv7-A 上通过两级页表实现轻量级进程隔离。

阅读全文 »
0%