04 _openWRT环境kernel分析

本文档详细分析了Lantiq UGW 6.1.1版本kernel,特别是在从NAND Flash转向SPI Flash启动的配置更改。内容包括内核挂载分区问题的解决、SPI闪存的配置、Linux内核相关驱动的修改,以及针对gphy firmware的配置。此外,还涉及udhcp server和client的移植。

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

  

                                                       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的分区个数)

 

<think> 我们分析一下这段Makefile代码: ifeq ($(CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT),y) MAKE_FLAGS += USER_32BIT_COMPAT_KERNEL_64BIT="y" endif 这段代码的用途是:当配置选项`CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT`被设置为`y`(即yes)时,将`USER_32BIT_COMPAT_KERNEL_64BIT="y"`添加到变量`MAKE_FLAGS`中。 ### 详细解释: 1. **条件判断**: - `ifeq ($(CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT),y)`:判断变量`CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT`的值是否等于`y`。 - 这个变量通常来自配置系统(如Kconfig),用于表示是否启用了“用户空间32位兼容64位内核”的功能。 2. **变量追加**: - `MAKE_FLAGS += USER_32BIT_COMPAT_KERNEL_64BIT="y"`:如果条件成立,则向`MAKE_FLAGS`变量追加一个字符串`USER_32BIT_COMPAT_KERNEL_64BIT="y"`。 - `MAKE_FLAGS`通常用于传递参数给子Makefile或命令(如make递归调用时)。 3. **用途**: - 这段代码的作用是:当用户配置了需要支持32位用户空间程序运行在64位内核上(即32位兼容模式)时,将这一配置通过`MAKE_FLAGS`传递给后续的编译过程。 - 在后续的构建步骤中,`MAKE_FLAGS`中的这个值会被解析,并可能用于: - 条件编译:在C代码中通过宏定义控制编译不同的代码路径。 - 影响链接选项:例如,链接32位兼容库。 - 传递给其他脚本或工具:告知它们需要构建32位兼容的支持。 ### 实际应用场景: 在构建Linux内核或嵌入式系统(如OpenWrt)时,经常会遇到需要同时支持32位64位的情况。例如: - 64位内核运行32位用户程序:需要内核开启兼容模式,用户空间库需要32位版本。 - 构建系统需要根据这个配置来调整编译参数,比如: ```makefile ifdef USER_32BIT_COMPAT_KERNEL_64BIT CFLAGS += -m32 LDFLAGS += -m32 endif ``` ### 与引用内容的关联: - 引用[1][2]展示了Makefile中如何包含其他Makefile传递变量(如`MAKEFLAGS`)[^1][^2]。 - 引用[3]提到了变量导出(`export`)静默输出控制[^3],这与构建系统的输出变量传递机制相关。 - 引用[4]展示了配置系统如何生成头文件Makefile[^4],而本例中的`CONFIG_*`变量很可能就是由类似的配置系统生成的。 - 引用[5]展示了版本号定义变量传递(`export`)[^5],与`MAKE_FLAGS`的用途类似。 ### 总结: 这段代码是构建系统中用于条件传递配置选项的典型模式。它根据一个配置变量的值,将另一个定义添加到`MAKE_FLAGS`中,从而影响后续的构建步骤。这有助于实现条件编译配置的传递。 §§相关问题§§ 1. `CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT` 变量通常是在哪里定义的? 2. 在Makefile中,`MAKE_FLAGS` 变量一般是如何使用的? 3. 如何确保在递归调用make时,`USER_32BIT_COMPAT_KERNEL_64BIT` 变量能够被子Makefile正确识别? 4. 在C代码中如何使用这个配置选项? </think>### Makefile代码解析 这段Makefile代码的用途是**根据配置选项动态设置编译标志**,用于支持32位用户空间程序在64位内核上的兼容模式。具体分析如下: ```makefile ifeq ($(CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT),y) MAKE_FLAGS += USER_32BIT_COMPAT_KERNEL_64BIT="y" endif ``` ### 功能详解 1. **条件判断**: - `ifeq ($(CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT),y)`:检查配置变量 `CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT` 是否设置为 `y`(即启用状态) - 该变量通常由配置系统(如Kconfig)生成,用于声明内核是否支持32位用户程序兼容模式[^4] 2. **标志传递**: - `MAKE_FLAGS += USER_32BIT_COMPAT_KERNEL_64BIT="y"`:当条件满足时,向编译标志变量 `MAKE_FLAGS` 追加新定义 - 添加的 `USER_32BIT_COMPAT_KERNEL_64BIT="y"` 会成为环境变量传递给子Makefile或编译工具链[^3] 3. **实际作用**: - 启用32/64位兼容模式:在64位内核上运行32位用户程序时,需要特殊的ABI兼容层 - 控制代码编译路径:内核或驱动代码中可通过检查此标志启用兼容代码: ```c #ifdef USER_32BIT_COMPAT_KERNEL_64BIT // 32位兼容模式专用代码 #endif ``` - 影响链接器行为:可能添加 `-m32` 等跨位宽编译选项[^4] ### 工作流程示例 ```mermaid graph TD A[配置系统] -->|生成.config| B(CONFIG_USER_32BIT_COMPAT_KERNEL_64BIT=y) B --> C{Makefile条件判断} C -->|条件成立| D[追加MAKE_FLAGS] D --> E[子Makefile/编译工具] E -->|读取环境变量| F[启用32位兼容代码] ``` ### 典型应用场景 1. **嵌入式Linux系统**:在64位OpenWrt路由器固件中运行32位IoT程序 2. **混合架构环境**:数据中心服务器同时运行64位应用遗留32位应用 3. **驱动开发**:64位内核驱动需要兼容32位用户空间ioctl调用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值