Arm 微处理器中的DLL?

Arm 微处理器中的DLL?,arm,boot,bootloader,firmware,Arm,Boot,Bootloader,Firmware,经过几个月的阅读和从stackoverflow学习,我决定发布一个我无法解决的问题 我想向微处理器实时添加程序代码(某种.dll)。我的意思是,假设我有一组功能(例如5个过滤器)在微处理器中运行,我希望用户加载另一个新功能(过滤器),但只是将那段代码下载到核心,而不是再次下载前5个加上新的(引导加载所有固件) 我没有找到任何关于如何实现这一点的信息。有什么想法吗?首先,您需要为过滤器保留一些内存空间。我假设您不会使用内存映射,因此,假设您选择将4kB保持在0x00100000(这是一个示例,可能

经过几个月的阅读和从stackoverflow学习,我决定发布一个我无法解决的问题

我想向微处理器实时添加程序代码(某种.dll)。我的意思是,假设我有一组功能(例如5个过滤器)在微处理器中运行,我希望用户加载另一个新功能(过滤器),但只是将那段代码下载到核心,而不是再次下载前5个加上新的(引导加载所有固件)


我没有找到任何关于如何实现这一点的信息。有什么想法吗?

首先,您需要为过滤器保留一些内存空间。我假设您不会使用内存映射,因此,假设您选择将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);
在每个函数上都有一个指针


这种方法非常有限。您必须为筛选代码保留一些内存,筛选代码必须适合它,并且筛选代码必须是独立的:它不能引用主固件中的任何变量或函数。另一方面,它的实现非常简单,应该适合大多数引导加载程序的需要。

您的目标是哪个操作系统?DLL是微软的东西。其他操作系统使用共享对象文件,这是一个类似的概念,但不同类型的可执行文件格式。您希望目标设备上的其他应用程序使用此筛选器库,还是仅由您的应用程序使用?