证据锚索引
此页面上的所有地址适用于
libtpu.so构建 ID89edbbe81c5b328a958fe628a9f2207d,来自libtpu-0.0.40-cp314轮。二进制文件并未被剥离:这里的每个0x…都解析为 IDA 函数表中的分解 C++ 符号,并且.text/.rodata/.lrodata/.data.rel.ro映射 VMA == 文件偏移量。其他版本会有所不同。
摘要
这是 wiki 的 反向查找索引:一个平面的、按地址排序的二进制锚点表,在深层页面中重复出现,每个锚点都映射回解释它的页面。它存在于一个工作流程中——您在 IDA 中,您的光标落在 0x1c89fba0 上,并且您想要记录它的散文。扫描主表,找到该行,然后点击链接。它是 subsystem-map(进入子系统→地址带)和 front/codename-cheatsheet(进入代号→事实)的逆:两者都收集锚点转发;此页面是将它们连接在一起的平面地址→页面书脊。
该索引故意不详尽。该二进制文件有 884,832 个函数;这个页面只包含大约 60 个真正的横切锚点——入口点、工厂函数、成本表、目标访问器和数据部分,这些内容在三页或更多页上引用,读者实际上很可能会感到冷淡。单页局部变量(数千个 _GLOBAL__N_ 帮助程序、每个操作码处理程序、ICF 重复项)记录在其所属页面上,此处不再重复。选择偏差是针对重新实现者需要识别以在二进制文件中定位的地址。
每行在被接纳之前都经过双向验证:(a) 地址解析为 IDA 函数表 (…_function_addresses.json) 中的命名符号,或者对于数据锚点,解析为所属页面引脚的部分/符号; (b) 指定的所属页面存在并且实际引用了该地址。如果流通中的标签无法通过检查,则 > **CORRECTION —** 标注会记录它,而不是静默修复。置信度反映的是绑定(地址↔页面),而不是基础 RE 声明,所属页面自行对其进行评分。
为了重新实现,该页面服务的合约是:
- 方向 — 给定原始 VA,恢复符号、其角色以及记录其背后算法的页面。
- 出处 — 每个绑定都可以独立重新检查:符号位于函数表中,引用位于命名的
src/页面中。 - 范围诚实 - 索引涵盖横切脊柱,而不是长尾;它告诉您它不索引什么。
| 索引锚 | ~58 个交叉地址(总共 884,832 个函数) |
| 主表排序键 | 升序 VA |
| 符号来源 | …_function_addresses.json(函数) · ELF 节/符号记录(数据) |
.text 跨度 | 0xe63c000 – 0x21217484 (~360 MB) |
| 单频段 | .lbss 来自 0x227ba840 |
| 兄弟指数 | subsystem-map(频段→子系统)·codename-cheatsheet(代号→事实)·cross-reference-graph(页面→页面) |
主锚索引
每个横切锚一行,按 VA 升序排序。 它是什么是一个单线角色; 所属页面链接记录算法或布局的页面; 置信度 对地址 ↔ 页面装订进行评分。子系统分组的详细信息如下所示。
| VA | 符号 | 它是什么 | 所属页面 |
|---|---|---|---|
0x1c60480 | xprof::kDeviceTypeInfo | DeviceTypeInfo[17] .lrodata 表 | 分析/kdevicetypeinfo-生产者-读者 |
0x3366d90 | TPUMCCodeEmitter::…::InstBits | 每个操作码 TensorCore 编码位 | isa/instbits-master-db · isa/记录格式 |
0x84a0000 | .rodata 名称池 | 合并的 NUL 终止字符串池(基本) | 附录/filewrapper-toc-catalog |
0xb438aec | resLUT(VF成本LUT) | Viperfish资源循环查找表 | 成本/vf 周期表 · 每个张量核心的成本/iars |
0xbe8af30 | protodesc_cold(节) | 序列化 FileDescriptorProto blob 池 | 附录/protodesc-cold-catalog |
0xe635524 | .init_proc | 精灵DT_INIT;运行静态构造函数风暴 | 生命周期/elf-entry-and-init-proc · 取证/静态初始化 |
0xe63c000 | __do_init | 构造函数驱动; .text的底座 | 生命周期/elf-entry-and-init-proc |
0xe6a83a0 | GetPjrtApi | 导出的 PJRT 条目 thunk | 生命周期/get-pjrt-api-thunk · pjrt/概述 |
0xe6a9d00 | pjrt::tpu_plugin::PJRT_Plugin_Initialize | PJRT_Api 的一次性插件初始化插槽 | 生命周期/tftpu-initialize-bootstrap · 生命周期/模块初始化插件发现 |
0xe6aa440 | pjrt::tpu_plugin::GetTpuPjrtApi | 惰性 PJRT_Api 构建器 + 单例缓存 | 生命周期/get-pjrt-api-thunk · pjrt/概述 |
0xe6f54a0 | TfTpu_Initialize | C-shim 运行时引导程序 | 生命周期/tftpu-initialize-bootstrap |
0xeaafba0 | TpuExecutable_LoadProgramAndEnqueueToStream | 导出的 C-shim 运行时执行条目 | 运行时/加载程序入队 · 垫片/tpu-可执行名册 |
0xf5a2900 | xprof::tpu::GetTraceCodec | Per-DeviceType 跟踪编解码器工厂 | 分析/跟踪 xevent 条目 · 分析/概述 |
0xf6993a0 | xprof::tpu::DeviceTypeFromDeviceIdentifiers | 设备标识符 → 设备类型调度程序 | 取证/每代功能调度程序 · 目标/pci-device-ids |
0xf795300 | jellyfish::AutoOr<bool>::FromProtoOrDie | AutoProto → AutoOr 标志物化器 | 配置/注册表介导的标志 · 配置/autoproto-autoor-resolution |
0xf849ec0 | xla::TpuCompiler::RegisterAllPhases | HLO通行管道注册根 | 运行时/内部通行名 · 编译器/概述 |
0xf874160 | pjrt::CreatePjrtApi | 填充 140 个 PJRT_Api 插槽 + 延长链 | pjrt/api-vtable-reconstruction · pjrt/概述 |
0x1096fac0 | jellyfish::(anon)::RunHloScheduler | LHS背后的调度程序驱动程序 | sched/lhs-ilp-变体 · 配置/注册表介导的标志 |
0x109c6fa0 | TensorCoreBarrierAssignment::DetermineBarrierConfigForKey | TensorCore 屏障配置求解器 | 屏障/张量核屏障 · 屏障/推断屏障配置 |
0x12fc3080 | jellyfish::RunMemorySpaceAssignment | HBM/VMEM内存空间分配驱动程序 | 编译器/msa-概述 · 编译器/编译阶段 |
0x130abfc0 | jellyfish::CostModel::GetCollectiveCycles | 集体操作周期估计器 | 成本/tpu-hlo-成本分析 · 集体/spmd-link-count-cost |
0x133c2dc0 | ConstructConfigForCollectiveUniDirNDGroups | UniDir-ND 集体配置生成器 | 集体/张量分割平面 |
0x13426260 | jellyfish::DeepseaExecutable::LoadProgramAndEnqueueToStream | 运行时程序加载+流入队 | 运行时/加载程序入队 · 运行时/概述 |
0x136321a0 | xla::LatencyHidingScheduler::RunImpl | LHS核心调度循环 | sched/lhs-布局后 · 前端/编译流程演练 |
0x137d3de0 | TwistedTorusND::GetPhase1ReplicaGroups | 第一阶段副本组几何 | 路由/路由表生成 |
0x13a33320 | sparse_core::isa_emitter::GetVectorMask | SparseCore 矢量掩码 MCOperand 发出 | 稀疏核心/扫描数据路径 |
0x1c6a75c0 | jellyfish::net_util::BarrierCoresTree | Tree-barrier核心枚举 | 屏障/树屏障垂直同步 · 屏障/复制屏障 |
0x1c89adc0 | jellyfish::ResourceVector::Acc | 资源向量累加原语 | 成本/减少窗口池成本 · 成本/卷积成本状态 |
0x1c89ce20 | jellyfish::CycleTable::GetResource | 每指令资源查找 | 成本/资源枚举 · 成本/tpu-hlo-成本分析 |
0x1c89f820 | jellyfish::LatencyTable::LatencyBetween | 边缘延迟访问器(调度器) | sched/mrb 链分配器 · 成本/捆绑感知成本 |
0x1c89fba0 | jellyfish::LatencyTable::Create | 每个版本延迟表工厂 | 成本/概述 |
0x1c8a0d60 | jellyfish::LatencyTableJellyfish::LatencyBetweenInternal | JF 延迟边缘实现 | isa/slot-eup-超越 · 成本/捆绑感知成本 |
0x1c8ae5c0 | viperfish::MxuLatencyTable::GetResourceUsage | MXU 每指令资源使用情况 | 每个张量核心的成本/iars · 成本/vf 周期表 |
0x1d0b33e0 | tpu::System::Execute | 顶级异步程序执行 | 运行时/加载程序入队 · 运行时/概述 |
0x1d522f40 | jellyfish::LloRegionBuilder::VsyncAddRemote | 远程 vsync sflag 发射器 | 屏障/远程标志编码器 · 屏障/树屏障垂直同步 |
0x1d60f400 | jellyfish::Target::LaneCount | 每个目标 SIMD 通道数 | 目标/tpu-拓扑结构 · 内存/tpu 缓冲区布局 |
0x1d60f420 | Target::GetGlobalBarrierSyncFlagNumber | 保留全局屏障 sflag id | 屏障/推断屏障配置 · 屏障/全局屏障窗口 |
0x1d60f4e0 | Target::GetMegacoreBarrierSyncFlagNumber | 保留的 megacore-barrier sflag id | 屏障/全局屏障窗口 · 屏障/屏障到 sflag 绑定 |
0x1d60fc20 | jellyfish::Target::Init | 每目标拓扑初始化程序 | 目标/tpu-拓扑结构 · 屏障/推断屏障配置 |
0x1d615b40 | jellyfish::Target::CoresPerChip | 每芯片内核数(TpuCoreType) | 屏障/张量核屏障 · 扭曲/兆核-偶-奇 |
0x1d6ffae0 | jellyfish::MemorySpaceToString | MemorySpace 枚举 → 名称 | isa/内存空间枚举 · 附录/内存空间表 |
0x1d73e640 | jellyfish::OverrideTpuCompEnvByCmdLineFlags | 标志 → comp-env 覆盖 | 附录/标志目录完整 · 配置/注册表介导的标志 |
0x1d73fcc0 | jellyfish::SetFieldFromFlagString | 字符串标志字段设置器 | 配置/概述 · 配置/注册表介导的标志 |
0x1e66a860 | xla::DefaultDebugOptionsIgnoringFlags | 硬编码 DebugOptions 默认值 | 配置/默认调试选项 · 配置/调试选项-proto |
0x1e835fa0 | tpu::TpuCodec::Create | 每个版本编解码器工厂 | 目标/tpuhal-class-hierarchy · 目标/tpu-版本-代码名称-矩阵 |
0x1e86c7c0 | EncoderJf::EncodeBundleInternal | Jellyfish 32字节捆绑编码器 | isa/isa-发射器-注册表 · barnacore/bcs-32byte-bundle |
0x1fa0a900 | BitCopy(void*, int, const void*, int, int) | 通用位域复制原语 | 前端/编译流程演练 · barnacore/bcs-32byte-bundle |
0x204cecc0 | tpu::driver::InitializeDriver | 驱动程序启动(总线探针、核心枚举) | 配置/概述 · 生命周期/tftpu-initialize-bootstrap |
0x20ad3020 | tpu::TpuTopology::LogicalDevicesPerChip | 每个芯片的逻辑设备(按 TpuCoreType) | 扭曲/兆核-偶-奇 · 目标/tpu-拓扑结构 |
0x20b1b040 | tpu::TpuChipParts::DefaultsForVersion | 每个版本芯片部件默认值 | 目标/芯片零件-binarypb · 附录/每代比较矩阵 |
0x20b3a480 | tpu::TpuVersionToString | TpuVersion 枚举 → 代号字符串 | 取证/每代功能调度程序 · isa/isa-发射器-注册表 |
0x20ccca20 | tensorflow::tpu::GetLibTpuInitArguments | libtpu 初始化参数向量 | 生命周期/模块初始化插件发现 · 附录/标志目录完整 |
0x215f26f0 | .init_array(底座) | 静态构造函数指针数组 | 生命周期/elf-entry-and-init-proc |
0x215f8190 | .init_array(完) | 构造函数数组结束(~2,900) | 生命周期/elf-entry-and-init-proc |
0x21cfa9e0 | AutoProto::_table_ 邻里 | 相邻 AutoProto 反射台 | 配置/autoproto-autoor-resolution · 配置/autoproto-message-arms |
0x22048b30 | .data.rel.ro(完) | 重新定位 RO:vtable、RTTI 图 | 附录/二进制布局 |
0x223a1320 | opcode_info (461 × uint16) | LLO 操作码属性/注册表文件表 | isa/llo-opcode-enum · 附录/llo 操作码表 |
0x224bf798 | filewrapper_toc (_ZL7toc_ptr) | 嵌入式 blob 目录 | 附录/filewrapper-toc-catalog · 取证/自定义部分 |
0x227ba840 | GetTpuPjrtApi::pjrt_api(单例) | 缓存 PJRT_Api; .lbss 中的第一个对象 | pjrt/api-vtable-reconstruction · 取证/自定义部分 |
GOTCHA — 打开表格的五个锚点(
0x1c60480、0x3366d90、0x84a0000、0xb438aec、0xbe8af30)排序低于.text的基础0xe63c000,尽管有些是 8 个十六进制数字并且看起来“高”。它们是数据:.lrodata中的0x1c60480/0x3366d90、.rodata中的0x84a0000、.rodata/protodesc_cold中的0xb438aec/0xbe8af30。大代码模型l标记部分 (.lrodata0x01884a00–0x084931d0) 位于movabs达到的低频段,而不是 RIP 相对lea达到的低频段。不要假设一个看起来很小的 VA 是早期功能的内部;首先检查该部分。注意 — 主表是权威的主干。下面的子系统部分重申了按角色分组的相同锚点以及额外的上下文;他们没有添加新的绑定。当两者意见不一致时,主桌获胜。
如何使用索引
预期的工作流程是单 VA 查找。给定 IDA 中的地址:
- 舍入到功能头。 符号条目 VA 上的表格键。如果你的光标在
0xf874223,那么拥有的函数就是你的VA最大的表键≤——这里是CreatePjrtApi@0xf874160。该索引不列出内部地址;使用反汇编的函数边界找到头部,然后查找头部。 - 读取带,而不仅仅是行。
subsystem-map将每个地址带固定到子系统;如果您的 VA 位于两个索引行之间,该区域仍会告诉您要浏览哪个子系统部分。 PJRT/生命周期为0xe6…–0xf8…;成本模型/目标/水母核心为0x1c8…–0x1d7…; ISA编码器和每代工厂为0x1e8…–0x20b…;数据部分位于0xc2…下方和0x214…上方。 - 跟随第一个拥有链接。 拥有页面中的第一页是规范所有者 - 其主题是此锚点的页面。第二个是上下文的高价值共引页面(调用者、同级页面或目录)。
- 对于数据 VA,需要一个范围。 数据锚点(
.rodata、.lrodata、protodesc_cold、.init_array、.data.rel.ro)被引用为“开始,结束)`spans on their owning pages; a single VA inside the span resolves to the section, not a symbol. [`二进制布局` 是精确边界的权威”。
适用范围及选型
锚点仅在横切时才获得一行:在三个或更多 src/ 页面上引用,或导出的入口点,或多个子系统引用的数据部分。该规则故意排除了读者在 IDA 中仍会遇到的三大类别——索引是这么说的,而不是假装完整:
- 每页局部变量。
_GLOBAL__N_帮助程序、lambda 主体和一次性重写器,一页记录到位。它们可以从该页面找到;在这里复制它们会埋葬脊柱。 - ICF 重复。 相同的代码折叠会生成许多字节相同的小函数和数据表副本(
kDeviceTypeInfo故事就是典型示例:0x1c60480的一个主副本,13 个数据副本)。该索引仅列出规范副本。 - 每操作码/每臂离开。 461 LLO 操作码、AutoProto 消息臂、InstBits 行 — 这些是表,由表锚索引一次(
opcode_info@0x223a1320、InstBits@0x3366d90),而不是行按行。 因此,
错过索引的 VA 并非未记录;它要么是索引函数的内部,要么是其所属页面上的每页局部变量,要么是索引表的成员。在结束间隙之前,绕到头部并重新查找。
PJRT 和生命周期锚
这些是读者首先访问的地址:加载器入口点、静态构造函数机制和延迟构建的 API 单例。它们聚集在低位 (0xe6…–0xf8…),静态初始化数据位于 .init_array/.lbss 的高位。
| VA | 符号 | 角色 | 所属页面 |
|---|---|---|---|
0xe635524 | .init_proc | DT_INIT;跳转到__do_init | 生命周期/elf-entry-and-init-proc |
0xe63c000 | __do_init | 行走 .init_array,运行构造函数 | 生命周期/elf-entry-and-init-proc |
0xe6a83a0 | GetPjrtApi | 薄导出的 thunk → GetTpuPjrtApi | 生命周期/get-pjrt-api-thunk |
0xe6a9d00 | PJRT_Plugin_Initialize | 一次性插件初始化 PJRT_Api 插槽 | 生命周期/tftpu-initialize-bootstrap |
0xe6aa440 | GetTpuPjrtApi | 构建 + 缓存 PJRT_Api 一次 | 生命周期/get-pjrt-api-thunk |
0xe6f54a0 | TfTpu_Initialize | C-shim 初始化路径(非 PJRT 使用者) | 生命周期/tftpu-initialize-bootstrap |
0xeaafba0 | TpuExecutable_LoadProgramAndEnqueueToStream | 导出的 C-shim 执行条目 | 运行时/加载程序入队 |
0xf874160 | CreatePjrtApi | 填充 140 个插槽 (struct_size 1120) + 扩展链 | pjrt/api-vtable-reconstruction |
0x204cecc0 | driver::InitializeDriver | 驱动程序启动(总线探针、核心枚举) | 配置/概述 |
0x20ccca20 | GetLibTpuInitArguments | 返回 libtpu init-arg 向量 | 生命周期/模块初始化插件发现 |
0x215f26f0 | .init_array底座 | 构造函数指针数组的开始 | 生命周期/elf-entry-and-init-proc |
0x215f8190 | .init_array 结束 | ~2,900 个构造函数 (DT_INIT_ARRAYSZ 23,200 B) | 生命周期/elf-entry-and-init-proc |
0x227ba840 | pjrt_api 单例 | .lbss 中的第一个对象;缓存的 PJRT_Api | pjrt/api-vtable-reconstruction |
QUIRK — 唯一需要的 PJRT 导出是
GetPjrtApi@0xe6a83a0,但它几乎什么也不做:它尾部调用GetTpuPjrtApi@0xe6aa440,它延迟运行CreatePjrtApi@0xf874160一次并将结果存放在静态本地pjrt_api@0x227ba840中。追寻“API 表在哪里构建”的重新实现者将在到达组装站点之前通过三个子系统中的三个地址。
编解码器和每代锚点
每个版本工厂和 ISA 编码器。它们将 TpuVersion/DeviceType 解析为编解码器、代号字符串或 32 字节编码包,并与指令位和操作码属性数据表一起位于上部 .text 带(0x1e8…–0x20b…)中。
| VA | 符号 | 角色 | 所属页面 |
|---|---|---|---|
0xf6993a0 | DeviceTypeFromDeviceIdentifiers | 标识符 → 设备类型调度程序 | 取证/每代功能调度程序 |
0x1e835fa0 | TpuCodec::Create | TpuVersion → 编解码器实例 | 目标/tpuhal-class-hierarchy |
0x1e86c7c0 | EncoderJf::EncodeBundleInternal | 水母包 → 32 字节 | isa/isa-发射器-注册表 |
0x1fa0a900 | BitCopy | 编码器使用的通用位域 blit | barnacore/bcs-32byte-bundle |
0x20b1b040 | TpuChipParts::DefaultsForVersion | 每个版本芯片部件默认值 | 目标/芯片零件-binarypb |
0x20ad3020 | TpuTopology::LogicalDevicesPerChip | 每个芯片的逻辑设备(按内核类型) | 扭曲/兆核-偶-奇 |
0x20b3a480 | TpuVersionToString | TpuVersion → 代号字符串 | 取证/每代功能调度程序 |
0x223a1320 | opcode_info(数据) | 461 × uint16 LLO 操作码属性字 | isa/llo-opcode-enum |
0x3366d90 | InstBits(数据) | 每个操作码 TensorCore 编码位 | isa/instbits-master-db |
明白了 — 种子简写“
DefaultsForVersion@0x20b1b040”解析为tpu::TpuChipParts::DefaultsForVersion,不是自由函数。重新实现者必须通过TpuChipParts聚合输入它;该 VA 处没有独立的DefaultsForVersion符号。
成本模型锚
成本模型主干:调度程序查询的延迟/周期/资源表和累加器。它们生活在紧张的 jellyfish/viperfish 频段 (0x1c89…–0x1c8a…) 中,.rodata 中的 LUT 数据价格在 0xb438… 附近下降。
| VA | 符号 | 角色 | 所属页面 |
|---|---|---|---|
0xb438aec | resLUT(数据) | VF资源循环LUT(定价单元) | 成本/vf 周期表 |
0x130abfc0 | CostModel::GetCollectiveCycles | 集体操作周期成本 | 成本/tpu-hlo-成本分析 |
0x1c89adc0 | ResourceVector::Acc | 资源向量累加 | 成本/减少窗口池成本 |
0x1c89ce20 | CycleTable::GetResource | 每指令资源查找 | 成本/资源枚举 |
0x1c89f820 | LatencyTable::LatencyBetween | 调度程序的边缘延迟 | sched/mrb 链分配器 |
0x1c89fba0 | LatencyTable::Create | 每个版本延迟表工厂 | 成本/概述 |
0x1c8a0d60 | LatencyTableJellyfish::LatencyBetweenInternal | JF 延迟边缘实现 | isa/slot-eup-超越 |
0x1c8ae5c0 | MxuLatencyTable::GetResourceUsage | MXU 每指令资源使用情况 | 每个张量核心的成本/iars |
目标和内存锚点
重新实现器不断访问的 jellyfish::Target 访问器 - 通道数、每芯片核心数、保留的同步标志数 - 以及内存空间字符串化器。全部在0x1d6…频段。
| VA | 符号 | 角色 | 所属页面 |
|---|---|---|---|
0x1d60f400 | Target::LaneCount | SIMD 目标通道 | 目标/tpu-拓扑结构 |
0x1d60f420 | Target::GetGlobalBarrierSyncFlagNumber | 保留全局屏障标志 | 屏障/推断屏障配置 |
0x1d60f4e0 | Target::GetMegacoreBarrierSyncFlagNumber | 保留 megacore-barrier sflag | 屏障/全局屏障窗口 |
0x1d60fc20 | Target::Init | 每目标拓扑初始化程序 | 目标/tpu-拓扑结构 |
0x1d615b40 | Target::CoresPerChip | 每芯片内核数(TpuCoreType) | 屏障/张量核屏障 |
0x1d6ffae0 | MemorySpaceToString | MemorySpace 枚举 → 名称 | isa/内存空间枚举 |
注意 —
Target::Init@0x1d60fc20是填充每个其他Target::访问器读取的对象的构造函数;0x1d60f4xx的访问器是那里设置的字段的简单 getter。跟踪来自Init的数据流,而不是来自 getter 的数据流。
屏障、集体和路由锚点
同步和集体几何机制:屏障配置解算器、树屏障核心枚举器、远程垂直同步编码器和扭曲环面副本组几何。分布在 0x109…、0x133…–0x137… 和 0x1c6…–0x1d5…。
| VA | 符号 | 角色 | 所属页面 |
|---|---|---|---|
0x109c6fa0 | TensorCoreBarrierAssignment::DetermineBarrierConfigForKey | 屏障配置求解器 | 屏障/张量核屏障 |
0x133c2dc0 | ConstructConfigForCollectiveUniDirNDGroups | UniDir-ND集体配置 | 集体/张量分割平面 |
0x137d3de0 | TwistedTorusND::GetPhase1ReplicaGroups | 第一阶段副本组几何 | 路由/路由表生成 |
0x13a33320 | isa_emitter::GetVectorMask | SparseCore 矢量掩模发射 | 稀疏核心/扫描数据路径 |
0x1c6a75c0 | net_util::BarrierCoresTree | Tree-barrier核心枚举 | 屏障/树屏障垂直同步 |
0x1d522f40 | LloRegionBuilder::VsyncAddRemote | 远程 vsync sflag 发射器 | 屏障/远程标志编码器 |
编译器、调度器和运行时锚点
管道注册、延迟隐藏调度程序核心、flag/comp-env 管道和运行时执行路径。编译器/配置代码位于 0xf8…/0x1d7…/0x1e6… 频段; 0x10…–0x13… 中的调度程序和运行时。
| VA | 符号 | 角色 | 所属页面 |
|---|---|---|---|
0xf795300 | AutoOr<bool>::FromProtoOrDie | AutoProto → 标志物化器 | 配置/autoproto-autoor-resolution |
0xf849ec0 | TpuCompiler::RegisterAllPhases | HLO通行证管道注册 | 运行时/内部通行名 |
0x1096fac0 | (anon)::RunHloScheduler | 调度程序驱动程序 | sched/lhs-ilp-变体 |
0x12fc3080 | RunMemorySpaceAssignment | HBM/VMEM 内存空间分配 | 编译器/msa-概述 |
0x136321a0 | LatencyHidingScheduler::RunImpl | LHS核心调度循环 | sched/lhs-布局后 |
0x13426260 | DeepseaExecutable::LoadProgramAndEnqueueToStream | 程序加载+入队 | 运行时/加载程序入队 |
0x1d0b33e0 | System::Execute | 顶级异步执行 | 运行时/加载程序入队 |
0x1d73e640 | OverrideTpuCompEnvByCmdLineFlags | 标志 → comp-env 覆盖 | 附录/标志目录完整 |
0x1d73fcc0 | SetFieldFromFlagString | 字符串标志字段设置器 | 配置/概述 |
0x1e66a860 | DefaultDebugOptionsIgnoringFlags | 硬编码 DebugOptions 默认值 | 配置/默认调试选项 |
分析和数据部分锚点
跟踪管道工厂、每个设备类型信息表以及读者将滚动到的大型只读数据部分,而光标下没有函数。这些是最有可能被引用为“范围”而不是单个 VA 的锚点。
| VA | 符号/部分 | 角色 | 所属页面 |
|---|---|---|---|
0x84a0000 | .rodata 名称池(基础) | 合并的以 NUL 结尾的字符串池 | 附录/filewrapper-toc-catalog |
0xbe8af30 | protodesc_cold(部分,→ 0xc1bf0b0) | 序列化 FileDescriptorProto blob | 附录/protodesc-cold-catalog |
0xf5a2900 | GetTraceCodec | Per-DeviceType 跟踪编解码器工厂 | 分析/跟踪 xevent 条目 |
0x1c60480 | kDeviceTypeInfo(.lrodata,→ 0x1c64d48) | DeviceTypeInfo[17]冷冻台 | 分析/kdevicetypeinfo-生产者-读者 |
0x21cfa9e0 | AutoProto::_table_ 邻里 (.data.rel.ro) | 相邻 AutoProto 反射台 | 配置/autoproto-autoor-resolution |
0x22048b30 | .data.rel.ro(完) | 重新定位 RO:vtables + RTTI 图 | 附录/二进制布局 |
0x224bf798 | filewrapper_toc(_ZL7toc_ptr,488 B) | 嵌入式 blob 目录 | 附录/filewrapper-toc-catalog |
QUIRK —
kDeviceTypeInfo@0x1c60480是.lrodata(perm 4,只读无写),在[0x1c60480, 0x1c64d48)上具有零.rela.dyn条目 - 它在链接时冻结,并且没有运行时生成器。.lrodata其他地方的13字节相同副本是ICF数据重复,而不是独立表;仅索引主副本。CORRECTION (ANCHOR-1) — 数据锚点
0x84a0000(名称池)、0xb438aec(resLUT)、0x223a1320(opcode_info)、0x3366d90(InstBits)、0x224bf798(filewrapper_toc)、0x227ba840(pjrt_api)、0x215f26f0/0x215f8190(.init_array) 和0x22048b30(.data.rel.roend) 不解析为…_function_addresses.json中的符号 — 该文件列出了代码函数仅。它们是数据/部分锚点,并根据所属页面的部分/符号引用进行验证(对于kDeviceTypeInfo和pjrt_api,根据命名符号_ZN5xprofL15kDeviceTypeInfoE和_ZL7toc_ptr)。函数表查找失败的地址并不因此无效;在将未命中视为缺陷之前,检查所属页是否将其固定为数据。
交叉引用
- 子系统图 — 正向索引:地址带 → 子系统;与这个平坦的反向指数配对
- 代号备忘单 — 代号 → 每代事实;这里的许多锚点都是那里引用的每代工厂函数
- 交叉参考图 — 页面 → 页面链接图;使用它从拥有页面走到其邻居页面
- 符号命名空间索引 — 命名空间普查(
xla::jellyfish、xprof::tpu,...)位于此处索引的符号后面 - 二进制布局 — 完整段/节表;上述每个数据部分范围的权限
- 每代比较矩阵 — 将每个版本的工厂锚点(
TpuCodec::Create、DefaultsForVersion、TpuVersionToString)收集到一张表中 - Get-PjrtApi Thunk — 生命周期锚跟踪的三跳 PJRT 入口路径
- PJRT API-Vtable重建 — 140 槽表
CreatePjrtApi填充和pjrt_api单例缓存