RT-Thread API参考手册  3.1.1
嵌入式实时操作系统
动态模块

动态模块接口 更多...

结构体

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_dlmoduledlmodule_load (const char *pgname)
 加载动态模块 更多...
 
struct rt_dlmoduledlmodule_exec (const char *pgname, const char *cmd, int cmd_size)
 运行动态模块 更多...
 
void dlmodule_exit (int ret_code)
 设置动态模块退出返回值 更多...
 
struct rt_dlmoduledlmodule_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。