动态模块
动态模块接口
结构体 | |
struct | rt_dlmodule |
动态模块控制块 更多... | |
类型定义 | |
typedef void(* | rt_dlmodule_init_func_t) (struct rt_dlmodule *module) |
动态模块初始化函数指针类型定义 | |
typedef void(* | rt_dlmodule_cleanup_func_t) (struct rt_dlmodule *module) |
动态模块清除函数指针类型定义 | |
typedef int(* | rt_dlmodule_entry_func_t) (int argc, char **argv) |
动态模块入口函数指针类型定义 | |
函数 | |
void * | dlopen (const char *filename, int flag) |
打开动态模块 | |
void * | dlsym (void *handle, const char *symbol) |
查找符号 | |
int | dlclose (void *handle) |
关闭动态库 | |
struct rt_dlmodule * | dlmodule_load (const char *pgname) |
加载动态模块 | |
struct rt_dlmodule * | dlmodule_exec (const char *pgname, const char *cmd, int cmd_size) |
运行动态模块 | |
void | dlmodule_exit (int ret_code) |
设置动态模块退出返回值 | |
struct rt_dlmodule * | dlmodule_find (const char *name) |
查找动态模块 | |
rt_uint32_t | dlmodule_symbol_find (const char *sym_str) |
查找符号 | |
详细描述
动态模块接口
在传统桌面操作系统中,用户空间和内核空间是分开的,应用程序运行在用户空间,内核以及内核模块 则运行于内核空间,其中内核模块可以动态加载与删除以扩展内核功能。dlmodule
则是RT-Thread下, 在内核空间对外提供的动态模块加载机制的软件组件。在RT-Thread v3.1.0以前的版本中,这也称之为 应用模块(Application Module),在RT-Thread v3.1.0及之后,则回归传统,以动态模块命名。
dlmodule
组件更多的是一个ELF格式加载器,把单独编译的一个elf文件的代码段,数据段加载到内存中, 并对其中的符号进行解析,绑定到内核导出的API地址上。动态模块elf文件主要放置于RT-Thread下的文件 系统上。
函数说明
void* dlopen | ( | const char * | filename, |
int | flag | ||
) |
打开动态模块
这个函数类似dlmodule_load
的功能,会从文件系统上加载动态库,并返回动态库的句柄指针。
- 参数
filename 动态库路径名称 flag 打开动态库时的模式,在RT-Thread中并未使用
- 返回
- 打开成功,返回动态库的句柄指针(实质是struct dlmodule结构体指针);否则返回NULL。
void* dlsym | ( | void * | handle, |
const char * | symbol | ||
) |
查找符号
这个函数在动态库handle
中查找是否存在symbol
的符号,如果存在返回它的地址。
- 参数
handle 动态库句柄,应该是dlopen的返回值 symbol 要返回的符号地址
- 返回
- 打开成功,返回对应符号的地址,否则返回NULL。
int dlclose | ( | void * | handle | ) |
关闭动态库
这个函数会关闭handle
指向的动态库,从内存中卸载掉。需要注意的是,当动态库关闭后,原来 通过dlsym
返回的符号地址将不再可用。如果依然尝试去访问,可能会引起fault错误。
- 参数
handle 动态库句柄
- 返回
- 关闭成功,返回0;否则返回负数。
struct rt_dlmodule* dlmodule_load | ( | const char * | pgname | ) |
加载动态模块
这个函数从文件系统中加载应用模块到内存中,若正确加载返回该模块的指针。这个函数并不会创建 一个线程去执行这个动态模块,仅仅把模块加载到内存中,并解析其中的符号地址。
- 参数
pgname 动态模块的路径
- 返回
- 正确加载返回模块指针,否则返回NULL。
struct rt_dlmodule* dlmodule_exec | ( | const char * | pgname, |
const char * | cmd, | ||
int | cmd_size | ||
) |
运行动态模块
这个函数根据pgname
路径加载动态模块,并启动一个线程来执行这个动态模块的main
函数,同时cmd
会作为命令行参数传递给动态模块的main
函数入口。
- 参数
pgname 动态模块的路径 cmd 包括动态模块命令自身的命令行字符串 cmd_size 命令行字符串大小
- 返回
- 加载并运行动态模块成功则返回动态模块指针,否则返回NULL。
void dlmodule_exit | ( | int | ret_code | ) |
设置动态模块退出返回值
这个函数由模块运行时调用,它可以设置模块退出的返回值ret_code
,然后从模块退出。
- 参数
ret_code 模块的返回参数
struct rt_dlmodule* dlmodule_find | ( | const char * | name | ) |
查找动态模块
这个函数以name
查找系统中是否已经有加载的动态模块。
- 参数
name 模块名称
- 返回
- 如果系统中有对应的动态模块,则返回这个动态模块的指针;否则返回NULL。
rt_uint32_t dlmodule_symbol_find | ( | const char * | sym_str | ) |
查找符号
这个函数以sym_str
查找系统中是否有该名称的符号。
- 参数
sym_str 符号名称
- 返回
- 如果系统中有对应的符号,则返回这个动态模块的地址;否则返回NULL。