• openwrt增加内核模块的方法


    开发环境为ubuntu.首先搭建编译环境。
    sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev texlive-lang-french gawk asciidoc libz-dev tex4ht git-core
    下面就是下载源码,源码分两种,一种是最新版但不稳定,就是trunk版,一种是相对稳定版,backfire版
    trunk版下载命令:svn co svn://svn.openwrt.org/openwrt/trunk/
    backfire版下载命令:svn co svn://svn.openwrt.org/openwrt/branches/backfire/
    如果不是最新下载,最好定期更新代码,命令为
    ./scripts/feeds update –a
    ./scripts/feeds install –a
    接着就是编译了。编译方法如下:
    make defconfig
    make menuconfig进入定制界面,选择自己的设备类型。
    make V=99


    下面就是增加内核模块的方法了

    进入package目录,创建模块目录
    cd backfire/package
    mkdir example
    进入example目录,创建Makefile文件和代码路径
    cd example
    touch Makefile
    mkdir src
     Makefile具体内容如下:

    #
    # Copyright (C) 2008 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:=example
    PKG_RELEASE:=1
    
    include $(INCLUDE_DIR)/package.mk
    
    define KernelPackage/example
      SUBMENU:=Other modules
      TITLE:=example driver
      DEPENDS:=@LINUX_2_6
      FILES:=$(PKG_BUILD_DIR)/*.$(LINUX_KMOD_SUFFIX)
      KCONFIG:=
    endef
    
    define KernelPackage/example/description
      Kernel module to example
    endef
    
    EXTRA_KCONFIG:= 
    	CONFIG_EXAMPLE=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:= 
    	ARCH="$(LINUX_KARCH)" 
    	CROSS_COMPILE="$(TARGET_CROSS)" 
    	SUBDIRS="$(PKG_BUILD_DIR)" 
    	EXTRA_CFLAGS="$(EXTRA_CFLAGS)" 
    	$(EXTRA_KCONFIG)
    
    define Build/Prepare
    	mkdir -p $(PKG_BUILD_DIR)
    	$(CP) ./src/* $(PKG_BUILD_DIR)/
    endef
    
    define Build/Compile
    	$(MAKE) -C "$(LINUX_DIR)" 
    		$(MAKE_OPTS) 
    		modules
    endef
    
    $(eval $(call KernelPackage,example))


    3.进入src目录,创建代码路径和相关源文件
    cd src
    touch example.c Kconfig Makefile
      example.c具体内容如下:
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    /* hello_init ---- 初始化函数,当模块装载时被调用,如果成功装载返回0 否则返回非0值 */
    static int __init hello_init(void)
    {
    	printk("I bear a charmed life.
    ");
    	return 0;
    }
    /* hello_exit ---- 退出函数,当模块卸载时被调用 */
    static void __exit hello_exit(void)
    {
    	printk("Out, out, brief candle
    ");
    }
    module_init(hello_init);
    module_exit(hello_exit);
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("zhangjiefeng");
      Kconfig具体内容如下:
    config EXAMPLE
      tristate "Just a example"
      help
       This is a example, for debugging kernel model.
       If unsure, say N.
      Makefile具体内如如下:
    obj-$(CONFIG_EXAMPLE) 	+= example.o
      回到主路径 backfire/,编译选项配置保存并编译
    make menuconfig
      Kernel modules --->
        Other modules --->
          kmod-example
      选项设置为M,保存退出
      然后编译该模块:
    make package/example/compile
    5.编译出的文件可以在主路径的以下路径找到
    ./staging_dir/target-mips_r2_uClibc-0.9.30.1/root-lantiq/lib/modules/2.6.32.33/example.ko
    ./build_dir/linux-lantiq_ar9/example/ipkg-lantiq/kmod-example/lib/modules/2.6.32.33/example.ko
    ./build_dir/linux-lantiq_ar9/example/example.ko
    ./build_dir/target-mips_r2_uClibc-0.9.30.1/OpenWrt-SDK-lantiq-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1/staging_dir/target-mips_r2_uClibc-0.9.30.1/root-lantiq/lib/modules/2.6.32.33/example.ko
    ./build_dir/target-mips_r2_uClibc-0.9.30.1/root-lantiq/lib/modules/2.6.32.33/example.ko

      注:我们使用./build_dir/linux-lantiq_ar9/example/example.ko


    参考文档:

    http://blog.chinaunix.net/uid-9217288-id-3060464.html

    http://downloads.openwrt.org/kamikaze/docs/openwrt.html#x1-470002.1.3

    http://blog.csdn.net/gubenpeiyuan/article/details/8024247

  • 相关阅读:
    virtualenvwrapper的安装及问题解决
    eclipse添加插件、删除插件 示例: eclipse marketplace
    怎么修改tomcat端口
    Eclipse配置maven环境
    如何查看某个端口被谁占用
    selenium清空默认文字
    Git项目删除文件
    selenium使用chrome抓取自动消失弹框的方法
    Python字符串转为字典方法大全
    接口测试学习
  • 原文地址:https://www.cnblogs.com/chengliu/p/3636364.html
Copyright © 2020-2023  润新知