【Openwrt】增加自定义模块

1. Openwrt增加自定义内核模块

  • 在package/kernel目录下创建你的内核模块目录test,test下创建src目录存放源码
mkdir -p package/kernel/test
  • 在package/kernel/test/目录下创建Makefile并填入以下内容
#
# Copyright (C) 2006-2009 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=test
PKG_RELEASE:=1

include $(INCLUDE_DIR)/package.mk

define KernelPackage/test
    SUBMENU:=Other modules
    TITLE:=test kernel drive
    FILES:=$(PKG_BUILD_DIR)/test.ko
    AUTOLOAD:=$(call AutoProbe,81,test)
    KCONFIG:=
endef

EXTRA_KCONFIG:= \

CONFIG_TEST=m

EXTRA_CFLAGS:= \
    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG))))  \

MAKE_OPTS:= \
    $(KERNEL_MAKE_FLAGS) \
    M="$(PKG_BUILD_DIR)" \
    EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
    $(EXTRA_KCONFIG)

define Build/Compile
    $(MAKE) -C "$(LINUX_DIR)" \
        $(MAKE_OPTS) \
        modules
endef

$(eval $(call KernelPackage,test))
  • 在package/kernel/test/src/目录下创建test_main.c, 输入以下代码(内核模块从文件读内容):
#include <linux/module.h>
#include <linux/init.h>

static char buf1[20];
int __init hello_init(void)
{
        struct file *fp;
        loff_t pos;

        printk("hello enter/n");
        fp =filp_open("/tmp/test_config",O_RDWR,0666);
        if (IS_ERR(fp)){
                printk("create file error/n");
                return -1;
        }

        pos =0;
        kernel_read(fp, buf1, sizeof(buf1), &pos);
        printk("#######read: %s\n",buf1);
        filp_close(fp, NULL);
        return 0;
}

void __exit hello_exit(void)
{
        printk("hello exit/n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
  • package/kernel/test/src目录下创建kconfig和Makefile
    Kconfig内容:
config TEST
    tristate "test kernel driver"
    help
        This is test Driver
        if unsure ,delete it ,just for fun

Makefile内容:

test-y := test_main.o
obj-${CONFIG_TEST} = test.o 
  • 回到openwrt根目录,使用make menuconfig配置test模块(kernel modules->other modules->test)

  • 编译

make package/test/compile V=99

编译后ko文件在:

./build_dir/target-aarch64_cortex-a53_musl/linux-armvirt_64/mydrvv/test.ko
./staging_dir/target-aarch64_cortex-a53_musl/root-armvirt/lib/modules/5.10.146/test.ko
  • 运行
    编译好的ko放到qemu模拟的arm板上加载运行
scp ./build_dir/target-aarch64_cortex-a53_musl/linux-armvirt_64/test/test.ko root@192.168.1.1:/tmp/
root@OpenWrt:/tmp#echo sldfjasl > /tmp/test_config
root@OpenWrt:/tmp# insmod test.ko
[88408.502812] hello enter/n
[88408.524385] #######read: sldfjasl
[88408.524385]
root@OpenWrt:/tmp#

PS:
linux4.0版本后取消了vfs_read()的符号导出EXPORT_SYMBOL(vfs_read)
解决办法:
(1)使用fp->f_op->read()函数,但是使用这个,虽然可以编译通过,但是在加载时,fp->f_op->read的返回值是NULL,原因未找到;
(2)使用修改内核(不建议,会污染内核):在vfs_read()函数后添加EXPORT_SYMBOL(vfs_read);导出符号表
(3)(推荐)使用int kernel_read(struct file *file, loff_t offset, char *addr, unsigned long count)函数:
file:文件; offset:读位址; addr:地址指针; count:读的字节数,返回值是成功返回字节数,失败返回负值;
理由:vfs_read()定义:
ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
参数中__user 表示buf是用户态指针,在内核中无法使用,因此需要设置使用环境,如下:
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(get_ds());
vfs_read(file, (void __user *)addr, count, &pos);
set_fs(old_fs);
而kernel_read()就是通上述操作进行封装,因此使用kernel_read更便捷,此外,在linux-4.0以后的版本中取消了对vfs_read()的符号导出,因此无法在编译成模块时使用,而kernel_read()有符号导出,可以在编译成模块时使用。

2. Openwrt增加自定义用户态模块

  • 在package/目录下创建你的用户态模块目录test-app,test下创建src目录存放源码
mkdir -p package/test-app
  • 在package/test-app/目录下创建Makefile并填入以下内容
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME := hw-qos
PKG_VERSION := 0.1
PKG_RELEASE := 1

PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/$(PKG_NAME)
  SECTION:=utils
  CATEGORY:=xb Package
  SUBMENU:=Software Testing modules
  TITLE:=This is hw-qos cli.
  MAINTAINER:=xiabing
endef

define Package/$(PKG_NAME)/description
    If you can't figure out what this program does, you're probably
    brain-dead and need immediate medical attention.
endef

define Build/Compile
    $(MAKE) -C $(PKG_BUILD_DIR) \
        ARCH="$(LINUX_KARCH)" \
        CC="$(TARGET_CC)" \
        CFLAGS="$(TARGET_CFLAGS) -Wall" \
        LDFLAGS="$(TARGET_LDFLAGS)"
endef

define Package/$(PKG_NAME)/install
    $(INSTALL_DIR) $(1)/app/
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/app/
endef

$(eval $(call BuildPackage,$(PKG_NAME)))
  • 在package/test-app/src/目录下创建test.c, 输入以下代码:
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char **argv)
{
    int i = 0;
    printf("hello world \n");
    return 0;
}
  • 在package/test-app/src/目录下创建Makefile
    Makefile内容:
all: hw-qos

hw-qos:
  $(CC) $(CFLAGS) -o $@ hw-qos.c -Wall

clean:
  rm -f hw-qos
  • 回到openwrt根目录,使用make menuconfig配置test模块(xb package(你在makefile里指定的)->Software Testing modules->test)

  • 编译

make package/test/compile V=99
  • 运行
    编译好的ko放到qemu模拟的arm板上加载运行
scp ./build_dir/target-aarch64_cortex-a53_musl/test/test  root@192.168.1.1:/tmp/

root@OpenWrt:/tmp# chmod 777 test
root@OpenWrt:/tmp# ./test
hello world
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容