3.2内核模块包定义
Linux 分为内核态和用户态。开发者开发的内核部分可以直接加入 Linux 的 Kernel 程序,也可以生成内核模块以便需要时装入内核。OpenWrt 一般希望开发者生成内核模块,在Linux启动后自动装载或手工使用insmod命令装载。内核模块使用KernelPackage开头,其他与一般软件包基本相同。
在内核模块定义中增加
SUBMENU 表示子菜单位置,在 $(INCLUDE)/kernel.mk 对内核模块定义了 CATEGORY 为 kernel modules,所以内核模块在 menuconfig 中的主菜单为 kernel modules,然后有下一级子菜单 $(SUBMENU)。在子菜单下可以看到以 kmod-$( PKG_NAME) 项目。
DEFAULT表示直接编入内核或产生内核模块,y表示直接编入内核,m表示产生内核模块。
AUTOLOAD 表示自动装入内核,一般表示方法为:
AutoLoad 的第一个参数$(PRIORITY)为优先级,01为最优先,99为最后装载。有关自动装载可以在/etc/modules.d目录下看到,第二个参数$(AUTOLOAD_MODS)模块名,每个模块名以空格符分隔。即可同时装载多个内核模块。
在开发过程最好不要使用自动装载,經過嚴格調試後再使用,可以減輕調試的工作量。
4、使用定义
完成前面定义后,必须使用 eval 函数实现各种定义。其格式为:
对于一般软件包
$(eval $(call Package,$(PKG_NAME)))
或对于内核模块
$(eval $(call KernelPackage,$(PKG_NAME)))
如果一個軟件包有多個程序,例如:一個應用程序有自己的內核模塊,上面使用的PKG_NAME需要靈活變通。eval函數可能設計多個。也可以當成多個軟件包處理。