从访存的角度理解RTOS的实时性 从访存的角度理解RTOS的实时性RTOSReal Time Operation System的一大特性就是实时性强那么什么是实时性呢笼统的来说不是任务处理的快就叫做实时实时的核心是确定性又叫可预测性那么进一步来说如何理解所谓的确定性呢这篇文章以内存访问为例通过对比通用系统中内存访问的过程和实时系统中内存访问的过程来具体的理解什么叫做确定性。下图是linux中内存访问的概略流程图可以看到根据目标内存当前的状态访问内存的步骤是不一样的Linux是多进程系统用户程序访问的都是虚拟地址所以用户程序发起内存访问时访问的都是虚拟地址CPU需要根据虚拟地址找到对应的物理地址才能真正实现内存访问。在linux上这个查找物理地址的过程就如上图所示这个过程看起来很复杂其本质是为了获取复杂软件功能下硬件平台的极致性能后续有机会另开一篇文章详细介绍这个机制的设计这里先略过先关注这个过程中的行为1. MMU触发地址转换先查询目标地址是否在TLBTranslation Lookaside Buffer地址转换旁路缓冲器中TLB 命中直接从 TLB 中拿到虚拟地址对应的物理页框号PFN跳过页表查询直接进入 Cache 访问阶段TLB 未命中MMU 会遍历内存中的页表查找该虚拟地址对应的页表项。2. 检查页表项有效性遍历页表找到对应的 PTE 后检查内存页是否在物理内存中页在物理内存中提取物理页框号拼接偏移量得到完整物理地址准备访问实际内存页不在物理内存中触发缺页中断CPU进入异常处理。3.缺页中断处理内核的缺页中断处理有3中情况页未分配分配空闲物理页此时目标地址获得对应的物理地址可以准备访问页被换出Swap分配空闲物理页从swap分区读回物理页数据准备访问权限错误进入错误处理Swap 是 Linux 应对物理内存不足的机制内核的页面回收器kswapd会把不常用的物理页数据写入 Swap 分区一般在磁盘中同时释放物理内存以回收空闲物理内存当访问这些页时就会触发换入缺页中断从磁盘读回数据。4.物理地址的 Cache 访问:拿到物理地址后CPU 会访问 CPU CacheCache 命中直接从 Cache 中读写数据流程结束Cache 未命中CPU 发起总线请求访问物理内存DRAM把数据加载到 Cache 中同时返回给 CPU流程结束。可以看到在上面的内存访问模型里同样的内存访问最快的情况cpu可以直接从tlb中获取物理地址然后从cache里拿到实际数据但是最慢的情况cpu需要处理缺页中断从磁盘读取数据我们知道磁盘访问和cache访问的速度差了好几个数量级也就是说对同一个访存语句例如int a *ptr最快的情况可能只需要几纳秒直接tlb cache获取数据最慢的情况可能需要几毫秒swap获取数据需要访问磁盘io访问极其耗时这个就是不确定性也就是我们常说的为什么Linux不是硬实时操作系统的一个原因。那么回到RTOS从访存的实时性来说如何保证访存速率的一致性就是保证实时性的一项要求以我的了解有几种不同的方案以VxWorks和FreeRTOS这种宏内核系统为代表VxWorks和FreeRTOS其实可以看作是单进程多线程的系统所有任务包括内核都工作在同一个地址空间下这种情况下就不需要考虑虚拟内存所有的访存操作直接访问物理内存那么从虚拟内存到物理内存的映射过程中带来的不确定性就没有了VxWorks下依然保留了虚拟内存到物理内存映射的API但是实际上虚拟地址和物理地址是一一对应的保留接口只是为了兼容性带来的后果就是系统的稳定性会差一些因为用户任务与内核工作在同一地址空间且都是特权模式就意味着用户任务crush会直接导致系统崩溃当然另一个优势就是系统效率会更高。以QNX这种微内核系统为代表微内核的核心即是内核独立且简单其他用户程序包括驱动和文件系统都以独立的进程存在以此保证系统的稳定性也就是说多进程是QNX这种微内核系统的核心特性那么在QNX上要保证访存的实时性虚拟内存的映射就是无法绕开的问题所以QNX上更多的是针对虚拟内存映射的过程进行优化比如通过禁用swap禁止在周期任务内动态分配内存等方式来尽量减小内存寻址过程中的不确定性以保证应用程序访问内存的确定性。相对来说VxWorks这种宏内核的处理相对简单粗暴但是结合其系统特性也非常有效QNX的处理就要更精细一些两者的侧重点略有不同但是目的都是一样尽量保证同种操作的一致性。另一方面在有些异构平台上运行VxWorks时可能还会关闭cache访问以保证数据的一致性比如在FPGAARM的SOC上为了保证VxWorks与FPGA之间数据交互的可靠性会需要关闭cache访问以免VxWorks读到脏数据这种情况下VxWorks相当于直接访问物理内存由于失去了cache的高速访问特性加速内存访问程序的访存速率整体上是降低的但是访存的一致性上却是更高了因为没有了cache命中和不命中带来的差别某种程度上这算是一种追求实时性或者说确定性而做出的性能上的妥协我觉得这一点也能帮助大家更好的理解实时性实时系统更需要的是确定性而并非更快更高效。