U-boot源码中eth_device结构体的创建初始化与运行时处理问询
U-Boot eth_device 结构体初始化与运行生命周期逻辑
eth_device 结构体的创建与初始化主体
负责创建、初始化全局eth_device结构体的核心入口是eth_initialize()函数,定义在net/eth.c源码文件中,属于U-Boot网络栈初始化的核心节点,通常在board_init_r后续初始化阶段被调用。具体创建逻辑如下:
- 新版本U-Boot统一使用驱动模型框架:
eth_initialize()会遍历所有通过U_BOOT_ETH_DRIVER()宏静态注册的网卡驱动实例,调用驱动实现的probe接口检测网卡硬件是否存在 - 探针检测通过后,驱动侧调用
eth_alloc()函数分配eth_device结构体的内存空间,完成核心成员的基础赋值,包括网卡名称、IO基地址、MAC地址默认值、驱动挂载的收发函数指针等字段 - 初始化完成的
eth_device会通过eth_register()函数注册到全局链表eth_devices中,同时第一个注册成功的设备会被默认设置为eth_current活跃设备 - 部分老版本U-Boot没有统一驱动模型,也可能在板级目录的自定义初始化代码中直接创建
eth_device结构体并注册到全局链表
注意区分全局初始化入口eth_initialize()和单设备启动接口eth_init(),二者命名接近但职责完全不同
运行阶段的维护与使用逻辑
eth_device结构体注册完成后,运行阶段的维护、使用逻辑如下:
- 活跃设备切换:U-Boot支持多网卡设备,可通过
ethact环境变量指定当前使用的网卡,执行网络操作前内核会调用eth_set_current()函数匹配环境变量指定的设备名,更新eth_current指针指向对应eth_device实例 - 运行状态维护:每次执行网络操作(ping、tftp、nfs等)前,会调用
eth_init()初始化当前活跃eth_device对应的硬件状态;操作完成后调用eth_halt()关闭网卡硬件,避免异常报文干扰后续流程 - 动态字段更新:MAC地址会在设备初始化阶段优先从环境变量
ethaddr读取并覆盖eth_device中的默认值,环境变量不存在时则读取网卡硬件内置的MAC存储单元;链路状态、协商速率等动态参数会通过关联的mii_dev/phy_driver接口读取后更新到eth_device的私有数据字段中
完整执行时序
全流程按执行顺序梳理如下:
板级后续初始化启动 -> 调用eth_initialize()遍历注册的网卡驱动执行探针 -> 探针通过后调用eth_alloc()分配并初始化eth_device-> 调用eth_register()将设备加入全局链表 -> 执行网络操作前匹配ethact环境变量设置当前活跃设备 -> 调用eth_init()启动当前网卡硬件 -> 执行网络收发操作 -> 操作结束调用eth_halt()关闭网卡硬件
内容的提问来源于stack exchange,提问作者user3693586
相关产品推荐
相关产品推荐

