1、MS-RTOS 内核模块动态装载简介
MS-RTOS 支持内核模块动态装载功能。用户可以根据需要,在不需要对内核重新编译的情况下,使用 insmod、rmmod 等命令动态地将模块加入或移出内核。这样可以提高 MS-RTOS 的灵活性,当需要对模块进行修改时,不用对整个内核编译而只需要对模块进行编程即可。模块可以不依赖于某个固定的硬件平台,当模块被加载入内核后,就相当于静态链接到了内核中,内核和模块的地址空间可以相互访问。
2、BSP 添加内核模块动态装载功能
1)BASE 构建时需要添加 `libmskmodloader` 模块
2)BSP 的 xxx.mk 文件中需要添加如下内容
#*********************************************************************************************************
# Use kernel module loader
#*********************************************************************************************************
LOCAL_USE_KMOD_LOADER := yes
3)BSP boot_thread() 函数中调用如下内容
static void boot_thread(ms_ptr_t arg)
{
...
ms_kmodule_loader_init();
...
}
4)在 BSP 连接脚本中添加如下内容
#ifdef MS_CFG_KMOD_LOADER_EN
. = ALIGN(8);
PROVIDE (__ms_sym_tbl_start__ = .);
KEEP (*(SORT(.ms_sym_tbl.*)))
PROVIDE (__ms_sym_tbl_end__ = .);
#endif
5)重新编译 BSP
3、生成内核模块工程
1)在 IoT Studio 中使用专家模式生成内核静态库 (Kernel Static Lib)
2)修改模块工程 xxx.mk 文件,将目标名称改为 xxx.ko
3)修改模块工程 xxx.mk 文件,将 include $(KERNEL_LIBRARY_MK) 改为 include $(KERNEL_MODULE_MK)
4)工程中添加如下代码
int module_init (void)
{
ms_printk(MS_PK_INFO, "hello_module init!\n");
return 0;
}
void module_exit (void)
{
ms_printk(MS_PK_INFO, "hello_module exit!\n");
}
5)编程生成 `xxx.ko` 文件
4、模块操作命令
MS-RTOS 中可以通过 `insmod`、`rmmod`、`lsmod` 等命令操作模块文件,具体使用方式如下
# help insmod
insmod path, load kernel module
# help rmmod
rmmod path, unload kernel module
# help lsmod
lsmod, show all kernel modules
5、内核模块上电自动装载
内核模块文件可以通过启动参数文件在上电时自动装载,需要在 dts 文件中加入如下内容。dts 文件相关内容详见 "MS-RTOS 启动参数文件" 相关内容。
kmodules {
xdev_mod {
compatible = "ms-kmodule"; // 类型
vendor = "acoinfo"; // 厂商
version = <1>; // 版本号
img_file = "/nor/modules/xxx.ko"; // 模块文件路径
};
};