精华内容
下载资源
问答
  • openwrt-kernel.rar

    2020-11-03 15:07:33
    要升级openwrt的linux内核版本,关键是要制作内核配置文件 二.内核配置文件制作方法 2.1当前openwrt对应的某个开发板有对应的内核配置文件,比如此时的openwrt的linux内核版本为4.9,而我们...2.2 make kernel_menuconfig
  • openwrt 更换 kernel

    千次阅读 2015-11-09 10:00:05
    最近捣鼓了一段时间openwrt,开始一直都在花时间研究怎么把自己的kernel移植进去,现在总结两种方法: 1>.可以自己制作kernel补丁。 diff -uNr linux.owner linux.openwrt > linux.patch 比较自己和openwrt kernerl...

    最近捣鼓了一段时间openwrt,开始一直都在花时间研究怎么把自己的kernel移植进去,现在总结两种方法:

    1>.可以自己制作kernel补丁。

    diff -uNr  linux.owner linux.openwrt > linux.patch

    比较自己和openwrt kernerl的差异制作补丁

    patch -s -P0 <  linux.openwrt

    应用补丁。

    这样移植的kernerl,多多少少还是会有一堆问题,但在开发板上是可以运行起来的,后面就是解决问题的漫漫长路了。


    2>.利用 make menuconfig 中的use external kernel选项,完全使用自己的linux

    相应的编译工具也是使用自己的 use external toolchain,进去设置的菜单网上介绍的比较多,就不多说了。



    展开全文
  • (二)openwrt make kernel_menuconfig流程分析 在上一篇文章“(一)openwrt make menuconfig流程分析”中,我们分析了make menuconfig的流程,在配置菜单中,我们并没有看到kernel相关的配置,这是因为在openwrt...

    (二)openwrt make kernel_menuconfig流程分析


    在上一篇文章“(一)openwrt make menuconfig流程分析”中,我们分析了make menuconfig的流程,在配置菜单中,我们并没有看到kernel相关的配置,这是因为在openwrt中,我们想要配置内核的话,需要使用make kernel_menuconfig命令。我们将通过分析这个命令执行的流程,看看它具体做了哪些工作。下面是我总结的分析过程,希望与大家分享,共同学习,共同成长,其中可能会有一些理解不正确的地方,还望各位不吝指教,谢谢,^_^。


    当我们在顶层目录输入make kernel_menuconfig时,由于指定的目标为kernel_menuconfig,所以make会去寻找文件中kernel_menuconfig所在的地方,然后去执行其相应规则。同menuconfig目标一样,我们可以看到,kernel_menuconfig目标也在$(TOPDIR)/include/toplevel.mk中,下面是它的依赖和规则。其中$(TOPDIR)就是顶层目录,定义在主Makefile中TOPDIR:=${CURDIR}。

        kernel_menuconfig: prepare_kernel_conf  
            $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig  

    1 kernel_menuconfig的依赖目标prepare_kernel_conf

    第1行,依赖目标prepare_kernel_conf的定义在$(TOPDIR)/include/toplevel.mk中:

        prepare_kernel_conf: .config FORCE
        ifeq ($(wildcard staging_dir/host/bin/quilt),)
          prepare_kernel_conf:
            @+$(SUBMAKE) -r tools/quilt/install
        else
          prepare_kernel_conf: ;
        endif

    下面对各依赖目标和规则进行分析。

    1.1 prepare_kernel_conf的依赖目标.config

    .config定义在$(TOPDIR)/include/toplevel.mk中:

        ifeq ($(FORCE),)
          .config scripts/config/conf scripts/config/mconf: tmp/.prereq-build
        endif
         
        .config: ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo)
            @+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \
                [ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \
                $(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \
            fi

      1)第1~3行,默认FORCE是等于空的,所以这里的if条件成立,即.config依赖于tmp/.prereq-build,我们看一下tmp/.prereq-build的定义:

        tmp/.prereq-build: include/prereq-build.mk
            mkdir -p tmp
            rm -f tmp/.host.mk
            @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \
                echo "Prerequisite check failed. Use FORCE=1 to override."; \
                false; \
            }
            touch $@

        下面分析tmp/.prereq-build的依赖目标和规则。

        1.1)第1~3行,tmp/.prereq-build依赖include/prereq-build.mk文件,创建tmp目录,删除tmp/.host.mk。

        1.2)第4~7行,执行prereq-build.mk文件,用于检查一些必备条件是否准备好,例如下面列出的检查项,如果检查失败,则打印后面“Prerequisite check ...”信息。

        Checking 'working-make'... ok.
        Checking 'case-sensitive-fs'... ok.
        Checking 'getopt'... ok.
        Checking 'fileutils'... ok.
        Checking 'working-gcc'... ok.
        ...

        1.3)第8行,检查完后,创建tmp/.prereq-build文件。
      2)第5~9行,继续来看简化一下如下:

        .config: ./scripts/config/conf prepare-tmpinfo
            @+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \
                [ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \
                make menuconfig; \
            fi

        第5行,./scripts/config/conf依赖目标的分析可参考“(一)openwrt make menuconfig流程分析”文章中scripts/config/mconf。CONFIG_HAVE_DOT_CONFIG变量的值为空,所以if条件不成立,得到prepare-tmpinfo依赖条件,该依赖条件的分析也在“(一)openwrt make menuconfig流程分析”文章中有讲到。

        第6~9行,这里的规则只有一个if条件语句,其表示如果顶层目录下不存在.config文件,或存在.config,但是该文件中没找到CONFIG_HAVE_DOT_CONFIG,则if条件成立,那将会执行make menuconfig命令;否则该规则什么也不做。
    1.2 prepare_kernel_conf的依赖目标FORCE

    依赖目标FORCE在“(一)openwrt make menuconfig流程分析”文章中有分析,这里不再分析了。

    1.3 prepare_kernel_conf的规则

    第3~8行,表示若staging_dir/host/bin/quilt工具不存在,即ifeq条件成立,则执行下面命令,生成该工具,否则执行else部分,即什么都不做。quilt是一个帮助我们管理patch的工具。

    @+$(SUBMAKE) -r tools/quilt/install

    1.4 小结

    kernel_menuconfig的依赖目标prepare_kernel_conf主要做的工作是:

    (1)检查一些必备条件是否准备好,比如gawk、zlib、getopt、openssl等,

    (2)根据顶层目录下是否存在.config文件,以及该文件中是否有CONFIG_HAVE_DOT_CONFIG,决定要不要执行make menuconfig命令。
    2 kernel_menuconfig的规则

    第2行,kernel_menuconfig的依赖目标分析完后,我们再看一下它的规则,将其简化一下:

    make -C target/linux menuconfig

    可以看到,这行规则表示要去执行$(TOPDIR)/target/linux目录下Makefile,目标是menuconfig。继续看一下此Makefile中menuconfig目标的定义:

        prereq clean download prepare compile install menuconfig nconfig oldconfig update refresh: FORCE
            @+$(NO_TRACE_MAKE) -C $(BOARD) $@

    将其简化一下,如下,menuconfig的规则表示要进入$(TOPDIR)/target/linux/ramips目录,去执行里面的Makefile,目标为menuconfig。

        menuconfig: FORCE
            @+make -C ramips menuconfig

    下面分析一下BOARD变量如何得到的,以及在$(TOPDIR)/target/linux/ramips/Makefile中执行的规则。
    2.1 BOARD变量

    上面规则中BOARD变量定义在$(TOPDIR)/include/rules.mk文件中,如下所示,rules.mk是由上面的$(TOPDIR)/target/linux/Makefile读入的。

        ifeq ($(DUMP),)
          -include $(TOPDIR)/.config
        endif
        qstrip=$(strip $(subst ",,$(1)))
        #"))
        BOARD:=$(call qstrip,$(CONFIG_TARGET_BOARD))

    第1~3行,表示读取顶层目录中的.config文件,它包含了CONFIG_TARGET_BOARD=“ramips”变量的值。

    第4行,定义了一个qstrip变量,其含义为去掉$(1)参数中的 “双引号,以及多余的空格或tab。

    第5行,是注释,我的理解是,它对实际语法的正确性没有影响,由于第4行出现了单个双引号,增加这行,可以避免影响第4行之后命令的显示。

    第6行,从CONFIG_TARGET_BOARD变量获取值,我这里获取的值为ramips。
    2.2 ramips的目标和规则

    接下来继续来分析$(TOPDIR)/target/linux/ramips/Makefile,该文件中核心代码如下,其他部分代码定义的是一些公共变量,我们在用到的时候再去分析:

    $(eval $(call BuildTarget))

    根据该代码可知,这里调用了BuildTarget变量,BuildTarget定义在$(TOPDIR)/include/target.mk中,如下:

        ifeq ($(TARGET_BUILD),1)
          include $(INCLUDE_DIR)/kernel-build.mk
          BuildTarget?=$(BuildKernel)
        endif

    TARGET_BUILD变量的值在$(TOPDIR)/target/linux/Makefile中定义为1,所以if条件成立,因此BuildTarget的值为BuildKernel变量的值。

    BuildKernel定义在$(TOPDIR)/include/kernel-build.mk中,这个变量中定义的目标和规则较多,我们直接看要执行的menuconfig目标的规则:

        define BuildKernel
            ...
            oldconfig menuconfig nconfig: $(STAMP_PREPARED) $(STAMP_CHECKED) FORCE
            rm -f $(STAMP_CONFIGURED)
            $(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config
            $(_SINGLE)$(MAKE) -C $(LINUX_DIR) $(KERNEL_MAKEOPTS) $$@
            $(LINUX_RECONF_DIFF) $(LINUX_DIR)/.config > $(LINUX_RECONFIG_TARGET)
            ...
        endef

    我们将其简化一下如下。

        define BuildKernel
        ...
        menuconfig: $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14/.prepared $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14/.quilt_checked FORCE
            rm -f $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14/.configured
            $(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config
            make -C build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14 menuconfig
            $(LINUX_RECONF_DIFF) $(TOPDIR)/.config > $(LINUX_RECONFIG_TARGET)
        ...
        endef

    下面详细分析这些目标和规则。
    2.2.1 内核menuconfig的依赖目标

    第3行,menuconfig依赖.prepared、.quilt_checked这两个依赖目标,它们是内核顶层目录下的两个文件。当这两个目标文件不存在时,他们对应的规则就会被执行,我们依次来分析这俩目标。

      1)依赖目标.prepared

        .prepared定义在$(TOPDIR)/include/kernel-build.mk中

        $(STAMP_PREPARED): $(if $(LINUX_SITE),$(DL_DIR)/$(LINUX_SOURCE))
            -rm -rf $(KERNEL_BUILD_DIR)
            -mkdir -p $(KERNEL_BUILD_DIR)
            $(Kernel/Prepare)
            touch $$@

        1.1).prepared的依赖目标

          第1行,LINUX_SITE定义在$(TOPDIR)/include/kernel.mk中,CONFIG_EXTERNAL_KERNEL_TREE、CONFIG_KERNEL_GIT_CLONE_URI在顶层.config中都为"",LINUX_VERSION值为3.10.14。

        TESTING:=$(if $(findstring -rc,$(LINUX_VERSION)),/testing,)
         ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
            LINUX_SITE:=@KERNEL/linux/kernel/v3.x$(TESTING)
        endif

          所以ifeq条件成立,LINUX_SITE值为@KERNEL/linux/kernel/v3.x,则.prepared的依赖目标为$(DL_DIR)/$(LINUX_SOURCE)。

          DL_DIR定义在$(TOPDIR)/rules.mk中,CONFIG_DOWNLOAD_FOLDER在顶层.config中为"",所以$(DL_DIR)值为$(TOPDIR)/dl。

    DL_DIR:=$(if $(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(TOPDIR)/dl)

          LINUX_SOURCE定义在$(TOPDIR)/include/kernel.mk中

    LINUX_SOURCE:=linux-$(LINUX_VERSION).tar.xz

          由此可知,.prepared的依赖目标即为$(TOPDIR)/dl/linux-3.10.14.tar.xz

        1.2).prepared的规则

          第2、3行,KERNEL_BUILD_DIR定义在$(TOPDIR)/include/kernel.mk中,BOARD值为ramips,SUBTARGET值为mt7628。

    KERNEL_BUILD_DIR ?= $(BUILD_DIR)/linux-$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET))

          BUILD_DIR定义在$(TOPDIR)/rules.mk中,TARGET_DIR_NAME值为target-mipsel_24kec+dsp_uClibc-0.9.33.2。

        BUILD_DIR_BASE:=$(TOPDIR)/build_dir
        BUILD_DIR:=$(BUILD_DIR_BASE)/$(TARGET_DIR_NAME)

          最终可得到KERNEL_BUILD_DIR值为:

    $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628

          所以,这两行规则是删除linux-ramips_mt7628目录,再重新创建。

          第4行,Kernel/Prepare定义在$(TOPDIR)/include/kernel-build.mk中

        define Kernel/Prepare
            $(call Kernel/Prepare/Default)
        endef

          Kernel/Prepare/Default定义在$(TOPDIR)/include/kernel-defaults.mk中

        ifeq ($(strip $(CONFIG_EXTERNAL_KERNEL_TREE)),"")
          ifeq ($(strip $(CONFIG_KERNEL_GIT_CLONE_URI)),"")
            define Kernel/Prepare/Default
            $(CP) $(TOPDIR)/target/linux/src/linux-$(LINUX_VERSION) $(KERNEL_BUILD_DIR)
            ln -sf $(LINUX_DIR) `echo $(LINUX_DIR) | sed 's/linux-[0-9]*\.[0-9]*\.[0-9]*/linux-kernel/g'`
            endef
          else
            define Kernel/Prepare/Default
            ...
            endef
          endif
        else
          define Kernel/Prepare/Default
            ...
          endef
        endif

          两个ifeq都成立,所以使用第一个Kernel/Prepare/Default变量,将其简化一下,LINUX_VERSION值在后面的2.2.3的2)有分析。

        cp -fpR $(TOPDIR)/target/linux/src/linux-3.10.14 $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628
        ln -sf $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14 $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-kernel

          因此可知道,第4行所做工作就是从target目录拷贝内核源码linux-3.10.14到build_dir目录中,并为内核源码创建软链接linux-kernel。
          第5行,准备工作完成后,创建.prepared文件。

      2)依赖目标.quilt_checked

        .quilt_checked的规则定义在$(TOPDIR)/include/quilt.mk中,它是由BuildKernel变量中$(if $(QUILT),$(Build/Quilt))这行命令展开的,QUILT值为1。

        $(1)值为$(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14,$(2)值为空,因为if中series文件不存在,所以if条件不成立,.quilt_checked的规则只是创建了一个.quilt_checked这个文件。

        define Quilt/Template
          ...
          $($(2)STAMP_CHECKED): $($(2)STAMP_PREPARED)
            if [ -s "$(1)/patches/series" ]; then \
                (cd "$(1)"; \
                    if $(QUILT_CMD) next >/dev/null 2>&1; then \
                        $(QUILT_CMD) push -a; \
                    else \
                        $(QUILT_CMD) top >/dev/null 2>&1; \
                    fi \
                ); \
            fi
            touch "$$@"
          ...
        endef
        Build/Quilt=$(call Quilt/Template,$(PKG_BUILD_DIR),,,$(if $(TARGET_BUILD),Kernel,Package))

    2.2.2 删除内核的.configured文件

    第4行,删除内核顶层目录中的.configured文件。
    2.2.3 内核.config的生成

    第5行,这行规则不复杂,但是变量的定义比较繁琐,我们依次分析LINUX_RECONF_CMD、LINUX_DIR变量的值,最后再看这行规则的作用。

      1)LINUX_RECONF_CMD变量

        LINUX_RECONF_CMD定义在$(TOPDIR)/include/target.mk中:

    LINUX_RECONF_CMD = $(call __linux_confcmd,$(LINUX_RECONFIG_LIST),)

        1.1)__linux_confcmd变量

          __linux_confcmd定义在$(TOPDIR)/include/target.mk中:

    __linux_confcmd = $(SCRIPT_DIR)/kconfig.pl $(2) $(patsubst %,+,$(wordlist 2,9999,$(1))) $(1)

        1.2)LINUX_RECONFIG_LIST变量

          LINUX_RECONFIG_LIST定义在$(TOPDIR)/include/target.mk中:

    LINUX_RECONFIG_LIST = $(wildcard $(GENERIC_LINUX_CONFIG) $(LINUX_TARGET_CONFIG) $(if $(USE_SUBTARGET_CONFIG), $(LINUX_SUBTARGET_CONFIG)))

          通过这行命令,最终可得到LINUX_RECONFIG_LIST的值为:

    LINUX_RECONFIG_LIST = $(TOPDIR)/target/linux/generic/config-3.10 $(TOPDIR)/target/linux/ramips/mt7628/config-3.10

          下面分析 LINUX_RECONFIG_LIST的这行命令。

          1.2.1)GENERIC_LINUX_CONFIG变量

            GENERIC_LINUX_CONFIG定义在$(TOPDIR)/include/target.mk中:

    GENERIC_LINUX_CONFIG = $(call find_kernel_config,$(GENERIC_PLATFORM_DIR))

            其中,find_kernel_config、GENERIC_PLATFORM_DIR变量定义在$(TOPDIR)/include/target.mk中,KERNEL_PATCHVER变量定义在$(TOPDIR)/include/kernel-version.mk中,为3.10。

        __config_name_list = $(1)/config-$(KERNEL_PATCHVER) $(1)/config-default
        __config_list = $(firstword $(wildcard $(call __config_name_list,$(1))))
        find_kernel_config=$(if $(__config_list),$(__config_list),$(lastword $(__config_name_list)))
         
        GENERIC_PLATFORM_DIR := $(TOPDIR)/target/linux/generic

            因此,由上面命令,可以知道GENERIC_LINUX_CONFIG变量后面的命令表示,在$(TOPDIR)/target/linux/generic目录中为GENERIC_LINUX_CONFIG变量寻找config-3.10或config-default配置文件,如两个都有,则优先赋值config-3.10,如只有config-default,则赋值此文件,如都没有,则默认赋值config-default。由于$(TOPDIR)/target/linux/generic目录中有config-3.10文件,所以在这里赋值的是$(TOPDIR)/target/linux/generic/config-3.10。

          1.2.2)LINUX_TARGET_CONFIG变量

            LINUX_TARGET_CONFIG定义在$(TOPDIR)/include/target.mk中,BOARD变量值为ramips,前面有分析。

        PLATFORM_DIR:=$(TOPDIR)/target/linux/$(BOARD)
        LINUX_TARGET_CONFIG = $(call find_kernel_config,$(PLATFORM_DIR))

            LINUX_TARGET_CONFIG变量后面的命令表示的含义与GENERIC_LINUX_CONFIG类似。由于$(TOPDIR)/target/linux/ramips/目录中无config-3.10、config-default文件,所以在这里赋值的是$(TOPDIR)/target/linux/ramips/config-default。

          1.2.3)USE_SUBTARGET_CONFIG和LINUX_SUBTARGET_CONFIG变量

            USE_SUBTARGET_CONFIG、LINUX_SUBTARGET_CONFIG定义在$(TOPDIR)/include/target.mk中,SUBTARGET变量值为mt7628。

        PLATFORM_SUBDIR:=$(PLATFORM_DIR)$(if $(SUBTARGET),/$(SUBTARGET))
        ifneq ($(PLATFORM_DIR),$(PLATFORM_SUBDIR))
            LINUX_SUBTARGET_CONFIG = $(call find_kernel_config,$(PLATFORM_SUBDIR))
        endif
        USE_SUBTARGET_CONFIG = $(if $(wildcard $(LINUX_TARGET_CONFIG)),,$(if $(LINUX_SUBTARGET_CONFIG),1))

            上面命令中,PLATFORM_DIR的值由1.2.2)可得到,PLATFORM_SUBDIR的值为$(TOPDIR)/target/linux/ramips/mt7628,所以这两个变量不相等,ifneq条件成立,从而可知LINUX_SUBTARGET_CONFIG变量值为$(TOPDIR)/target/linux/ramips/mt7628/config-3.10。USE_SUBTARGET_CONFIG变量的为1。

      2)LINUX_DIR变量

        LINUX_DIR定义在$(TOPDIR)/include/kernel.mk中,BOARD值为ramips,SUBTARGET值为mt7628,LINUX_VERSION值为3.10.14。

        KERNEL_BUILD_DIR ?= $(BUILD_DIR)/linux-$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET))
        LINUX_DIR ?= $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)

        BUILD_DIR定义在$(TOPDIR)/rules.mk中,TARGET_DIR_NAME值为target-mipsel_24kec+dsp_uClibc-0.9.33.2。

        BUILD_DIR_BASE:=$(TOPDIR)/build_dir
        BUILD_DIR:=$(BUILD_DIR_BASE)/$(TARGET_DIR_NAME)

        最终可得到LINUX_DIR值为:

    $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14

      3)合并config文件为.config

        通过1)、2)的分析,我们知道了LINUX_RECONF_CMD、LINUX_DIR变量的值,此时,我们可将第5行规则简化如下:

    $(TOPDIR)/scripts/kconfig.pl + $(TOPDIR)/target/linux/generic/config-3.10 $(TOPDIR)/target/linux/ramips/mt7628/config-3.10 > $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14/.config

        这行规则作用是通过kconfig.pl脚本将两个config-3.10文件合并为内核顶层目录下的.config文件。
    2.2.4  生成内核图形界面配置内核

    第6行,make命令进入到内核顶层目录下,并在该目录下Makefile中寻找menuconfig目标,然后执行其对应规则,最主要的是会执行内核scripts目录中mconf可执行文件。mconf会解析内核顶层目录下Kconfig、.config文件,并绘制图形界面供我们进行相关选项的配置。然后在我们保存退出时,.config就会被及时的更新。
    2.2.5  更新mt7628的config-3.10文件

    第7行,先分析一下LINUX_RECONF_DIFF,LINUX_RECONFIG_TARGET这两个变量,再分析这行规则的作用。

      1)LINUX_RECONF_DIFF变量

        LINUX_RECONF_DIFF定义在$(TOPDIR)/include/target.mk中,__linux_confcmd在2.2.3的1.1)中可得到,LINUX_RECONFIG_LIST在2.2.3的1.2)中可得到。

    LINUX_RECONF_DIFF = $(call __linux_confcmd,$(filter-out $(LINUX_RECONFIG_TARGET),$(LINUX_RECONFIG_LIST)),'>')

        1.1)LINUX_RECONFIG_TARGET变量

          LINUX_RECONFIG_TARGET定义在$(TOPDIR)/include/target.mk中。

    LINUX_RECONFIG_TARGET = $(if $(USE_SUBTARGET_CONFIG),$(LINUX_SUBTARGET_CONFIG),$(LINUX_TARGET_CONFIG))

          USE_SUBTARGET_CONFIG,LINUX_SUBTARGET_CONFIG在2.2.3 的1.2.3)中得到,所以LINUX_RECONFIG_TARGET变量值为$(TOPDIR)/target/linux/ramips/mt7628/config-3.10。
      2)更新config文件

        可将第7行命令简化如下:

    $(TOPDIR)/scripts/kconfig.pl ‘>’ $(TOPDIR)/target/linux/generic/config-3.10 $(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14/.config > $(TOPDIR)/target/linux/ramips/mt7628/config-3.10

        我们知道内核顶层目录中的.config文件是由两个config-3.10文件合并得到的,在我们配置了内核后,.config文件将被更新。

        而这行规则作用是通过kconfig.pl脚本将更新过的.config文件,去掉$(TOPDIR)/target/linux/generic/config-3.10中的配置,得到已更新的$(TOPDIR)/target/linux/ramips/mt7628/config-3.10文件,然后重新写回到$(TOPDIR)/target/linux/ramips/mt7628/config-3.10文件。也就是说,当我们在内核中更改了配置更新了.config后,需要把mt7628的config-3.10文件也对应的更新了。
    2.3 小结

    kernel_menuconfig的规则主要做的工作是:

    (1)将内核源码从$(TOPDIR)/target/linux/src/linux-3.10.14目录拷贝到$(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628目录,等待make命令去build_dir目录中编译内核。内核源码也可以是从网上进行下载解压得到,这个过程我还未去了解,之后再找时间去看一看。

    (2)将$(TOPDIR)/target/linux/generic/config-3.10、$(TOPDIR)/target/linux/ramips/mt7628/config-3.10这两个配置文件合并到编译目录$(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.10.14/.config中。

    (3)启动内核图形配置界面,对内核进行配置,完成后更新内核顶层目录的.config文件,并由该文件更新target目录中mt7628的config-3.10文件。
    3 总结

    (1)在分析内核的配置流程后,我们可以发现整个流程其实是比较简单的,大致的主要过程是复制内核到编译目录,合并生成一个.config文件,然后进行内核配置并更新.config,最后更新mt7628的config-3.10。

    (2)一些变量的定义比较繁琐,在分析的时候比较花时间。

    (3)文中有个别地方,我目前理解的可能不太准确,希望有人能给予指出。或我知道了之后,再来更新,谢谢。
     

    展开全文
  • 配置完后,可以在/lib/firmware下查看到有以下几个内核模块文件  ppa_api.ko ppa_api_proc.ko ppa_api_sw_acel_mod.ko ppa_datapath_xrx200_d5.ko ppa_hal_xrx200_d5.ko   移植 udhcp server...

    /*****************************************************************************************************************

      

                                                           Document Author : ELvins Fu

                                               Digtal technology park, A3 -06 , shenzhen, China   

                                                                                 

          *************************************************************************************************************

          Module : Unversion Gateway Application 

          Software Version : 6.1.1

          Date : 2015-2016

          Description: the document include the kernel modilfied by special needs.

                          

    ********************************************************************************************************************/  

     

     

    驱动环境kernel说明

                                                    

    Version :0.1

     

     

    简 介

    本文档适用于Lantiq’s CPE 软件软件组件Universal Gateway(UGW)Release 6.1.1 版本的kernel的分析,对于其他类似环境有这参考的价值,对于其他环境也可以参照本环境进行分析。

    本文档既对kernel进行小量地分析,又根据大麦盒子的硬件需求,介绍了demo版默认的uboot从NAND Flash启动方式转变为SPI Flash启动的配置更改,当然,对以后的需求,如从Nor Flash也具有重要的参考意义。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    篇 二

    篇二介绍的是在nand flash转spi flash的过程中的uboot启动之加载内核的配置和更改的情况。

     

    1、内核挂载分区的情况

     

    [    2.850000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

     

    假设你有ramdisk,那么检查该ramdisk的启动地址,格式等等。再有这些没错误的话,建议检查下你的内核大小,解压后的地址是否覆盖了ramdisk的地址,如果是这样,在linux启动的时候,会在最开始报一个地址重叠的警告,虽然不会影响内核后续的启动,但是会影响到后来ramdisk及filesystem的加载。

     

    2、修改linux-3.10.12/drivers/spi$ sudo vi ltq_sflash.c

     

    1)spi flash的分区个数(根据uboot的分区个数)

     

     

    2)spi flash的分区(根据uboot的分区)

     

     

     

     

     

     

    1. spi flash的芯片支持 (芯片的型号,id等,在winbond.c中有这一款芯片的定义)

     

     

    1. 打开调试信息

    Pr_dbg改为pr_err输出信息

     

     

     

     

    在这个过程中会发现rootfs的大小给定的大小,解决方案如下

     

    Make menuconfig

     

    Uboot的mtdparts分区参数改为:

     

    mtdparts=ltq_sflash:256k(uboot),64k(gphyfirmware),9792k(rootfs),4096k(data),2096k(kernel),64k(sysconfig),4k(ubootconfig),4k(dectconfig),8k(wlanconfig)

     

    ltq_sflash:256k(uboot),64k(gphyfirmware),11840k(rootfs),2048k(data),2096k(kernel),64k(sysconfig),4k(ubootconfig),4k(dectconfig),8k(wlanconfig)

     

     

     

     

     

     

     

    4)加完之后,追踪Linux ltq_sflash.c  与Makefile和内核的.Config的联系,发现有选项未打开。

    Makefile

     

    Config

     

    make kernel_menuconfig中选择

     

    Device Drivers------->

              SPI supportt ------>

                

     

    1. 编译内核 make target/linux/install V=s 成功之后tftp下载内核

     

     

     

     

     

     

     

    1. 打开SPI flash的读写[   55.740000] ifx_spi_flash_read: (from = 0x00756e00, len = 512)

     

     

    关闭这些打印信息,之后编译make

     

     

     

    1. 配置gphy firmware

     

    -> Device Drivers

        -> Network device support (NETDEVICES [=y])

            [*]PPA Acceleration Package

     

    -> Device Drivers

        -> Network device support (NETDEVICES [=y])

             PPA Platform Selection

                (X) xRX200 

     

    -> Device Drivers

        -> Network device support (NETDEVICES [=y]

             [*]PPA Acceleration Package - Kernel APIs

     

    -> Device Drivers

        -> Network device support (NETDEVICES [=y])

             [*]Proc Filesystem Support for PPA API

     

    -> Device Drivers

        -> Network device support (NETDEVICES [=y])

           [*]PPA Acceleration Package - Data Path Driver

        -> Package Selection

           [*]PPA D5 Package <MII0/1>

     

    -> Device Drivers

        -> Network device support (NETDEVICES [=y])

            [*]LTQ_PPA_API_SW_FASTPATH

        

        配置完后,可以在/lib/firmware下查看到有以下几个内核模块文件

        ppa_api.ko

    ppa_api_proc.ko

    ppa_api_sw_acel_mod.ko

    ppa_datapath_xrx200_d5.ko

    ppa_hal_xrx200_d5.ko

     

    移植udhcp server & client

        make menuconfig

        Base system 

            -> busybox

                -> Configuration

                    -> Networking Utilities

                        -> udhcp client

                        -> udhcp server

     

     

     

     

    DAS 2047

    In insmod_main: can't insert ifx_timer_driver File exists at line:668!

    root@192:~# [ifx_cleanup_hosts_tr69_instances:4727]

     In Function [ifx_get_mgmt_server] : Error--> Failed to get URL !!

    [ifx_cleanup_traceroute_tr69_instances:4438]

     In Function [ifx_get_tr69_misc] : Error--> Failed to get AuthACS !!

     In Function [ifx_get_tr69_misc] : Error--> Failed to get AuthACS !!

     In Function [ifx_get_tr69_misc] : Error--> Failed to get AuthACS !!

    The device /dev/mtd1 could not be opened

    IFX_CWMP_AppInit:1421 [-15] Unable to get obj for Inform. rc.conf Corrupted!!

     In Function [ifx_get_tr69_misc] : Error--> Failed to get AuthACS !!

     In Function [ifx_get_tr69_auth] : Error--> Failed to get Realm !!

     In Function [ifx_get_mgmt_server] : Error--> Failed to get URL !!

    The device /dev/mtd1 could not be opened

     In Function [ifx_get_tr69_misc] : Error--> Failed to get AuthACS !!

    wait() Unblocked tPID=2047 PIDChld=2047 iStatus=2816 errno=2

    PSD

      PID USER       VSZ STAT COMMAND

        1 root      1660 S    init

        2 root         0 SW   [kthreadd]

        3 root         0 SW   [ksoftirqd/0]

        4 root         0 SW   [kworker/0:0]

        5 root         0 SW<  [kworker/0:0H]

        6 root         0 SW   [kworker/u2:0]

        7 root         0 SW<  [khelper]

        8 root         0 SW   [kworker/u2:1]

      152 root         0 SW<  [writeback]

      154 root         0 SW<  [bioset]

      156 root         0 SW<  [kblockd]

      162 root         0 SW<  [ata_sff]

      172 root         0 SW   [khubd]

      190 root         0 SW<  [rpciod]

      191 root         0 SW   [kworker/0:1]

      205 root         0 SW   [kswapd0]

      206 root         0 SW   [fsnotify_mark]

      207 root         0 SW<  [nfsiod]

      208 root         0 SW<  [crypto]

      360 root         0 SW<  [deferwq]

      363 root         0 SW   [kworker/0:2]

      365 root         0 SW<  [kworker/0:1H]

      392 root         0 SWN  [jffs2_gcd_mtd3]

      418 root      1120 S    -sh

      424 root       856 S    swreset

      476 root       872 S    /usr/sbin/ppasessmgmtd

      493 root       856 S    /usr/bin/cgroup_notifier

      495 root       872 S    /usr/bin/cgroup_daemon

      559 root         0 SW   [el_handler]

      597 root      1316 S    syslog-ng -f /tmp/syslog-ng.conf

     1093 root      1312 S    /usr/sbin/devm 1

     1241 root       880 S    /usr/sbin/dwatch

     1248 root      9068 S    /usr/sbin/mini_httpd -C /etc/mini_httpd.conf -D

     1401 root         0 SW   [TAPIkpi_in]

     1403 root         0 SW<  [TAPIevents]

     1421 root         0 SW   [VMMCsysclk]

     1522 root         0 SW   [kworker/u2:2]

     1765 root         0 SW<  [pmcu_wq]

     1781 root      1172 S    /sbin/mountd

     1873 root      3024 S    stunnel

     2120 root      1108 S    /bin/sh -c  ps -ef

     2121 root      1660 R    ps -ef

    DAS 2122

     

     

    把less关闭掉

     

    *** {build_dir/linux-lantiq_xrx200_grx288_gw_he_ethwan_lte_sample/base-files/ipkg-lantiq/base-files/etc/rc.conf}

     

     

     

     

    Make kernel_menuconfig

     

     Machine selection  --->

    关闭了

     [ ]PCIE Support

    打开了                                                                               

     [*]XRX200 PHY firmware loader                                                                                                    [*] Extra check fields on PHY firmware header

     

     

    展开全文
  • Openwrt Kernel Configuration

    2014-12-02 11:21:44
    文章源自openwrt官网,中文由笔者备注 Note that make kernel_menuconfig modifies the Kernel configuration templates of the build tree and clearing the build_dir will not revert them: While you won't ...

    文章源自openwrt官网

    Note that make kernel_menuconfig modifies the Kernel configuration templates of the build tree and clearing the build_dir will not revert them:

    While you won't typically need to do this, you can do it:

    ---深层修改内核配置命令:

    make kernel_menuconfig
    The changes can be reviewed with---与默认内核配置比对变更
    svn diff target/linux/
    and reverted with----内核配置还原
    svn revert -R target/linux/
    展开全文
  • OpenWrt Kernel Module Creation Howto About OpenWrt Kernel Module Compilation You are planning to compile a kernel module? This howto will explain what you have to do, to have your kernel module inst...
  • MT7688 openwrt kernel 编译

    2018-06-15 14:57:23
    target/linux/ramips/Makefile: $(eval $(call BuildTarget))target/linux/Makefile : export TARGET_BUILD=1include/target.mk:include $(INCLUDE_DIR)/kernel.mkifeq ($(TARGET_BUILD),1) include $(IN...
  • openwrt 怎么更换kernel

    2014-10-22 19:59:21
    openwrt 怎么更换kernel,需要注意什么吗?要改分区吗?kernel大小不同怎么办
  • openwrt之initramfs-kernel

    万次阅读 2019-01-04 14:53:25
    在下载openwrt系统时,经常能看到initramfs-kernel.bin,squashfs-factory.bin,squashfs-sysupgrade.bin等结尾的文件,factory适用于从原厂系统刷到openwrt,sysupgrade则是从openwrt刷到openwrt(已经是openwrt...
  • openwrt-给kernel打patch

    千次阅读 2015-12-14 16:04:11
    openwrt是自动下载代码进行编译的.但是,我们有时候修改一些内核代码,或者其他应用的代码。当make distclean以后,所有修改的代码都消失了。 这时,我们还要再重头修改一遍吗? 还好,有一种方式叫打补丁。 现在...
  • openwrt里面给kernel生成patch的例子。1.给Makefile生成patch Makefile里面添加了以下行: proc-y += flashid.o 进入linux-3.18.21/fs/proc目录,备份修改之前的Makefile为Makefile.bak 然后在linux根目录下面...
  • 0、故障发生 在清空闪存芯片后,只写入breed和固件后,启动过程中发生故障 1、尝试解决方案 ...[ 0.000000] Linux version 4.14.98 (openwrt@ubuntu) (gcc version 7.4.0 (OpenWrt GCC 7.4.0 r9293-e3311cb1...
  • kexec on openwrt - linux boots linux, kernel boots kernel on openwrtkexecopenwrtkernel 背景 对于嵌入式设备比如路由器,每次版本升级,总是需要image的升级,所以需要烧写Flash。这种方式速度慢,并且还...
  • OpenWrt

    千次阅读 2016-10-25 16:35:45
    Contents1 The Router 1.1 Getting started  1.1.1 Installation  1.1.2 Initial configuration  1.1.3 Failsafe mode 1.2 Configuring OpenWrt  1.2.1 Network  1.2.2 Wireless 1.3 Advanced configur
  • Openwrt

    2016-10-27 11:45:31
    烧写好openwrt-ramips-rt305x-mpr-a2-squashfs-sysupgrade.bin固件之后,开始配置openwrt四: 1.在开发板上设置ip: vi etc/config/network 2.在源代码中设置IP cd openwrt/trunk/package/base-files/files/lib/...
  • 1、强制安装 opkginstall /tmp/xxx.ipk --...一、查找官方的数字摘要,去官方网站,我们下载固件的页面,把openwrt-19.07-snapshot-r11272-e290024717-x86-64-generic.manifest这个文件下载下来 用记事本打...
  • 启动虚拟机出现如下问题: Kernel panic - not syncing: Attempted to kill init
  • 移植MT7620A+MT7610E驱动到Openwrt trunk(Linux Kernel 3.14.18) 1. MT7620 修改trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620a/mt7620/rt2880/os/linux/rt_linux.c :1201行 将: ...
  • 移植MT7620A+MT7610E驱动到Openwrt trunk(Linux Kernel 3.14.18)(续:MT7620A) 按照上一篇的内容修改文件重新编译后不会报错,但是烧到flash里后运行的时候有问题,如下: [ 16.840000] mt7620: module license '...
  • 2020.03.25-Lienol-OpenWrt 19.07稳定版,自行下载,如有侵权,通知我删除,谢谢~
  • 目录 环境 原因: 解决方法: 最后 ...软件:基于Openwrt 19.07.3的自编译版本 ...当我们修改了kernel的config文件后,编译时,openwrt会根据kernel的.config文件( $(LINUX_DIR)/.config )计算
  • <div><p>The openwrt 15.05 (git://git.openwrt.org/15.05/openwrt.git) has updated the kernel version to 3.18.45 which will result in the compilation failure of the mtk-sdk-wifi due to the lack of file ...
  • rt,在DL388 G7上使用 wepe1.2 和 IMG写盘工具 将esir的9月的高大全openwrt烧录到组了raid10的阵列上(阵列卡:P410i, 256M缓存) 然后重启,就一直卡在这里: 请问怎么解决 附服务器部分配置: cpu:Dual Intel ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,652
精华内容 1,460
关键字:

openwrt查看kernel