# sr6110-kernel-abi **Repository Path**: webxx/sr6110-kernel-abi ## Basic Information - **Project Name**: sr6110-kernel-abi - **Description**: sr6110 kernel abi - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-25 - **Last Updated**: 2026-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SR6110 内核 ABI 对齐层 ZTE SR6110(ZX279133,厂家内核 5.4.196)**改动过多个核心结构的布局**, 原版内核编译出的模块直接加载会 panic。 本项目把这些差异固化成一份补丁,作用在干净的 `linux-5.4.196` 头文件上, 使编译出的模块与**厂家内核 ABI 兼容**——从而可以使用未经修改的上游模块 (如 `wireguard-linux-compat`)。 > **它不是厂家内核的源码**(那拿不到),而是"按需复刻"的 ABI 对齐层: > 只对齐已经被验证过的字段,其余字段保持原样。 ## 已对齐的结构 | 结构 | 关键偏移 | 验证方式 | |---|---|---| | `net_device` | `netdev_ops` 504、`flags` 544、`mtu` 572、`type` 576、`pcpu_refcnt` 1192、**sizeof 2176** | `ip link` / `wg show` 正常 | | `sk_buff` | `sk` 32、`destructor` 152、`len` 168、`csum_start` 200、`csum_offset` 202、`transport_header` 250、`network_header` 252、`tail` 284、`head` 296、`data` 304、`truesize` 312 | 握手包解析 + TCP 转发校验和 | | `struct sock` | `sk_socket` 704、`sk_user_data` 712 | `ip link del` / `rmmod` 不再崩 | `udp_port_cfg`、`udp_tunnel_sock_cfg` 经反汇编确认与主线一致,**无需修改**。 ## 用法 ```bash # 1. 准备内核源码 curl -LO https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.196.tar.xz tar xf linux-5.4.196.tar.xz # 2. 应用补丁 ./scripts/apply.sh /path/to/linux-5.4.196 # 3. 放入厂家 config(从设备 /etc/autokernelconf 取出,@ 换成 #) sed 's/^@/#/' autokernelconf > .config make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_prepare -j8 # 4. 编译模块 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ M=/path/to/module KBUILD_MODPOST_WARN=1 modules ``` `KBUILD_MODPOST_WARN=1` 是必需的:本地没有完整内核的 `Module.symvers`, 但厂家内核导出这些符号,insmod 时能解析。 ## 本项目的局限 1. **不是完整复刻**:只对齐了 WireGuard 用到的字段 2. **不是所有模块都能用**:厂家内核还没编译的功能(`CONFIG_CFG80211`、 `CONFIG_BPF_SYSCALL`、`CONFIG_KPROBES`、`CONFIG_NF_TABLES` 等)无法弥补 3. **`max_mtu` 字段不存在**:用到它的模块需要打源码补丁 ## 如何为新模块补充对齐 方法详见 [docs/METHOD.md](docs/METHOD.md): 1. `/proc/kallsyms` 取函数地址 2. `/proc/kcore` 按偏移读机器码(设备上无 `dd`,用 `tools/kread.c`) 3. `objdump` 反汇编,提取字段偏移 4. 用"纯常量模块"打印本地 `offsetof()` 对比 5. 补 padding,重编验证 ## 目录 ``` patches/ 三个头文件的 diff + 合并版 scripts/apply.sh 一键应用 tools/kread.c /proc/kcore 读取器(静态 aarch64) docs/METHOD.md 逆向方法 docs/OFFSETS.md 已验证的偏移表 ``` ## 已验证的消费方 | 模块 | 结果 | |---|---| | `hello.ko` | ✅ | | `netdiag.ko`(只读 net_device)| ✅ 字段全部正确 | | `wireguard-linux-compat 1.0.20220627` | ✅ **握手成功、PC ping 通** |