内存改写问题一直是软件开发中最难搞的问题之一。
在有虚拟地址空间管理的OS中,比如linux、windows等,应用程序出现内存改写最坏的情况是应用程序蹦掉而已,不会对系统造成很大危害。
但是在没有虚拟地址空间管理的RTOS中,如果应用程序修改了系统核心内存整个系统就嗝屁了。
如果软件工程真的有银弹,我首先要拿来对付内存改写问题。
出现内存改写常见的原因有数据越界、野指针、不同类型指针之间的强制转换等。
系统数据结构可能需要一些方法检测自己是否被修改了。
比如经常看到结构体里面会有一些较magic的成员,就是干这事的;
再比如在系统的双向链表中检查链表是否完成等。
内存修改导致的结果通过时乱死、不一定死在哪些线程,有时候不知道从哪里查起,只能从内存数据分析中寻找一些线索了。
终究原因是有些RTOS的地址映射是直接使用TLB固定映射,没有启用页表管理。在速度方面固定TLB效率上会比页表映射高一些,但问题多的去了。
系统程序和应用程序共享同一个地址空间,使得应用程序可以访问到系统程序的数据。
模块化或许是减少内存改写问题的银弹之一,但是系统模块化至少还要等上一年半。在这之前不得不面对频繁的内存改写问题。
不知道H公司的VRP系统这样解决这样的问题,听闻也很难搞。
阅读(2394) | 评论(0) | 转发(0) |