交换机SDK架构与使用指南

概述

交换机SDK(Software Development Kit,软件开发工具包)是芯片厂商提供的完整软件开发包,包含了从底层硬件驱动到上层API接口的整套解决方案。SDK不是单一层次的软件,而是一个跨越多个层次的完整软件包,通常包括:

  • 内核驱动层:直接操作硬件的驱动程序
  • 用户空间库:API接口库、硬件抽象层(HAL)
  • 开发工具:配置工具、调试工具、诊断工具
  • 文档与示例:API文档、应用示例代码
  • 辅助组件:协议栈、管理框架等(可选)

关键理解:厂商发布SDK的目的是让用户能够直接使用,因此必须提供完整的驱动+API库,否则用户无法真正操作硬件。

文档导航

本指南分为以下几个部分:

📚 第一部分:架构基础

  • 软件分层架构:理解SDK在整个软件栈中的位置
  • SDK组成结构:SDK包含哪些组件(驱动、库、工具、文档)
  • 主流SDK示例:Broadcom、Marvell、Realtek SDK的结构

🚀 第二部分:加载与初始化(核心内容)

  • 第一阶段:PCIe设备枚举 - 系统如何发现交换芯片
  • 第二阶段:SDK内核驱动加载 - 驱动模块加载与初始化
  • 第三阶段:应用程序加载SDK - 链接库与API调用
  • 第四阶段:SDK内部初始化 - bcm_init()详细流程
  • 第五阶段:运行时操作 - 数据包收发与状态监控

🔧 第三部分:实战指南

  • 完整代码示例:从初始化到配置端口的完整流程
  • 常见问题排查:驱动加载失败、设备未识别、初始化错误
  • 调试技巧:使用lspci、dmesg、bcm.user等工具

🌐 第四部分:标准化接口

  • SAI与SDK的关系:理解SAI标准接口与厂商SDK的关系
  • 多厂商集成架构:如何在一个系统中支持多种芯片
  • 开发模式对比:传统模式 vs SAI模式

目录


软件分层架构

典型的交换机软件架构(从下到上)

┌─────────────────────────────────────┐
│     应用层 (Application Layer)       │  ← 用户开发的应用程序
│  - CLI命令行接口                     │
│  - Web管理界面                       │
│  - SNMP代理                          │
│  - 业务逻辑应用                      │
└─────────────────────────────────────┘
              ▲
              │ API调用
              ▼
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃  ╔═════════════════════════════════╗ ┃
┃  ║   SDK用户空间层 (User Space)    ║ ┃
┃  ║  - API接口库 (bcm_api.so)       ║ ┃
┃  ║  - 硬件抽象层 (HAL)              ║ ┃
┃  ║  - 配置管理、状态管理            ║ ┃
┃  ║  - SDK工具集                     ║ ┃
┃  ╚═════════════════════════════════╝ ┃
┃              ▲                        ┃
┃              │ ioctl/系统调用         ┃  ← SDK完整包
┃              ▼                        ┃
┃  ╔═════════════════════════════════╗ ┃
┃  ║   SDK驱动层 (Kernel Space)      ║ ┃
┃  ║  - 网络芯片驱动 (bcm_knet.ko)   ║ ┃
┃  ║  - PHY驱动                       ║ ┃
┃  ║  - DMA管理                       ║ ┃
┃  ║  - 中断处理                      ║ ┃
┃  ║  - 寄存器操作                    ║ ┃
┃  ╚═════════════════════════════════╝ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
              ▲
              │ 硬件访问(MMIO/PCI)
              ▼
┌─────────────────────────────────────┐
│      硬件层 (Hardware Layer)         │  ← 芯片厂商硬件
│  - ASIC芯片 (Broadcom/Marvell)       │
│  - 网络处理器                        │
│  - PHY物理层芯片                     │
└─────────────────────────────────────┘

说明:大框内的所有内容(用户空间库+内核驱动)都是SDK的组成部分。

SDK的组成结构

SDK典型包含的组件

交换机SDK作为完整的开发包,通常包含以下组件:

组件类别 运行空间 主要内容 示例文件
内核驱动 Kernel Space 芯片驱动模块、DMA管理、中断处理 linux-kernel-bde.ko, linux-user-bde.ko, bcm_knet.ko
用户空间库 User Space API函数库、硬件抽象层 libbcm.so, libopennsl.so
头文件 编译时 API声明、数据结构定义 bcm/port.h, bcm/vlan.h
开发工具 User Space 诊断工具、配置脚本、Shell bcm.user, diag_shell
文档 - API参考手册、编程指南 API_Reference.pdf
示例代码 - 示例应用、测试程序 example_port.c

SDK的分层职责

┌─────────────────────────────────────────────┐
│  SDK用户空间层 (SDK User Space Library)     │
│  ─────────────────────────────────────────  │
│  职责:                                     │
│  ✓ 提供高级API接口                          │
│  ✓ 参数检查与转换                          │
│  ✓ 硬件抽象与功能封装                      │
│  ✓ 多线程安全保护                          │
│  ✓ 错误处理与日志记录                      │
└─────────────────────────────────────────────┘
              ▲
              │ ioctl(), mmap(), read/write
              ▼
┌─────────────────────────────────────────────┐
│  SDK内核驱动层 (SDK Kernel Driver)          │
│  ─────────────────────────────────────────  │
│  职责:                                     │
│  ✓ 硬件资源管理(寄存器、内存映射)        │
│  ✓ DMA缓冲区管理                           │
│  ✓ 中断处理与事件通知                      │
│  ✓ PCIe/I2C/SPI总线访问                    │
│  ✓ 内核与用户空间数据交换                  │
└─────────────────────────────────────────────┘

主流交换机SDK示例

1. Broadcom SDK (OpenNSL/SDKLT)

Broadcom SDK是业界最常用的交换机SDK之一:

┌─────────────────────────────────┐
│  应用程序 (用户开发)             │
└─────────────────────────────────┘
              ↓
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ┌─────────────────────────────┐ ┃
┃ │ OpenNSL API / BCM API       │ ┃  ← SDK用户空间库
┃ │ (libbcm.so, libopennsl.so)  │ ┃
┃ └─────────────────────────────┘ ┃
┃              ↓                   ┃
┃ ┌─────────────────────────────┐ ┃
┃ │ Kernel BDE / KNET Driver    │ ┃  ← SDK内核驱动
┃ │ (linux-kernel-bde.ko)       │ ┃
┃ └─────────────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
              ↓
┌─────────────────────────────────┐
│ Broadcom ASIC (Trident/Tomahawk)│
└─────────────────────────────────┘

SDK包含

  • 驱动:linux-kernel-bde.ko, linux-user-bde.ko, bcm_knet.ko
  • 库文件:libbcm.so, libopennsl.so
  • 工具:bcm.user (诊断shell)

2. Marvell CPSS SDK

┌─────────────────────────────────┐
│  网络协议栈/应用                │
└─────────────────────────────────┘
              ↓
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ┌─────────────────────────────┐ ┃
┃ │ CPSS API层                  │ ┃  ← SDK用户空间
┃ └─────────────────────────────┘ ┃
┃              ↓                   ┃
┃ ┌─────────────────────────────┐ ┃
┃ │ PSS驱动层                   │ ┃  ← SDK内核驱动
┃ └─────────────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
              ↓
┌─────────────────────────────────┐
│ Prestera交换芯片                │
└─────────────────────────────────┘

3. Realtek SDK

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ┌─────────────────────────────┐ ┃
┃ │ RTK API (用户空间)          │ ┃
┃ └─────────────────────────────┘ ┃
┃              ↓                   ┃
┃ ┌─────────────────────────────┐ ┃
┃ │ RTK驱动 (内核模块)          │ ┃
┃ └─────────────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
              ↓
┌─────────────────────────────────┐
│ Realtek交换芯片                 │
└─────────────────────────────────┘

SDK的主要功能模块

SDK提供的主要功能模块包括:

  • 端口管理 (Port Management):端口初始化、使能/禁用、速度配置、双工模式设置、状态统计
  • VLAN管理:VLAN创建/删除、端口加入/移出VLAN、VLAN配置管理
  • MAC地址表管理:MAC地址学习、静态MAC配置、MAC老化时间设置、地址表查询
  • ACL管理:访问控制列表规则创建、匹配条件设置、动作配置
  • 统计信息获取:端口统计、流量统计、错误统计、性能监控
  • 链路聚合 (LAG):端口聚合配置、负载均衡、故障切换
  • QoS管理:优先级队列、流量整形、拥塞控制
  • 镜像功能:端口镜像、流镜像、RSPAN配置
  • 多播管理:IGMP Snooping、组播转发表、MLD配置

SDK加载与使用流程

完整的系统启动流程

从系统上电到SDK可用,需要经历以下关键步骤:

图1:SDK系统启动流程

┌─────────────────────────────────────────────────────────────┐
│                    SDK系统启动完整流程                        │
└─────────────────────────────────────────────────────────────┘

    ┌─────────────────┐
    │   系统上电      │  阶段0:硬件启动
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │ BIOS/UEFI初始化  │  - PCIe控制器初始化
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │  PCIe总线枚举    │  - 扫描PCIe设备
    └────────┬────────┘  - 分配资源(BAR、IRQ)
             │
             ▼
    ┌─────────────────┐
    │ 发现交换芯片设备 │  - 读取Vendor ID/Device ID
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │ Linux内核启动   │  阶段1:操作系统启动
    └────────┬────────┘
             │
             ▼
    ╔═════════════════╗
    ║ 加载SDK内核驱动  ║  阶段2:驱动加载 ⚙️
    ╚═══════┬═════════╝  - insmod linux-kernel-bde.ko
             │            - insmod linux-user-bde.ko
             ▼            - insmod bcm_knet.ko
    ╔═════════════════╗
    ║ 驱动初始化硬件   ║  - 映射BAR地址
    ╚═══════┬═════════╝  - 分配DMA内存
             │            - 注册中断处理
             ▼            - 创建设备文件
    ┌─────────────────┐
    │  应用程序启动    │  阶段3:应用启动
    └────────┬────────┘
             │
             ▼
    ╔═════════════════╗
    ║ 加载SDK用户空间库║  阶段4:SDK初始化 🚀
    ╚═══════┬═════════╝  - 链接libbcm.so
             │            - 打开/dev/linux-kernel-bde
             ▼
    ╔═════════════════╗
    ║   SDK初始化     ║  - bcm_driver_init()
    ╚═══════┬═════════╝  - bcm_attach()
             │            - bcm_init()
             ▼
    ┌─────────────────┐
    │  配置交换芯片    │  - 端口配置
    └────────┬────────┘  - VLAN配置
             │            - 启动Linkscan
             ▼
    ╔═════════════════╗
    ║   系统就绪 ✓    ║  阶段5:运行状态
    ╚═════════════════╝  可以处理网络流量

第一阶段:PCIe设备枚举

1.1 硬件初始化

系统上电后,BIOS/UEFI负责初始化PCIe总线:

1. 系统上电 (Power On)
   ↓
2. BIOS/UEFI执行
   ↓
3. PCIe总线扫描
   ↓
4. 检测PCIe设备
   - 读取配置空间
   - 分配内存地址(BAR)
   - 分配中断号(IRQ)
   ↓
5. 构建设备树
1.2 交换芯片被识别

系统启动后,可使用lspci命令查看PCIe设备是否被正确识别。

以Broadcom交换芯片为例,系统识别出的关键信息包括:

  • Vendor ID: 14e4 (Broadcom)
  • Device ID: b850 (BCM56850)、b960 (BCM56960)等
  • BAR地址: 内存映射基地址(如f7000000f6000000),用于访问芯片寄存器
  • IRQ中断号: 分配给该设备的中断号(如50)
  • 内存大小: 每个BAR映射的内存区域大小(通常16MB)
  • PCIe功能: 支持的电源管理、MSI中断等能力

这些信息将在驱动初始化时使用,用于建立CPU与交换芯片之间的通信通道。

第二阶段:SDK内核驱动加载

2.1 驱动模块加载

使用insmod命令手动加载Broadcom SDK驱动模块:

  • linux-kernel-bde.ko - 内核设备驱动
  • linux-user-bde.ko - 用户空间桥接驱动
  • bcm_knet.ko - 网络内核模块

加载后可通过lsmod查看模块状态,通过dmesg查看内核日志确认设备被正确识别和初始化。

2.2 驱动初始化流程

内核驱动的初始化过程包括:

  1. 注册PCI驱动:向内核注册PCI设备驱动
  2. 设备探测(Probe):当匹配到设备时触发
  3. 使能PCI设备:激活PCI设备并设置为总线主控
  4. 内存映射:映射BAR0/BAR1到内核虚拟地址空间
  5. DMA分配:分配DMA缓冲区用于数据传输
  6. 中断注册:注册中断处理函数
  7. 字符设备创建:创建/dev/linux-kernel-bde等设备文件
  8. 芯片复位:对交换芯片执行复位操作
2.3 创建的设备文件

驱动加载后会创建以下设备文件供用户空间访问:

  • /dev/linux-kernel-bde - 内核驱动接口
  • /dev/linux-user-bde - 用户空间接口
  • /dev/bcm-knet - 网络数据包接口

第三阶段:应用程序加载SDK

3.1 链接SDK库

应用程序编译时需要链接SDK库文件:

  • 指定头文件路径(-I):包含SDK API声明
  • 指定库文件路径(-L):指向SDK动态库位置
  • 链接库文件(-l):如libbcm.solibopennsl.so
3.2 SDK初始化流程

应用程序的SDK初始化包括以下关键步骤:

步骤1:SDK系统初始化

  • 调用SDK驱动初始化函数
  • 建立用户空间与内核驱动的连接

步骤2:附加设备

  • 指定要控制的芯片单元(unit)
  • 指定芯片型号(如BCM56850)
  • 附加成功后可对该设备进行操作

步骤3:初始化设备

  • 触发SDK内部的完整初始化流程
  • 包括芯片识别、内存分配、表项初始化等

步骤4:端口初始化

  • 使能需要的端口
  • 配置端口速度(1G/10G/25G/40G/100G)
  • 设置双工模式(全双工/半双工)

步骤5:VLAN配置

  • 创建VLAN
  • 将端口加入VLAN
  • 配置VLAN属性

步骤6:启动Linkscan

  • 启动链路状态监控线程
  • 设置扫描间隔
  • 自动检测端口UP/DOWN状态

步骤7:进入运行状态

  • 应用程序主循环运行
  • 处理业务逻辑
  • 响应链路状态变化

第四阶段:SDK内部初始化流程

4.1 bcm_init() 内部执行流程
bcm_init(unit)
    ↓
1. 芯片识别与验证
   - 读取芯片ID寄存器
   - 验证芯片型号
   - 检查芯片版本
    ↓
2. 内存初始化
   - 分配共享内存
   - 初始化DMA描述符
   - 设置内存保护
    ↓
3. 表项初始化
   - L2地址表 (ARL)
   - L3路由表
   - ACL规则表
   - VLAN表
    ↓
4. 端口子系统初始化
   - PHY驱动加载
   - 端口映射配置
   - SerDes初始化
    ↓
5. 包处理引擎初始化
   - RX DMA配置
   - TX DMA配置
   - CPU端口配置
    ↓
6. 协议栈初始化(可选)
   - L2学习引擎
   - STP协议
   - IGMP Snooping
    ↓
7. 中断系统启用
   - 注册中断回调
   - 使能中断
    ↓
完成,返回BCM_E_NONE
4.2 关键数据结构

SDK内部维护设备控制块,用于管理芯片状态,包含以下关键信息:

  • 设备单元号(unit)
  • 芯片型号字符串
  • 芯片ID和版本
  • BAR地址映射
  • DMA内存池
  • 端口数量和端口信息数组
  • 表项管理结构
  • 线程和锁资源

第五阶段:运行时操作

5.1 数据包收发流程

发送数据包(TX)

  1. 分配包描述符
  2. 填充数据包内容
  3. 设置出端口
  4. 调用TX函数发送
  5. 释放包描述符

接收数据包(RX)

  1. 配置RX参数(包大小、队列深度、速率限制)
  2. 启动RX引擎
  3. 注册接收回调函数
  4. 在回调中处理接收到的数据包
  5. 返回处理结果
5.2 系统运行状态检查

SDK提供诊断工具(如bcm.user)用于查看系统运行状态:

端口统计信息

  • RX/TX数据包计数
  • RX/TX字节数
  • 错误计数器
  • 丢包统计

端口状态信息

  • 端口状态(UP/DOWN)
  • 速度(1G/10G/25G/40G/100G)
  • 双工模式(FULL/HALF)
  • 链路状态
  • 自动协商状态

VLAN配置信息

  • VLAN列表
  • 每个VLAN的成员端口
  • VLAN属性

常见问题排查

问题1:驱动加载失败

排查步骤

  1. 检查内核版本兼容性:使用uname -r查看内核版本,确认驱动是否与该版本兼容
  2. 查看驱动编译信息:使用modinfo命令查看驱动模块信息,确认编译参数正确
  3. 检查依赖关系:使用lsmod查看模块是否加载,检查依赖模块
  4. 查看内核日志:使用dmesg查看详细错误信息

常见原因

  • 内核版本不匹配
  • 缺少依赖库或模块
  • 驱动未正确编译
  • 权限不足
问题2:设备未识别

排查步骤

  1. 检查PCIe设备:使用lspci命令查看设备是否被识别
  2. 检查硬件连接:确认芯片物理连接正常
  3. 检查设备文件:确认/dev/linux-kernel-bde等设备文件已创建
  4. 检查设备权限:确保应用程序有权限访问设备文件

常见原因

  • 硬件故障或连接问题
  • PCIe枚举失败
  • 驱动未正确加载
  • 设备文件权限错误
问题3:SDK初始化失败

排查步骤

  1. 添加详细日志:在初始化失败时打印错误码和错误信息
  2. 检查设备状态:确认设备是否成功附加
  3. 验证配置文件:检查SDK配置是否正确
  4. 查看芯片状态:确认芯片是否处于正常工作状态

常见原因

  • 芯片型号不匹配
  • 内存分配失败
  • 配置参数错误
  • 芯片复位失败

SAI与SDK的关系

SAI (Switch Abstraction Interface)

SAI是一个标准化的API接口规范,而不是SDK本身。

SAI的定位
┌─────────────────────────────────────┐
│  SONiC / 网络操作系统               │
└─────────────────────────────────────┘
              ↓
┌─────────────────────────────────────┐
│  SAI API (标准接口层)                │  ← 统一的抽象接口
│  - sai_port_api_t                    │
│  - sai_vlan_api_t                    │
│  - sai_switch_api_t                  │
└─────────────────────────────────────┘
              ↓
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃  ┌─────────────────────────────┐   ┃
┃  │ SAI实现 (厂商SDK适配层)    │   ┃  ← 各厂商基于自己的SDK实现SAI
┃  │ - Broadcom SAI              │   ┃
┃  │ - Marvell SAI               │   ┃
┃  │ - Mellanox SAI              │   ┃
┃  └─────────────────────────────┘   ┃
┃              ↓                       ┃
┃  ┌─────────────────────────────┐   ┃
┃  │ 厂商SDK (驱动+API)          │   ┃  ← 各厂商的原生SDK
┃  │ - Broadcom SDK              │   ┃
┃  │ - Marvell CPSS              │   ┃
┃  │ - Mellanox SX SDK           │   ┃
┃  └─────────────────────────────┘   ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
              ↓
┌─────────────────────────────────────┐
│  交换芯片硬件                       │
└─────────────────────────────────────┘

SAI与SDK的关系说明

对比项 SDK SAI
本质 完整的软件开发包(驱动+API+工具) 标准化的API接口规范
提供者 芯片厂商(Broadcom/Marvell等) OCP社区/微软主导
包含内容 驱动、库文件、头文件、工具、文档 仅API头文件定义(.h
硬件相关 高度硬件相关 硬件无关(标准接口)
实现方式 厂商直接提供 需要厂商基于SDK实现
应用场景 传统网络设备 白盒交换机、SDN

SAI实现原理

厂商的SAI实现实际上是在原生SDK之上的一层适配器(Adapter)

SAI提供标准化的API接口定义,各厂商需要基于自己的SDK实现这些接口。当应用程序调用SAI接口时,SAI实现层会将标准调用映射到厂商特定的SDK API。例如:

  • SAI的端口创建接口会调用Broadcom SDK的端口创建函数
  • SAI的VLAN设置接口会映射到BCM的VLAN API

这种适配器模式使得应用程序可以使用统一的SAI接口,而无需关心底层使用的是哪个厂商的SDK。

开发模式对比

传统模式(直接使用厂商SDK)
应用程序 → Broadcom SDK → Broadcom芯片
应用程序 → Marvell SDK → Marvell芯片
应用程序 → Realtek SDK → Realtek芯片

问题:应用需要适配多个厂商的SDK

SAI模式(标准化接口)
应用程序 → SAI接口 → {Broadcom SAI实现 → Broadcom SDK}
                    → {Marvell SAI实现 → Marvell SDK}
                    → {Realtek SAI实现 → Realtek SDK}

优势:应用只需对接SAI,厂商负责实现SAI到SDK的映射

完整的交换机软件架构(Mermaid图)

多厂商SDK集成架构

下图展示了在Docker容器中运行的交换机应用如何通过SDK与不同厂商芯片交互:

图2:多厂商SDK集成架构图

Linux Host System
Docker Container
内核空间 Kernel Space
硬件层
SDK驱动层
交换机应用 Switch App
SDK用户空间层
统一抽象接口层
管理模块
功能模块
ioctl/mmap
ioctl/mmap
ioctl/mmap
Broadcom芯片
Trident/Tomahawk
Marvell芯片
Prestera
Realtek芯片
RTL83xx
Broadcom驱动
linux-kernel-bde.ko
bcm_knet.ko
Marvell驱动
prestera.ko
Realtek驱动
rtk_drv.ko
Broadcom SDK库
libbcm.so
Marvell SDK库
libcpss.so
Realtek SDK库
librtk.so
端口管理
VLAN管理
二层转发
MAC学习
生成树协议
配置管理
状态监控
CLI接口
REST API
统一API接口

架构说明

  1. 应用层:运行在Docker容器中的交换机应用程序
  2. SDK用户空间层:各厂商SDK提供的用户空间库(.so文件)
  3. SDK驱动层:各厂商SDK提供的内核驱动(.ko模块)
  4. 硬件层:物理交换芯片

关键点

  • SDK包含用户空间库和内核驱动两部分
  • 用户空间库通过ioctl/mmap与内核驱动通信
  • 应用程序不直接访问硬件,必须通过SDK

结论

交换机SDK的准确定位

交换机SDK是完整的软件开发包,跨越驱动层和中间层,具有以下特点:

核心特征

  • 包含驱动:提供内核驱动模块(.ko)用于硬件访问
  • 包含API库:提供用户空间库(.so)供应用调用
  • 完整方案:驱动+API+工具+文档的完整包
  • 厂商提供:芯片厂商负责维护和发布

为什么包含驱动

  • 用户需要直接可用的解决方案
  • 驱动层是操作硬件的必要组件
  • 厂商最了解自己的硬件特性
  • 保证驱动与API的兼容性

与SAI的关系

  • SAI是标准化的API接口规范
  • SDK是厂商提供的完整实现
  • SAI需要基于SDK实现(适配层)
  • SDK可以独立使用,无需SAI

总结图示

┌────────────────────────────────────┐
│   应用层 (Application)              │ ← 用户开发的程序
├────────────────────────────────────┤
│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ SDK用户空间库 (User Library) ┃ │ ┐
│ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │ │
├────────────────────────────────────┤ ├─ SDK完整包
│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │
│ ┃ SDK内核驱动 (Kernel Driver)  ┃ │ ┘
│ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │
├────────────────────────────────────┤
│   硬件层 (Hardware)                │ ← 交换芯片
└────────────────────────────────────┘

参考资源

官方文档

开源项目

  • OpenNSL: Broadcom的开源SDK
  • SAI实现: 各厂商的SAI适配层
  • OF-DPA: OpenFlow数据平面抽象
  • DPDK: 数据平面开发套件

技术文档

  • Linux Kernel Driver Development
  • PCI/PCIe Driver Programming
  • Network Switch Architecture
  • OCP (Open Compute Project) Switch Specifications

文档版本:v3.1
创建日期:2025年11月19日
更新日期:2025年11月19日
适用范围:网络设备、交换机、路由器SDK开发
主要修订

  • v1.0: 初始版本,基础层次架构介绍
  • v2.0: 修正SDK定义为完整开发包(包含驱动+API),补充SAI关系
  • v3.0: 新增SDK加载与使用流程(PCIe枚举、驱动加载、初始化、运行时操作),文档改名为《架构与使用指南》
  • v3.1: 删除所有代码示例和数据结构定义,专注于架构原理和流程说明

文档内容覆盖

  • ✅ SDK概念与组成结构
  • ✅ 软件分层架构
  • ✅ 主流SDK示例(Broadcom/Marvell/Realtek)
  • ✅ SDK加载与初始化完整流程(文字描述)
  • ✅ PCIe设备枚举与驱动加载原理
  • ✅ 应用程序开发流程说明
  • ✅ SAI与SDK的关系
  • ✅ 多厂商集成架构
  • ✅ 常见问题排查思路

文档特点

  • 📖 纯理论与架构说明,无代码实现细节
  • 🎯 适合理解SDK整体架构和工作原理
  • 🔄 流程驱动,从上电到运行的完整过程
  • 🌐 覆盖多厂商SDK和SAI标准化接口
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐