经过几个月的阅读和对stackoverflow的学习,我决定发布一个我无法解决的问题。
我想将程序代码(某种.dll)实时添加到微处理器中。我的意思是,假设我有一组函数(例如5个过滤器)在微处理器中运行,我希望用户加载另一个新函数(过滤器),但只需将这段代码下载到内核,而不是再次下载前5个函数和新函数(引导所有固件)。
我还没有找到任何关于如何实现这一点的信息。有什么想法吗?
发布于 2015-05-21 22:03:47
首先,你需要为你的过滤器保留一些内存空间。我假设您不会玩弄内存映射,因此,假设您选择将4kB保持为0x00100000 (这是一个示例,可能这个地址在您的系统上甚至都不可用)。然后,您可以编写过滤器,并使用链接器脚本将代码放在0x00100000和0x00100FFF之间。
现在,您需要在将在0x00100000处加载的代码中找到您的过滤器。要做到这一点,一种解决方案是将你的函数放在程序的特定部分,但这需要在你的固件中有一个ELF (或任何其他可链接格式)加载程序。一种更简单的解决方案是在代码的开头强制使用包含函数地址的数组。然后,将代码加载到0x00100000并执行以下操作
int (*foo0)(int) = *((int*)0x00100000);
int (*foo1)(int) = *((int*)0x00100004);
int (*foo2)(int) = *((int*)0x00100008);
int (*foo3)(int) = *((int*)0x0010000c);
int (*foo4)(int) = *((int*)0x00100010);在每个函数上都有一个指针。
这种方法非常有限。您必须为您的筛选器代码保留一些内存,您的筛选器代码必须适合它,并且您的筛选器代码必须是独立的:它不能引用主固件中的任何变量或函数。另一方面,它的实现非常简单,应该可以满足大多数引导加载程序的需要。
https://stackoverflow.com/questions/30371264
复制相似问题