CP_Kernel Module

AMD64 0.1.1 版本后, 由宏内核转为混合内核, 支持内核模块的动态加载。
内核模块是ELF格式的动态链接库, 与内核本体一同运行在R0特权级, 后缀名为 *.cdl , 意为 CP_Kernel Dynamic Library.
您可以以内核模块形式向 CoolPotOS 提供如设备驱动、文件系统等其他内核功能扩展。


实际上 CoolPotOS 并没有严格要求内核模块后缀名, 只需要保证可以正常加载即可.



开发注意

内核模块与内核本体共用一个堆区域, 如发生内存写入越界等潜在错误会导致自身甚至内核本体或其他内核模块崩溃。



环境搭建

我们提供了一个内核模块基础的开发模板, 您只需要下载clang 就可以直接使用。

bash

以及我们提供了一份可供参考的 linker.ld 写法, 用于链接内核模块

ldscript

构建

也可以自行搭建一个开发环境, 根据上述信息配置一个构建脚本等



入口函数

CP_Kernel 内核模块使用 dlmain 作为内核模块入口函数, 在模块被加载时调用. 其传入一个系统信息表用于内核模块判断当前加载该模块内核的各项信息.
其中 dlmain 函数的返回值用于判断模块是否成功加载, 如有错误返回非0值.


main.c

有关于 cpm_system_info 系统表信息的结构体定义, 详见开发接口标准




卸载函数

CP_Kernel 内核模块使用 dlexit 作为内核模块入口函数, 在模块被卸载时调用.


注意

dlexit 函数可以选择性定义, 但是你必须保证内核模块中所有占用的资源在卸载前得到释放.
内核不会对内核模块所占用的资源进行释放, 如果不能妥善处置将造成内核的内存泄漏。


main.c