首页/目录/全部文章

全部文章

八个专题的源码、算法与协议笔记都在这里。

笔记列表

引导期内存机制与实现详解

引导期内存机制与实现详解

源码路径rk3588/kernel-6.1/mm/memblock.csparse.cinit-mm.cmm_init.c
内核版本:Linux 6.1(RK3588 / ARM64)
文档目录linuxDoc/mm/


目录


一、原理

1.1 为什么需要 memblock

内核启动早期,伙伴分配器(buddy)SLUB 尚未初始化,但架构代码、设备树解析、CMA 预留等已经需要“分配/保留”物理地址范围。此时使用 memblock 作为临时分配器:

  • 将系统视为若干 连续物理区间(region)
  • 区分 可用内存(memory)已保留(reserved)
  • 只做 线性遍历与合并,不做细粒度 free list

1.2 从 memblock 到 buddy 的过渡

DT/架构登记内存memblock memory/reservedsparse_init 建立 page 描述符free_area_init 初始化 zonememblock_free_all 页交给 buddypage_alloc_init / kmem_cache_init

1.3 稀疏内存(SPARSEMEM)

ARM64 通常启用 CONFIG_SPARSEMEM:物理内存按 section 分段,只为实际存在的 section 分配 struct page 数组,避免为空洞内存浪费静态数组。

可选 CONFIG_SPARSEMEM_VMEMMAP:用虚拟映射的 vmemmap 降低元数据占用。

1.4 init_mm

全局 init_mm 是内核初始地址空间(swapper_pg_dir),所有内核线程在借用用户 mm 之前依赖它;与用户进程的 mm_struct 分离。


二、实现方式

2.1 memblock 核心结构

memblock.c 维护:

类型 变量 含义
memory memblock.memory 内核可见 RAM
reserved memblock.reserved 已保留(内核镜像、DTB、initrd、CMA 等)
physmem physmem(可选) 实际物理内存视图

每个 region 为 struct memblock_region { base, size, flags, nid }

2.2 登记与保留 API

函数 作用
memblock_add() / memblock_add_node() 添加可用内存
memblock_reserve() 标记保留,不再作为可分配 RAM
memblock_remove() 移除某段 memory
memblock_alloc() 早期从 memory 中切一块(仍非 buddy)

架构在 setup_arch() 中解析 DT 后调用 memblock_addreserved-memory 节点对应 memblock_reserve

2.3 释放给 buddy:memblock_free_all()

1
2
3
4
5
6
7
8
9
10
void __init memblock_free_all(void)
{
unsigned long pages;

free_unused_memmap();
reset_all_zones_managed_pages();

pages = free_low_memory_core_early();
totalram_pages_add(pages);
}

流程要点:

  1. free_unused_memmap():释放未使用 section 的 memmap 浪费
  2. reset_all_zones_managed_pages():同步 zone 的 managed_pages
  3. free_low_memory_core_early():遍历 memory region,对非保留页调用 __free_pages_memory(),页进入伙伴系统

之后 memblock_discard() 可丢弃 memblock 内部数据结构(仅保留 debugfs 需要时)。

2.4 sparse_init

sparse.csparse_init()

  • 为每个 online section 调用 sparse_init_one_section()
  • 建立 pfn ↔ struct page 映射
  • pfn_valid()NODE_DATA() 等后续 MM API 衔接

2.5 free_area_init 与 page_alloc_init

page_alloc.c

  • free_area_init(max_zone_pfn):按 zone 切分 PFN 范围,初始化 pg_data_t、水位线、空闲链表头
  • page_alloc_init():注册 CPU hotplug 回调,初始化 per-CPU page lists(zone_pcp_update

2.6 mm_init.c

mm_init.c 提供 调试验证CONFIG_DEBUG_MEMORY_INIT):打印 zonelist、pageflags 位域布局,不参与运行时分配。

2.7 init-mm.c

静态定义 struct mm_struct init_mm,绑定 swapper_pg_dirmmap_lock、maple tree 根等,供内核态页表操作使用。


三、关键数据结构与接口

符号 文件 说明
memblock_add memblock.c ~747 UMA 添加内存
memblock_reserve memblock.c ~891 保留物理范围
memblock_free_all memblock.c ~2279 交接 buddy
sparse_init sparse.c ~559 稀疏 memmap
free_area_init page_alloc.c ~8393 zone 初始化
init_mm init-mm.c 内核 mm

四、RK3588 平台说明

4.1 设备树与 reserved-memory

RK3588 在 DT 中常见:

  • linux,cma 默认 CMA 池
  • 显示/相机/VPU 专用 reserved-memory

这些在 arch/arm64 或 early boot 中转为 memblock_reserve(),在 memblock_free_all不会 进入 buddy 空闲链表。

4.2 Rockchip Thunder Boot 延迟释放(本树特有)

memblock.cCONFIG_ROCKCHIP_THUNDER_BOOT_DEFER_FREE_MEMBLOCK

  • 大块内存可登记到 db[],在 defer_free_memblock 内核线程中 延迟 __free_pages_memory
  • rk_defer_init_hpages() 可推迟 HighMem 区页初始化(本配置下 ARM64 通常不涉及 HighMem)
  • 目的:加快快启路径,稍后再把 RAM 交给 buddy

排查启动内存问题时,注意 dmesgdefer_free_memblock 相关 pr_info

4.3 ARM64 无 highmem

RK3588 64 位内核一般 不使用 highmem.c 热路径;可用内存在 ZONE_NORMAL(及 ZONE_DMA32)。


五、调试与观测

手段 说明
CONFIG_DEBUG_FS + CONFIG_ARCH_KEEP_MEMBLOCK debugfs /sys/kernel/debug/memblock/{memory,reserved}
启动 log mem=earlycon 下 memblock 区域打印
mminit_verify_zonelist mm_init.c,需 mminit_loglevel

附录:源码索引

主题 文件 约略行号
memblock 释放 memblock.c 2279+
RK defer free memblock.c 2145–2204
sparse 初始化 sparse.c 559+
zone 初始化 page_alloc.c 8393+
init_mm init-mm.c 30+

物理页分配机制与实现详解

物理页分配机制与实现详解

源码路径rk3588/kernel-6.1/mm/page_alloc.cmmzone.cvmstat.c
内核版本:Linux 6.1(RK3588 / ARM64)
文档目录linuxDoc/mm/


目录


一、原理

1.1 伙伴系统(Buddy Allocator)

物理内存按 2^order 个连续页 组成块管理:

  • order 0:单页(4KB,取决于 PAGE_SIZE
  • order n:2^n 页连续块
  • 分配:在对应 order 空闲链取块;若无则向更高 order 分裂
  • 释放:与 buddy 合并,若 buddy 也空闲则升阶

优点:O(log N) 分配/释放;缺点:外部碎片(有足够空闲页但无足够连续块)。

1.2 Zone 分层

每个 NUMA node(RK3588 UMA 通常仅 node 0)划分为多个 zone

Zone ARM64 典型用途
DMA32 低 4GB,32 位 DMA 设备
NORMAL 主内存
(CMA 区域) 页带 PageCMA,平时可迁移,CMA 分配时 pin

分配请求通过 zonelist 按策略遍历 zone(本地 node 优先、fallback 等)。

1.3 水位线(Watermark)

每个 zone 维护 min / low / high 三档空闲页阈值:

水位 行为
free > high 正常分配
free ≤ low 唤醒 kswapd 异步回收
free ≤ min 分配器在慢路径 同步 direct reclaim
仍不足 compaction → 可能 OOM

1.4 GFP 与迁移类型

gfp_t 指定分配上下文:是否可睡眠、是否 IO/FS、是否 DMA32、是否 可迁移(MIGRATE_MOVABLE) 等。

迁移类型(migratetype) 将空闲页分类(不可迁移、可迁移、可回收、CMA 等),避免不可移动内核数据阻塞 compaction。

1.5 Per-CPU 页缓存(PCP)

为降低 zone->lock 竞争,每个 CPU 有 per-cpu pageset:小 order 分配优先从本地列表取,批量 refill/drain。


二、实现方式

2.1 总入口:__alloc_pages()

1
2
3
4
5
6
7
8
9
10
11
12
13
struct page *__alloc_pages(gfp_t gfp, unsigned int order, int preferred_nid,
nodemask_t *nodemask)
{
// ...
prepare_alloc_pages(...);
page = get_page_from_freelist(alloc_gfp, order, alloc_flags, &ac);
if (likely(page))
goto out;
page = __alloc_pages_slowpath(alloc_gfp, order, &ac);
out:
// memcg charge, trace, kmsan ...
return page;
}

快路径get_page_from_freelist() 在水位允许时从 zonelist 取页。
慢路径__alloc_pages_slowpath() → direct reclaim、try_to_compact_pages、再次尝试 freelist,最后 __alloc_pages_may_oom()

2.2 prepare_alloc_pages

构建 struct alloc_context

  • 解析 preferred nid、nodemask(NUMA/cpuset)
  • 计算 alloc_flagsALLOC_WMARK_*ALLOC_CPUSET 等)
  • 选择起始 zoneref

2.3 get_page_from_freelist

对每个候选 zone:

  1. 检查 水位 + cpuset + spread
  2. 调用 rmqueue() 从 buddy 或 PCP 取页
  3. prep_new_page() 初始化页状态

失败则尝试下一个 zone 或降低 watermark 等级(ALLOC_NO_WATERMARKS 仅特殊 GFP)。

2.4 rmqueue 与伙伴合并

  • __rmqueue_smallest:从最小满足 order 的 free_area 取
  • expand():分裂大块
  • __free_one_page() / free_pages():释放时 buddy = pfn ^ (1 << order) 尝试合并

2.5 慢路径概要

1
2
3
4
5
__alloc_pages_slowpath
├─ wake_all_kswapds()
├─ __perform_reclaim() // direct reclaim
├─ try_to_compact_pages() // 需要连续物理页时
└─ __alloc_pages_may_oom()

2.6 初始化

阶段 函数 说明
zone 建立 free_area_init() 各 zone 的 free_area、水位
页进入 buddy memblock_free_all 间接 见 01 文档
PCP page_alloc_init() CPU hotplug 注册 page_alloc_cpu_online/dead

2.7 vmstat.c

维护 NR_FREE_PAGESNR_ALLOC_BATCH、per-zone LRU 统计等,供 /proc/vmstat/proc/zoneinfo 与回收逻辑读取。


三、关键数据结构与接口

结构/接口 说明
struct zone free_area[]、watermark、percpu pageset
struct free_area 按 order 的空闲链表
__alloc_pages 页分配核心
alloc_pages 包装,返回 page
__get_free_pages 返回内核虚拟地址(非 highmem)
free_pages / __free_pages 释放

order 上限MAX_ORDER(通常 11,即 4MB 块,与配置相关)。


四、RK3588 平台说明

  • 编解码/显示驱动大块 DMA 常需 高 orderCMA;buddy 高 order 失败时依赖 compaction(见 07 文档)。
  • __GFP_DMA32:限制从 DMA32 zone 分配,避免 32 位设备无法访问高物理地址。
  • CMA 页:带 PageCMA,普通 __alloc_pages 在无 CMA 标志时不应长期占用 CMA 池(由 migratetype 与 gfp 约束)。

五、调试与观测

接口/参数 内容
/proc/buddyinfo 各 zone 各 order 空闲块数
/proc/pagetypeinfo 迁移类型分布
/proc/zoneinfo 水位线与统计
min_free_kbytes sysctl,影响 min 水位
watermark_scale_factor 影响 low/high 计算

tracepoint:trace_mm_page_alloc


附录:源码索引

主题 文件 约略行号
__alloc_pages page_alloc.c 5596
page_alloc_init page_alloc.c 8733
free_area_init page_alloc.c 8393
zone 统计 vmstat.c 全文

net 网络子系统机制与原理详解

net 网络子系统机制与原理详解

1. 在内核中的位置

rk3588/kernel-6.1/net/(约 1887 文件)实现 Linux 内核网络协议栈:从 socket(2) 系统调用到 链路层以太类型处理,涵盖 IPv4/IPv6、TCP/UDP、路由、邻居、Netfilter、tc、BPF、无线 cfg80211 等。

不包含 具体网卡/MAC/PHY 寄存器驱动——它们在 drivers/net/,通过 struct net_devicenetdev_opsnapi_pollnet/ 协作。

用户态 socket/ioctl/netlinknet/socket.cAF_INET / AF_PACKET / AF_UNIX ...net/core sock skb devipv4 / ipv6netfilter hooksdrivers/net ndo_start_xmitPHY / DMA

2. 顶层 Makefile 逻辑

1
2
3
4
5
6
obj-y := devres.o socket.o core/
obj-y += ethernet/ 802/ sched/ netlink/ bpf/ ethtool/
obj-$(CONFIG_INET) += ipv4/
obj-y += ipv6/
obj-$(CONFIG_NETFILTER) += netfilter/
obj-$(CONFIG_RFKILL) += rfkill/
常驻 obj-y 含义
socket.o 系统调用与 sock_create 派发
core/ sock、skb、dev、rtnl、neighbour、XDP、GRO
ethernet/ eth_type_trans、以太头
sched/ tc qdisc/cls/act
ipv6/ 树内默认编入(细项仍受 Kconfig 控制)

3. 核心对象(跨子系统)

结构 头文件 职责
struct sock net/sock.h 协议无关套接字状态、缓冲队列
struct sk_buff linux/skbuff.h 网络包描述符(数据面主干)
struct net_device linux/netdevice.h 网络接口、统计、NAPI
struct net net/net_namespace.h 网络命名空间
struct dst_entry net/dst.h 路由缓存
struct neighbour net/neighbour.h ARP/ND 邻居

4. 配置入口

net/Kconfig 在顶层 Networking support (CONFIG_NET) 下 source 各子目录 Kconfig;CONFIG_INET 打开 TCP/IP;CONFIG_IPV6 控制 IPv6 特性子集。

5. 与 RK3588 的关系(摘要)

区域 RK 关联
net/rfkill/ CONFIG_RFKILL_RK:WiFi/BT 电源、SDIO 卡检测、MAC 从 vendor storage
net/wireless/Kconfig ROCKCHIP_THUNDER_BOOT 影响默认
数据面 stmmac/dwmacr8169 等在 drivers/net/ethernet/
其余 net/ 上游通用

详见 08-RK3588平台关联与使用场景详解.md

6. 文档体系说明

本仓库 linuxDoc/net/ 含两套互补文档:

  1. 编号 01–08(本系列):按 原理 + 实现 纵向剖面(core → L3 → filter → tc/BPF → L2/无线 → 驱动边界 → RK)。
  2. *rk3588-kernel-6.1-net-分析_zh.md:按 子目录横向 逐模块说明(70+ 篇)。

建议先读本文与 源码目录与模块索引.md,再按需打开子目录专文。

net 文档索引(RK3588 树)

net 文档索引(RK3588 树)

Linux 6.1(RK3588)内核 net/ 网络协议栈源码分析与原理说明。

源码路径:rk3588/kernel-6.1/net/(约 1887 文件)。

编号专题(原理 + 实现,推荐阅读顺序)

编号 文档 源码重点
总览 net网络子系统机制与原理详解.md 分层、Makefile、与 drivers 边界
索引 源码目录与模块索引.md 子目录文件量、RK 文件清单
01 net-core核心机制与实现详解.md sock、skb、dev、rtnl、GRO/XDP
09 NAPI收包轮询机制与实现详解.md NAPI 结构体、poll、schedule、软中断、驱动模板
10 netlink内核用户通信机制与实现详解.md Netlink socket、unicast/broadcast、dump、genetlink、rtnetlink
02 IPv4与传输层机制与实现详解.md TCP/UDP、FIB、ARP
03 IPv6与邻居路由机制与实现详解.md ND、fib6、addrconf
04 netfilter与包过滤机制与实现详解.md hooknf_hook_slow、conntrack、NAT、nftables、ipset
05 调度tc-BPF与XDP机制与实现详解.md sched、BPF、AF_XDP
06 二层桥接无线与socket族机制与实现详解.md bridge、cfg80211、rfkill
07 数据面路径与drivers分界机制与实现详解.md RX/TX 路径、GMAC/无线驱动
08 RK3588平台关联与使用场景详解.md RFKILL_RK、以太、调试
总览01 core02 ipv403 ipv604 netfilter05 tc/BPF/XDP06 L2/无线08 RK358807 数据面/驱动09 NAPI10 Netlink

速查:netfilter

需求 文档/入口
netfilter 总览 04-netfilter与包过滤机制与实现详解.md
nf_hook_slow net/netfilter/core.c
nft_do_chain net/netfilter/nf_tables_core.c
nf_conntrack_in net/netfilter/nf_conntrack_core.c
nfnetlink net/netfilter/nfnetlink.c
需求 文档/入口
Netlink 原理与 API 10-netlink内核用户通信机制与实现详解.md
struct netlink_sock net/netlink/af_netlink.h
netlink_sendmsg / netlink_rcv_skb net/netlink/af_netlink.c
rtnetlink net/core/rtnetlink.c
genetlink net/netlink/genetlink.c

速查:NAPI

需求 文档/入口
NAPI 原理与 API 09-NAPI收包轮询机制与实现详解.md
struct napi_struct include/linux/netdevice.h
net_rx_action net/core/dev.c
驱动 poll 模板 09 文档 §6

子目录横向专文(按模块)

文档 说明
rk3588-kernel-6.1-net目录分析_zh.md net/Makefile 与子目录职责、core/socket、IPv4/IPv6、netfilter、与 drivers/net 分界
rk3588-kernel-6.1-net-6lowpan分析_zh.md net/6lowpan/:IPHC/NHC/GHC、core/iphc/ndisc802.15.4/BTLECONFIG_6LOWPAN
rk3588-kernel-6.1-net-9p分析_zh.md net/9p/:9P 客户端、p9_client/PDU、trans_fd/virtio/Xen/RDMA、与 fs/9p 关系
rk3588-kernel-6.1-net-802分析_zh.md net/802/:802.2 p8022/SNAP、STP/GARP/MRP、fc/fddi/hippi
rk3588-kernel-6.1-net-8021q分析_zh.md net/8021q/:802.1Q/802.1AD VLAN、vlan_core 收包、vlan_dev/netlink、GVRP/MVRP、proc
rk3588-kernel-6.1-net-appletalk分析_zh.md net/appletalk/:DDP、AARP、PF_APPLETALK/SNAP、LocalTalk alloc_ltalkdevproc/sysctlCONFIG_ATALK 依赖 LLC
rk3588-kernel-6.1-net-atm分析_zh.md net/atm/PF_ATMPVC/SVCatm_dev/VCC、信令与 CLIP/br2684/PPPoATM/LANE/MPOA
rk3588-kernel-6.1-net-ax25分析_zh.md net/ax25/:业余无线电 AX.25PF_AX25ETH_P_AX25/KISS、路由与 IP over AX.25、可选 DAMA Slave
rk3588-kernel-6.1-net-batman-adv分析_zh.md net/batman-adv/:Mesh bat0 软接口、BATMAN IV/V、TT/tvlv、Genl/可选 BLA/DAT/NC/组播
rk3588-kernel-6.1-net-bluetooth分析_zh.md net/bluetooth/PF_BLUETOOTH、HCI/L2CAP/SMP/SCO/ISO、mgmt 控制信道、RFCOMM/BNEP/HIDP、可选 BT_6LOWPAN
rk3588-kernel-6.1-net-bpf分析_zh.md net/bpf/BPF_PROG_TEST_RUN 网络桩(skb/XDP/flow/sk_lookup 等)、trace、kfunc 自检;可选 bpf_dummy_struct_ops(JIT)
rk3588-kernel-6.1-net-bpfilter分析_zh.md net/bpfilter/:实验性 BPFILTER、嵌入 UMH blob、pipe mailbox;IPv4 sockopt 挂钩 BPFILTER_IPT_*net/ipv4/bpfilter
rk3588-kernel-6.1-net-bridge分析_zh.md net/bridge/:802.1 桥、FDB/STPbr_input/br_forward、VLAN/MST、组播侦听、switchdevebtables / br_netfilter
rk3588-kernel-6.1-net-caif分析_zh.md net/caif/:Modem CAIFcflayer/cfcnfgAF_CAIF、可选 GPRS netdev/chnl_netcaif_usb
rk3588-kernel-6.1-net-can分析_zh.md net/can/SocketCAN PF_CANRAW/BCM/GW/ISO-TP/J1939ETH_P_CAN/FD/XLdrivers/net/can
rk3588-kernel-6.1-net-core分析_zh.md net/core/sock/skb/dev、邻居、dstRtnetlinkBPF/filterXDP/GROflow_offload、命名空间
rk3588-kernel-6.1-net-dcb分析_zh.md net/dcb/Data Center BridgingRTM_GETDCB/SETDCBdcbnl_opsRTNLGRP_DCBdcbeventCONFIG_DCB 默认 n
rk3588-kernel-6.1-net-dccp分析_zh.md net/dccp/RFC 4340 DCCPdccp/dccp_ipv4/dccp_ipv6CCID-2/3TFRC)、INET_DCCP_DIAGsysctl net.dccp
rk3588-kernel-6.1-net-devlink分析_zh.md net/devlink/Generic Netlink devlinkleftover.c 单体实现)、Port/SB/Trap/Reload/RegionCONFIG_NET_DEVLINKdefault n,多驱动 select
rk3588-kernel-6.1-net-dns_resolver分析_zh.md net/dns_resolver/dns_resolver 密钥类型dns_query()request_key upcall、CONFIG_DNS_RESOLVERdnsresolver)、服务 CIFS/AFS/NFS/Ceph
rk3588-kernel-6.1-net-dsa分析_zh.md net/dsa/Distributed Switch Architecturemaster/slavedsa_coredsa/dsa2/port/switch)、tag_* 帧标记、switchdev/phylink/devlinkCONFIG_NET_DSA
rk3588-kernel-6.1-net-ethernet分析_zh.md net/ethernet/eth.cheader_opseth_type_trans/DSAether_setup/alloc_etherdev_mqsGRO ETH_P_TEBDT/nvmem MAC);驱动在 drivers/net/ethernet/
rk3588-kernel-6.1-net-ethtool分析_zh.md net/ethtool/ioctl(SIOCETHTOOLcommon.o 共用表与转换;CONFIG_ETHTOOL_NETLINKGenl "ethtool"netlink.o + link/feature/stats/module/PSE 等)
rk3588-kernel-6.1-net-hsr分析_zh.md net/hsr/IEC 62439 HSR/PRP、虚拟 kind=hsr + 双 slaverx_handler 转发/去重、rtnl/genlhsr-network)、CONFIG_HSRCONFIG_DEBUG_FShsr_debugfs
rk3588-kernel-6.1-net-ieee802154分析_zh.md net/ieee802154/LR-WPAN cfg802154/wpan_phyGenl "802.15.4 MAC" + "nl802154"IEEE802154_SOCKETheader_ops/sysfs;子目录 6lowpan/IEEE802154_6LOWPAN
rk3588-kernel-6.1-net-ife分析_zh.md net/ife/Inter-FE / ForCES InterFEskb 封装/解封装ife_encode/ife_decode)、TLV 元数据CONFIG_NET_IFEife),供 tc action ifeNET_ACT_IFE 使用
rk3588-kernel-6.1-net-ipv4分析_zh.md net/ipv4/CONFIG_INET 主体:AF_INETip_*/FIB/TCP/UDP/ICMP/ARP/IGMP、隧道/XFRM、sock_diagTCP CC 插件;netfilter/(iptables)、bpfilter/
rk3588-kernel-6.1-net-ipv6分析_zh.md net/ipv6/AF_INET6ND/addrconf/fib6、扩展头/分片、TCPv6/UDPv6SEG6/RPL/IOAM/ILA、隧道/XFRM、ipv6.oCONFIG_IPV6);目录 obj-y 亦含 addrconf_core 等底座
rk3588-kernel-6.1-net-iucv分析_zh.md net/iucv/IBM Z z/VM IUCV + AF_IUCVCONFIG_IUCV/CONFIG_AFIUCVdepends on S390);RK3588/ARM 不适用
rk3588-kernel-6.1-net-kcm分析_zh.md net/kcm/Kernel Connection Multiplexorstrparser + 可选 BPF SOCKET_FILTERkcm_mux/kcm_sock/psockCONFIG_AF_KCMselect BPF_SYSCALL/STREAM_PARSER)、/proc/net/kcm*
rk3588-kernel-6.1-net-key分析_zh.md net/key/PF_KEYv2 / SADBaf_key.c)、与 xfrm 交互;CONFIG_NET_KEYnet/xfrm/Kconfig select XFRM_ALGO);可选 NET_KEY_MIGRATE
rk3588-kernel-6.1-net-l2tp分析_zh.md net/l2tp/RFC 2661/3931l2tp_core(隧道/会话/UDP);PPPOL2TPdrivers/net/ppp);v3Genl "l2tp"L2TP_IP/l2tp_ethdebugfs
rk3588-kernel-6.1-net-ceph分析_zh.md net/ceph/CONFIG_CEPH_LIB libceph(Messenger v1/v2、MON/OSD、CRUSH、auth/crypto);供 CephFS/RBD 复用
rk3588-kernel-6.1-net-l3mdev分析_zh.md net/l3mdev/L3 master API(VRF/overlayskb 归属、ipv4/ipv6 FIB 协同)
rk3588-kernel-6.1-net-lapb分析_zh.md net/lapb/LAPB 链路层(CONFIG_LAPB);常与 net/x25 / WAN hdlc 协作
rk3588-kernel-6.1-net-llc分析_zh.md net/llc/IEEE 802.2 LLCCONFIG_LLC);可选 CONFIG_LLC2 Type 2 + AF_LLC
rk3588-kernel-6.1-net-mac80211分析_zh.md net/mac80211/SoftMAC 802.11(MLME、加密、HT/VHT/HE、mesh、ieee80211_ops);与 cfg80211、无线驱动协作
rk3588-kernel-6.1-net-mac802154分析_zh.md net/mac802154/802.15.4 MACCONFIG_MAC802154cfg802154/LLSEC);PHY 在 drivers/net/ieee802154
rk3588-kernel-6.1-net-mctp分析_zh.md net/mctp/AF_MCTPDSP0236),路由/邻居 CONFIG_MCTP
rk3588-kernel-6.1-net-mpls分析_zh.md net/mpls/mpls_gso / mpls_routeraf_mpls)/mpls_iptunnelCONFIG_MPLS_*
rk3588-kernel-6.1-net-mptcp分析_zh.md net/mptcp/Multipath TCPCONFIG_MPTCPprotocol/subflow/token/crypto、pm_netlinkBPF/diag
rk3588-kernel-6.1-net-ncsi分析_zh.md net/ncsi/NCSI sideband(CONFIG_NET_NCSI),命令/AEN/netlink;供 BMC 管理 NIC
rk3588-kernel-6.1-net-netfilter分析_zh.md net/netfilter/Netfilter 核心(hook、nf_conntracknftablesxt_*nf_flow_tableipset/ipvs/
rk3588-kernel-6.1-net-netlabel分析_zh.md net/netlabel/NetLabelCIPSO/Calipso、域哈希);对接 LSM(SELinux/Smack)
rk3588-kernel-6.1-net-netlink分析_zh.md net/netlink/AF_NETLINKgenetlinkpolicy);CONFIG_NETLINK_DIAG
rk3588-kernel-6.1-net-netrom分析_zh.md net/netrom/NET/ROMCONFIG_NETROMAF_NETROM);常与 AX.25 联用
rk3588-kernel-6.1-net-nfc分析_zh.md net/nfc/NFCCONFIG_NFCAF_NFC/LLCP);子目录 nci/hci/nfc_digital
rk3588-kernel-6.1-net-nsh分析_zh.md net/nsh/NSHCONFIG_NET_NSH,SFC 封装),与 OVS/tc 协同
rk3588-kernel-6.1-net-openvswitch分析_zh.md net/openvswitch/Open vSwitch datapathCONFIG_OPENVSWITCH,flow/meter/actions,VXLAN/GENEVE/GRE vport
rk3588-kernel-6.1-net-packet分析_zh.md net/packet/PF_PACKETCONFIG_PACKETmmap/fanout);PACKET_DIAG
rk3588-kernel-6.1-net-phonet分析_zh.md net/phonet/PhonetCONFIG_PHONETAF_PHONET/PEP);旧 Nokia modem IPC
rk3588-kernel-6.1-net-psample分析_zh.md net/psample/PSAMPLE GenlCONFIG_PSAMPLE);tc sample/OVS/交换采样
rk3588-kernel-6.1-net-qrtr分析_zh.md net/qrtr/QRTRQualcomm IPC RouterCONFIG_QRTR),SMD/TUN/MHI 传输
rk3588-kernel-6.1-net-rds分析_zh.md net/rds/RDSCONFIG_RDSAF_RDS);可选 RDMA/TCP 传输
rk3588-kernel-6.1-net-rfkill分析_zh.md net/rfkill/:射频开关子系统(CONFIG_RFKILL);Rockchip CONFIG_RFKILL_RK
rk3588-kernel-6.1-net-rose分析_zh.md net/rose/ROSE / X.25 PLPCONFIG_ROSE);分组无线电
rk3588-kernel-6.1-net-rxrpc分析_zh.md net/rxrpc/RxRPCCONFIG_AF_RXRPC);AFS、UDP 承载、可选 Rxkad
rk3588-kernel-6.1-net-sched分析_zh.md net/sched/Traffic Controlqdisc/cls/act/ematchtc netlink)
rk3588-kernel-6.1-net-sctp分析_zh.md net/sctp/SCTPCONFIG_IP_SCTP),状态机/流/auth/offload;INET_SCTP_DIAG
rk3588-kernel-6.1-net-smc分析_zh.md net/smc/SMC-RCONFIG_SMCAF_SMC,RDMA CDC/LLC
rk3588-kernel-6.1-net-strparser分析_zh.md net/strparser/STREAM_PARSERCONFIG_STREAM_PARSER);供 KCM 等重组 TCP 记录边界
rk3588-kernel-6.1-net-sunrpc分析_zh.md net/sunrpc/ONC RPC / SUNRPCCONFIG_SUNRPC);auth_gss/xprtrdma/NFS 基础
rk3588-kernel-6.1-net-switchdev分析_zh.md net/switchdev/switchdev APIswitchdev.oCONFIG_NET_SWITCHDEV);硬件交换卸载通知
rk3588-kernel-6.1-net-tipc分析_zh.md net/tipc/TIPCCONFIG_TIPC),集群 IPC;Ethernet/UDP/IB bearer
rk3588-kernel-6.1-net-tls分析_zh.md net/tls/kTLSCONFIG_TLStls_sw/device/TOE,openssl/nginx ULP)
rk3588-kernel-6.1-net-unix分析_zh.md net/unix/UNIX 域套接字CONFIG_UNIXAF_UNIX/SCM_*);unix_diag
rk3588-kernel-6.1-net-vmw_vsock分析_zh.md net/vmw_vsock/AF_VSOCKVirtio/VMCI/Hyper-V/loopbackCONFIG_VSOCKETS
rk3588-kernel-6.1-net-wireless分析_zh.md net/wireless/cfg80211CONFIG_CFG80211nl80211/regdb)、lib80211WEXT
rk3588-kernel-6.1-net-x25分析_zh.md net/x25/X.25CONFIG_X25AF_X25);常配合 LAPB
rk3588-kernel-6.1-net-xdp分析_zh.md net/xdp/AF_XDP / XSKCONFIG_XDP_SOCKETSxsk/umem/map/buff pool)
rk3588-kernel-6.1-net-xfrm分析_zh.md net/xfrm/XFRM / IPsec 框架(policy/state、xfrm_userCONFIG_XFRM_*

以太网 MAC/PHY 设备驱动drivers/net/(如 drivers/net/ethernet/stmicro/drivers/net/phy/ 及厂商扩展);net/ 主要负责协议栈与 struct net_device/sk_buff 框架逻辑。

net 源码目录与模块索引

net 源码目录与模块索引

源码根:rk3588/kernel-6.1/net/(约 1887 文件,70+ 顶层子目录)

1. 按文件量排序(Top 25)

文件数 目录 职责
253 netfilter/ iptables/nft、conntrack、NAT、ipset、ipvs
135 ipv4/ TCP/UDP/ICMP、FIB、ARP、IPv4 netfilter
107 ipv6/ ND、addrconf、fib6、扩展头
81 mac80211/ 802.11 软 MAC
80 sched/ tc qdisc、分类器、action
66 sunrpc/ NFS ONC RPC
66 bridge/ Linux bridge、STP、ebtables 挂钩
66 bluetooth/ HCI/L2CAP/BNEP 等
57 core/ sock、skb、dev、rtnl、XDP、GRO
55 batman-adv/ Mesh 路由
47 tipc/ 集群 IPC
42 wireless/ cfg80211、nl80211
41 rds/ Reliable Datagram Sockets
36 smc/ SMC-R
35 nfc/ Near Field Communication
34 sctp/ SCTP
34 dccp/ DCCP
34 ceph/ libceph 网络层
32 rxrpc/ AFS RxRPC
30 ethtool/ ethtool ioctl/netlink
29 atm/ ATM
28 dsa/ Distributed Switch Architecture
27 openvswitch/ OVS 内核 datapath
25 ieee802154/ 802.15.4
22 6lowpan/ IPv6 over 802.15.4

2. 根目录关键文件

文件 作用
Makefile 子目录 obj-y / obj-$(CONFIG_*)
Kconfig CONFIG_NET 及 Networking options
socket.c sys_socketsock_sendmsg
devres.c 网络设备 devm 资源
compat.c 32 位 compat socket
sysctl_net.c /proc/sys/net 聚合

3. core/ 对象清单(Makefile)

对象 功能
sock.o, skbuff.o 套接字与 skb
dev.o net_device 注册、收发
neighbour.o 邻居子系统
rtnetlink.o RTNETLINK 配置
dst.o 路由缓存
xdp.o, gro.o XDP、GRO
flow_offload.o 硬件流卸载
sock_map.o BPF sockmap(CONFIG_BPF_SYSCALL)

4. Rockchip 相关(net/ 内)

路径 说明
rfkill/rfkill-wlan.c WiFi 电源、OOB IRQ、MAC、GRF
rfkill/rfkill-bt.c 蓝牙射频控制
rfkill/Kconfig CONFIG_RFKILL_RK
wireless/Kconfig Thunder Boot 相关 default

5. 与 drivers/net 分界

层次 路径 内容
协议 / 框架 net/ 协议状态机、hook、套接字
设备驱动 drivers/net/ethernet/ MAC 驱动(RK: stmmac、r8169…)
PHY drivers/net/phy/ MDIO PHY
无线芯片 drivers/net/wireless/ iwlwifi、brcmfmac、bcmdhd…

数据路径:tcp_sendmsg → IP 层 → dev_queue_xmit → 驱动 ndo_start_xmit

6. 子目录 → 既有专文(linuxDoc/net)

每个子目录大多已有 rk3588-kernel-6.1-net-<name>分析_zh.md,见 README.md 完整表。

7. 快速定位

问题 入口
包从网卡进内核 驱动 NAPI → netif_receive_skbeth_type_trans
TCP 连接 net/ipv4/tcp_*.c
路由/FIB net/ipv4/fib_*.cnet/ipv6/ip6_fib.c
iptables net/netfilter/net/ipv4/netfilter/
tc 限速 net/sched/
WiFi 配置 net/wireless/ + iw/nl80211
RK WiFi 上电 net/rfkill/rfkill-wlan.c

ALSA Core 与 PCM 设备机制与实现详解

ALSA Core 与 PCM 设备机制与实现详解

源码路径rk3588/kernel-6.1/sound/core/
文档目录linuxDoc/sound/


目录


一、原理

ALSA(Advanced Linux Sound Architecture) 在内核提供:

  • 统一 主设备号(通常 116)+ 次设备号 区分 control/pcm/timer
  • PCM 抽象:playback/capture、周期、格式、速率
  • Control:音量、开关、路由(mixer 元素)

ASoC 声卡最终也注册为 ALSA struct snd_card,对用户态 API 一致


二、字符设备复用 sound.c

core/sound.c(含中文综述注释):

  1. 用户 open("/dev/snd/pcmC0D0p")snd_open
  2. minorsnd_minors[]
  3. replace_fops 为真实驱动(pcm/control)
  4. 调用具体 ->open

驱动通过 snd_register_device() 登记,关联 struct device 与 sysfs。


三、声卡与 PCM

文件 作用
sound.c minor 复用、模块加载 snd-card-N
pcm.c PCM 设备创建、runtime、hw_params
pcm_native.c ioctl 路径(用户态接口)
control.c kcontrol
init.c 子系统初始化

关键结构

  • struct snd_card:逻辑声卡(索引 0、1…)
  • struct snd_pcm:逻辑 PCM 设备(device 号)
  • struct snd_pcm_substream:播放或采集流
  • struct snd_pcm_runtime:buffer、period、状态机

硬件参数在 hw_paramssw_params 中协商(格式 S16_LE、采样率、通道)。


四、控制与 proc

  • /dev/snd/controlC0:mixer 与控制项
  • /proc/asound/cardspcmC0D0p:调试信息

五、RK3588

嵌入式通常 card0 为 ASoC 注册声卡;HDMI 与 ES8388 可能为 同一 card 多 PCM多 card,由 DT 与 machine 驱动决定。

用户态:aplay -lamixer contents


附录

工具 对应内核
aplay PCM playback
amixer control API

下一篇02 ASoC

ASoC 框架与 DAPM 机制与实现详解

ASoC 框架与 DAPM 机制与实现详解

源码路径rk3588/kernel-6.1/sound/soc/soc-*.c
文档目录linuxDoc/sound/


目录


一、原理

ASoC(ALSA System on Chip) 将声卡拆为三类驱动:

类型 角色 RK 示例
CPU DAI SoC 侧数字音频接口 rockchip_i2s_tdm
Codec DAI 外置/总线 Codec es8388hdmi-codec
Machine 描述 dai_link、GPIO、DAPM 路由 rockchip_multicodecs

避免把板级细节写进每个 DAI 驱动,便于 IP 复用。


二、核心对象

snd_soc_cardsnd_soc_dai_linkcpu_dai componentcodec component
  • snd_soc_component:绑定 platform_devicei2c_client,含 DAI 与 DAPM
  • snd_soc_dai:数字音频接口实例(playbackcapture 能力)
  • snd_soc_pcm_runtime:一条 link 的运行时(rtd)

注册入口:devm_snd_soc_register_card() / snd_soc_register_card()


三、核心文件

文件 职责
soc-core.c 组件列表、绑定/解绑、PM、pmdown_time
soc-dai.c snd_soc_dai_ops:startup/shutdown/set_fmt
soc-pcm.c PCM 操作桥接到 ALSA Core
soc-link.c link 管理
soc-card.c card 实例化
soc-component.c component 驱动模型
soc-ops.c 通用 ops 辅助

设备树:常用 of_graph 解析 sound-dai 端点;也支持 snd_soc_of_parse_card_name


四、DAPM

soc-dapm.c — Dynamic Audio Power Management:

概念 说明
widget 输入/输出/混音/供应/时钟等节点
route widget 连接关系
event stream 开始/结束时上电顺序

作用:降低空闲功耗、减轻 pop 声pmdown_time 默认 5000ms 延迟下电)。

Machine/codec 驱动通过 snd_soc_dapm_route 数组定义耳机、扬声器等路径。


五、DMA PCM

soc-generic-dmaengine-pcm.c

  • 使用 dmaengine API 在内存与 I2S FIFO 间传输
  • dma_chanperiod_bytesbuffer_bytes 由 DT 或驱动指定

Rockchip I2S/TDM、PDM、SPDIF 驱动通常调用 devm_snd_dmaengine_pcm_register() 注册通用 DMAengine PCM;DAI 提供 FIFO 地址、bus width、maxburst 等 DMA data。


附录

头文件 内容
sound/soc.h 公共 API
sound/soc-dapm.h DAPM 宏

相关03 RK DAI

Rockchip DAI 控制器机制与实现详解

Rockchip DAI 控制器机制与实现详解

源码路径rk3588/kernel-6.1/sound/soc/rockchip/
文档目录linuxDoc/sound/


目录


一、原理

本源码树为 Rockchip 多代 SoC 提供 I2S/TDMPDMSAISPDIF 等驱动;其中 RK3588 DTS/匹配表明确使用 I2S/TDM、PDM、SPDIF、SPDIFRX(以后者的 rk3308-spdifrx fallback 匹配)。rockchip_sai.c 只有通用 rockchip,sai-v1 匹配,不能仅凭源码存在认定 RK3588 集成或启用 SAI。驱动作为 ASoC CPU DAI component

  • 解析 设备树(clocks、dma-names、TDM slot)
  • 实现 snd_soc_dai_opshw_paramsset_fmttrigger
  • 通过 DMAengine 与 PCM 环缓冲交互

compatible 区分 SoC 代际(如 rockchip,rk3588-i2s-tdm)。


二、I2S/TDM

rockchip_i2s_tdm.c / rockchip_i2s_tdm.h(主路径,~2700+ 行):

能力 说明
TDM slot 多声道时分复用(8ch 等)
TXCR/RXCR 数据格式、时钟边沿、PCM/TDM 模式
多 lane CONFIG_SND_SOC_ROCKCHIP_I2S_TDM_MULTI_LANES
TRCM 时隙路由(rockchip_trcm.c

连接外置 Codec(I2C 控制)或 HDMI IP 的 I2S 输入。

旧版 rockchip_i2s.c:早期 RK 芯片,3588 以 TDM 为主。


三、PDM 与 SAI

驱动 用途
rockchip_pdm.c PDM 数字麦(rk3588-pdm
rockchip_pdm_v2.c PDM 第二代 IP;本分支匹配 RK3506/RK3576/RV1126B,不匹配 RK3588
rockchip_sai.c Serial Audio Interface

适用于 麦克风阵列、语音前端;常与 VADDLP 配合。


四、SPDIF

  • rockchip_spdif.c:S/PDIF 输出(rk3588-spdif
  • rockchip_spdifrx.c:S/PDIF 输入

用于光纤/同轴数字音频,消费类 RK 板较少。


五、公共与工具

文件 作用
rockchip_utils.c 时钟、复位、常用配置
rockchip_utils.h 共享声明
rockchip_dummy_dai.c 占位 DAI

时钟:依赖 HAVE_CLK,从 CRU/CCU 获取 MCLK/BCLK/LRCK


附录

Kconfig 模块
SND_SOC_ROCKCHIP_I2S_TDM i2s-tdm
SND_SOC_ROCKCHIP_PDM pdm
SND_SOC_ROCKCHIP_SAI sai

下一篇04 Machine/HDMI

Rockchip 机器驱动与 HDMI 机制与实现详解

Rockchip 机器驱动与 HDMI 机制与实现详解

源码路径rk3588/kernel-6.1/sound/soc/rockchip/(machine)、soc/codecs/rk_codec_digital.c
文档目录linuxDoc/sound/


目录


一、Machine 驱动角色

Machine(平台驱动)填充 struct snd_soc_card

  • dai_link[]:CPU DAI ↔ Codec DAI 连接、格式 DAIFMT
  • dapm_routes:耳机/喇叭/麦克风路径
  • GPIO:功放使能、耳机检测
  • 可选:jackextconADC 按键

RK 板级常由 设备树 sound 节点 + 驱动 probe 解析子节点完成。


二、multicodecs

rockchip_multicodecs.cDRV_NAME "rk-multicodecs"):

特性 说明
多 Codec dai_link[3],支持多路 I2C Codec
耳机检测 GPIO / ADC 电压检测 / codec_hp_det
extcon 与 Type-C 音频切换协同
jack snd_soc_jack 上报 headset

适用于 RK3308 等 多 Codec 音箱方案;RK3588 产品可复用或参考 DT 写法。


三、HDMI 音频

rockchip_hdmi.crk-hdmi-sound):

  • 链接 CPU I2Shdmi-codecSND_SOC_HDMI_CODEC
  • DRM HDMI 驱动配合,音频随显示输出
  • 可选 HDMI jack 检测热插拔

本树 RK3588 活跃路径是 rockchip_hdmi.c + soc/codecs/hdmi-codec.c + DRM codec callbacksrockchip_hdmi_dp.crockchip_cdndp.c 虽保留在源码目录中,但没有加入 sound/soc/rockchip/Makefile,属于不可直接使用的遗留文件。

RK3588 常见板级映射:

  • HDMI0/1:I2S5/I2S6,常用 mclk-fs = <128>
  • DP0/1:SPDIF TX2/TX5,常用 mclk-fs = <512>
  • HDMI-IN:HDMI RX → I2S7 capture。

编解码盒 HDMI 输出带音频 时,用户态播放到 card 的 HDMI PCM 即可。


四、VAD ASRC DLP

模块 文件 作用
VAD rockchip_vad.c 硬件语音活动检测;RK3588 映射 I2S1_8CH、PDM0 地址
ASRC rockchip_asrc.c 异步采样率转换;本分支只匹配 RK3506/RK3576,不能直接归入 RK3588
DLP rockchip_dlp.c 数字环回:Mic/Loopback 多通道模式
multi_dais rockchip_multi_dais.c 聚合多 DAI 为单一 PCM

VAD 含 ARM64 预处理汇编vad_preprocess_arm64.S)。


五、片上数字 Codec

soc/codecs/rk_codec_digital.c

  • rockchip,rk3588-codec-digital
  • 通过 GRF 寄存器(如 RK3588_GRF_SOC_CON6)做 SOC 侧数字音频开关配置
  • 完整模拟 Codec,常与 HDMI/内置路径配合

附录

平台驱动 典型芯片
rockchip_rt5645.c RK3399 等
rk3399_gru_sound.c Chromebook GRU

RK3588 新品以 DT + i2s_tdm + hdmi/multicodecs 为主,不局限上述遗留模块。

相关06 RK3588 拓扑

Codec 与其它音频路径机制与实现详解

Codec 与其它音频路径机制与实现详解

源码路径rk3588/kernel-6.1/sound/soc/codecs/sound/usb/sound/hda/
文档目录linuxDoc/sound/


目录


一、Codec 层

sound/soc/codecs/ 实现 hundreds of Codec/I2C 设备 的 ASoC 驱动:

类型 示例
I2C 音频 Codec ES8316、ES8388、RT5640、WM8960
HDMI/Display hdmi-codec.c
功放 simple-amplifier.c
DMIC spdif_transceiverdmic

每个驱动提供 snd_soc_component_driver + snd_soc_dai_driver,与 CPU DAI 格式协商set_fmt、时钟主从)。


二、RK 相关 Codec

文件 说明
rk_codec_digital.c RK3588 片上数字 路径 GRF 配置
Machine 中选型 rockchip_rt5645da7219max98090板级 绑定外置芯片

实际 RK3588 板卡常见:ES8388 / ES8311 等(具体以 BSP DTS 为准,可能在 codecs 目录有对应 .c)。


三、USB 音频

sound/usb/(~100+ 文件):

  • USB Audio Class 1/2
  • card.cpcm.cmixer.c 标准 UAC 流程
  • 大量 quirksquirks.c)修正厂商设备

RK3588 作 USB Host 时可接 USB 声卡;OTG 声卡模式 另涉 gadget 栈(不在 sound/usb 主机路径)。


四、HDA 与其它

目录 RK3588
hda/ 一般不启用(x86 笔记本)
pci/ 无关
virtio/ 虚拟机场景
soc/sof/ Intel/AMD 专用 DSP 框架

五、RK3588

  • 产品音频 主力:内置 I2S + 外置 Codec + HDMI
  • USB 麦克风/声卡:走 usb-audio 模块,与 ASoC 并存第二套 card
  • 编解码器 VPU 处理视频轨音频常 不重采样经 ALSA(容器内 FFmpeg),但 HDMI 输出 仍可能用本栈

附录

调试外置 Codec:i2cdetect、检查 sound-dai graph、dmesg | grep asoc

相关03 DAI