BTS Patch想法和实现

BTS Patch想法和实现

目的:
    不重启BTS(系统是VxWorks on PowerPC)动态调用一个新函数,替换原来的旧函数,以达到Patch的功能。如能实现至少能在debug的时候起作用,不用编译整个应用程序,不用重新启动系统,节省时间。
(在nortel交换机上有该功能,现想在基站、即BTS上实现)

原理:
    在旧函数,即想被替换的函数的开始地址插入一个jump指令,无条件跳转到新的函数起始位置,执行新函数,从而达到patch的功能。

Limitation:
    static变量将会被重置为0。

实现:
    首先要启用已经放弃多年的xdm ftp模块,实现把新函数(编译好的.o文件)上传到BTS的功能,并把.o文件存放在BTS的flash储存器里面。
    由于新函数可能要用到原来应用程序里有的函数或者变量,所以在本机上编译了.o文件以后,其应该被外加一个文件头,里面存有该新函数要用到的另外的symbol的地址(用nmppc工具在.o文件和.corefile文件里提取)。
    .o文件上传以后应被与文件头分离,程序把文件头里的symbol加入VxWorks里的系统符号表里,如此以后在执行新函数的时候就能正确得知这些symbol的位置。
    分离了文件头以后可以调用VxWorks的API,loadModule(),把新函数动态连接进内存。
    如果连接成功,就可以改动旧函数的代码段,插入一个jump指令,让其跳转到新函数,完成。

已解决的未预想到的问题:
    1。flash储存的写入问题。
    2。新函数不能正确找到所需symbol的地址。
    3。把新symbol加入到系统符号表的问题。

问题:
    1。代码段内存写保护,稍有改动就重启,现并没有解决办法。
    2。新函数储存地址比较远,普通24位offset的jump指令并不能正确寻址。

问题:
1. VxWorks代码段内存保护,不能随意改动旧函数的代码段。这意味着不能加入jump指令跳转到新函数。
2. jump指令。PowerPC没有长跳转的指令,如果要跳转到一个远地址必须把地址放入某特殊寄存器,然后跳转。
3. 如果旧函数正在被某进程执行,而需要插入的指令大于一条。如不作判断便更改代码段将出现严重问题。

解决:
1. 经过查看VxWorks操作系统代码,发现一个可用的内部函数“memProtectStateSet()”,可以将某个内存段的保护状态修改,不需要重启板子。执行这个函数后便可指定某个代码段可写。
2. 只能采用多条指令实现跳转。并研究其指令二进制格式,把指令手工转换成word32写入代码段。
3. demo里决定不解决该问题。暂时想法是搜索所有进程,如有正在运行该代码段将等待,如果超时则返回打补丁失败。

你可能感兴趣的:(BTS Patch想法和实现)