动态加载 (DM-APP)
动态模块(Dynamic Module,简称 dm-app)机制允许开发者在运行时动态加载和卸载应用程序,而无需重新编译整个系统。目前该特性仅在 Luban-Lite 内核为 RT-Thread 时支持。
Luban-Lite 原生开发的映像为 Kernel ,使用 Dynamic Module 机制开发的应用为 dm-app。本节介绍 Dynamic Module 功能及其配置流程。
DM 原理说明
在 Linux/ Windows 等大型系统中,应用和驱动通常可以独立开发并编译成 ELF/EXE 文件,然后在目标系统上执行。Luban-Lite 使用动态模块 (Dynamic Module) 机制来支持应用程序独立开发的需求,核心就是实现了 ELF 的链接和加载。基本原理如下:
执行以下步骤,可以实现对动态模块的有效调试,确保能够在产品开发过程中灵活地进行二次开发和调试:
-
编译链接:使用 GCC 工具链(使用 -fPIC -shared 选项),将应用源文件 main.c 编译链接成 ET_DYN 格式的 ELF 文件,即 hello.mo 文件。注:必须使用 riscv-none-embed-gcc 工具链,否则会导致编译不成功。
hello.mo 是一个标准的 ET_DYN 格式 ELF 文件,位置无关且可动态链接。
-
文件加载:在运行时,首先会把 hello.mo 文件的数据段代码段拷贝到内存当中。
由于代码是是位置无关代码 (PIC),可以从 Heap 中动态分配内存再进行代码拷贝。此时代码中还存在很多对系统函数的调用,需要重新定位重新链接后才能运行。
-
动态链接:遍历 hello.mo 中的可重定位段,在内核的导出符号表 rtmsymtab 中查询需要重定位的符号,并将查询到的绝对地址回填到可重定位符号的位置。至此完成动态链接,可以跳转到程序入口处执行。