第一步创建目录编写代码
首先在<BUILDROOT>/package/kernel
下创建一个Makefile文件以及录hellokernel目录,并且在hellokernel创建一个src目录 ,用来保存自己写的代码。src中加入两个文件 hellokernel.c 和 Makefile。结构如下:
src/Makefile
内容如下:
obj-m += hellokernel.o
obj-m += $(KO_NAME).o //m是编译成module
obj-y += $(KO_NAME).o //y是编译进 kernel 只可以看到.o 不会生成ko
src/hellokernel.c
内容如下:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#define DRV_DESC "Hello Kernel"
#define DRV_VERSION "0.0.1"
static int hellokernel_init(void)
{
printk("hellokernel installed\n");
return 0;
}
static void hellokernel_exit(void)
{
printk("hellokernel uninstalled\n");
}
module_init(hellokernel_init);
module_exit(hellokernel_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Hzlarm");
MODULE_DESCRIPTION(DRV_DESC);
MODULE_VERSION(DRV_VERSION);
- 外层Makefile 内容如下:
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=hellokernel
PKG_VERSION:=0.0.1
include $(INCLUDE_DIR)/package.mk
define KernelPackage/hellokernel
SUBMENU:=Other modules
TITLE:=hellokernel for test
#DEPENDS:=
FILES:=$(PKG_BUILD_DIR)/hellokernel.ko
#自动加载,30 表示优先级(1 最优先),后面的 hellokernel 表示模块名称
#AUTOLOAD:=$(call AutoLoad,30,hellokernel)
endef
define KernelPackage/hellokernel/description
Kernel module for helloworld.
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Compile
$(MAKE) -C "$(LINUX_DIR)" \
ARCH="$(LINUX_KARCH)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
SUBDIRS="$(PKG_BUILD_DIR)" \
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
$(EXTRA_KCONFIG) \
$(MAKE_OPTS) \
modules
endef
$(eval $(call KernelPackage,hellokernel))
第二步 编译
到顶层目录 make menuconfig
配置(默认原始SDK都配置好,可以跑通的前提下)
先选择Kernel modules然后Other modules 下选择kmod-hellokernel如下图:
选中为M:(这里选择 M 为编译生成模块,切记与src目录的Makefile保持一致。)
保存编译make ./package/kernel/hellokernel/compile V=s
(单独编译 hellokernel)
第三步 运行
- 把生成文件拷到开发板
openwrt/bin/ramips/packages/base/kmod-hellokerne_xxx.ipk
opkg安装
opkg install kmod-hellokerne_xxx.ipk
然后modprobe 加载模块
然后rmmod 卸载模块
执行opkg remove kmod-hellokernel
卸载软件包