8.8 KiB
8.8 KiB
z/OS:TCB·SRB / 三个地址空间 / load module 与 LE / AMODE·RMODE·XPLINK
z/OS **不能直接套 process + thread 模型**。可调度的工作单位有两类,地址空间不止一个,**而且程序自身还有一套"我能在哪种寻址模式下跑、我住在哪里"的属性**:可调度单位:TCB / SRB
地址空间:home / primary / secondary
程序属性:AMODE / RMODE(+ XPLINK 与否)
三者叠在一起,才会出现:
当前执行地址属于另一个地址空间 → 不能自动判控制流劫持
同一个模块在两种调用约定下栈行为相反 → 不能自动判栈损坏
</CORE RULE>
一、两种可调度单位
| TCB | SRB | |
|---|---|---|
| 代表 | 在地址空间中执行的任务 | 运行系统服务例程的请求 |
| 典型产生 | 用户程序与支持它们的系统程序 | 一个地址空间检测到影响另一个地址空间的事件 |
| 归属 | home 地址空间包含该 TCB | 与 ASCB(局部 SRB)或主调度器(全局 SRB)对齐 |
| 能力 | 常规任务语义 | 总在 supervisor state;不能调用 SVC(除 ABEND)或 WAIT;可跨内存/AR 模式运行、发出 PC、调度另一个 SRB |
- SRB 提供地址空间间通信的异步机制(同步对应物是带访问寄存器的 cross-memory services)
- PC(PROGRAM CALL)指令要求可调度工作单位以 TCB 或 SRB 形式存在
所以:没有传统"线程创建图"的执行代码不一定是异常。
二、三个地址空间:home / primary / secondary
- 程序首次被调度时,home 与 primary 相同
- home 是该 TCB/SRB 最初被调度的地址空间,在整个执行期间保持不变;
PSAAOLD总是指向 home(硬件不会改它) - primary:取其段表来取指令的地址空间;secondary 用于 secondary ASC 模式下的数据访问
- 取指规则:primary/secondary/AR 模式从 primary 取指;home 模式从 home 取指;real 模式从实存取指
三、PC 指令与空间切换
- PC-SS(空间切换):被切到的地址空间成为 primary,secondary 通常设为原 primary,home 不变
- PC 例程始终运行在发出 PC 的那个 TCB/SRB 之下
- 两种链接方式:basic PC(手动机保存/恢复调用者环境,用 PT 返回)与 stacking PC(系统把环境保存在 linkage stack 上,用 PR 返回)
- PC 通过入口表与链接索引定义;PC 号由链接索引与入口表索引拼接
四、AR(访问寄存器)模式
- 每个通用寄存器配一个 AR;放进 AR 的 ALET 标识目标地址空间
- 特殊 ALET:0 = primary、1 = secondary、2 = home
- AR 模式可与最多 16 个地址空间通信,并且可以调用 SVC(这是它优于 basic cross-memory 的地方)
五、约束与经典故障
- cross-memory services 需要 APF 授权;远端地址空间必须 non-swappable
- 跨地址空间使用 TCB 指针是经典的 S0C4-11 成因——TCB 在不同地址空间中不在同一虚拟地址
- 在跨内存模式(primary ≠ home)下,工作单位的用户身份取自 home ASCB 或 TCB/SRB
六、可执行材料:load module / program object
| 形态 | 说明 |
|---|---|
| load module | 传统链接编辑产物 |
| program object | 更新的形态,可住在 PDSE 里;z/OS UNIX 的 load module 住在 PDS 里 |
| 链接 | 链接编辑 / program binder;链接库列表决定解析来源 |
AMODE / RMODE(每个程序对象都带):
- AMODE:程序支持哪种硬件寻址模式——24 / 31 / ANY / 64
- RMODE:程序对象住在哪里——24(16 MB 以下)/ ANY(以下或以上)
- 程序对象与运行中的程序各自都有 AMODE 属性;语言运行时选项与编译器选项共同影响 AMODE/RMODE 行为与存储位置
- 某些场合下 AMODE 24 执行受限,必须用 31
XPLINK 与非 XPLINK 的差异(判栈/调用约定时的关键):
| XPLINK | 非 XPLINK | |
|---|---|---|
| 栈增长方向 | 向上 | 向下 |
| 栈展开 | BACKCHAIN 编译子选项 | backchain 指针 |
| 栈指针 | GPR4,带 0x800 偏置 | 常规 |
| 参数传递 | 参数在寄存器/调用者的 DSA 中(STOREARGS) | R1 指向参数列表 |
- 运行时会在 XPLINK ↔ 非 XPLINK 之间自动插入衔接代码;两者之间的转换仅支持 31 位情形
- 转换可用专门的跟踪选项观察(跟踪项类型区分入口/出口)
- 不支持的路径包括:COBOL 动态调用 XPLINK 函数、某些语言的 FETCH、部分加载服务
逆向含义:同一份代码在两种约定下栈行为相反——看到"栈向上长"或"栈指针带偏置"不要判损坏,先确认它是不是 XPLINK。
七、supervisor services 与 SVC
- 系统服务经 SVC 与中断处理程序提供;SVC 表是定位系统服务入口的落点
- 与 SVC 相关的是
SVC类型的 dump(与 standalone dump 并列) - PC 表(程序调用入口表)同样是可定位的静态结构
八、诊断与 dump
- dump 类型多种(含 SVC dump、standalone dump),由 dump 管理机制产生
- IPCS 是离线分析 dump 的工具:定义/选择 dump、一系列 dump 命令;配合 SLIP(自动化的诊断动作)与 GTF(跟踪)使用
- XPLINK 下控制块比 31 位更少,因此 IPCS 的 LEDATA 视图尤其重要:它能给出 traceback 与 DSA 层次(与语言运行时提供的 dump 服务同类)
- 语言运行时另提供 dump/traceback/SNAP 类服务与跟踪表工具
- 跟踪表内容以 EBCDIC 呈现;运行时也提供 ASCII/EBCDIC 字符模式切换服务
逆向含义:拿到一个现场,先确认 dump 类型与"是否 XPLINK"——后者决定你该去找哪些控制块、以及 traceback 从哪里取。
九、字符与记录模型
- 字符是 EBCDIC(不是 ASCII)——字符串常量、日志、跟踪表都按此处理
- 记录模型:数据集结构、记录格式、VSAM 属于 z/OS 数据管理的独立一套概念,不要套 POSIX 字节流文件
决策树
拿到 z/OS 目标
├─ 执行单位是什么
│ ├─ TCB(地址空间内的任务)还是 SRB(系统服务请求)
│ ├─ SRB 不能调 SVC(除 ABEND)、不能 WAIT
│ └─ 没有线程创建图 ≠ 异常
├─ 地址对不上
│ ├─ 区分 home / primary / secondary
│ ├─ PC 之后 primary ≠ home 属正常,home 不变
│ └─ 取指来自 primary(home 模式除外)
├─ 栈行为反常
│ ├─ 先确认是不是 XPLINK(栈向上长、栈指针带 0x800 偏置)
│ ├─ XPLINK ↔ 非 XPLINK 转换仅限 31 位,且需要衔接代码
│ └─ 别把两种约定的差异判成栈损坏
├─ 程序装不进/跑不起来
│ ├─ 查 AMODE(24/31/ANY/64)与 RMODE(24/ANY)
│ └─ 程序对象与运行中程序的属性都要看
├─ 跨地址空间传数据
│ ├─ basic cross-memory(需 APF 授权,远端须 non-swappable)
│ └─ 或 AR 模式(ALET 0/1/2;可调 SVC)
├─ 出现 S0C4-11 一类故障
│ └─ 查是否跨地址空间用了 TCB 指针
├─ 现场诊断
│ ├─ 确认 dump 类型;XPLINK 下控制块更少 → 依赖 LEDATA
│ └─ 字符按 EBCDIC 读
└─ 数据访问
└─ 记录模型(数据集/记录格式/VSAM)≠ POSIX 字节流
工具与验证
- 执行单位:TCB 与 SRB 的区分;SRB 的调度路径(局部/全局)
- 地址空间:home / primary / secondary 的当前值与切换点(PC / PR / PT / SSAR)
- 程序属性:load module / program object 的 AMODE、RMODE、是否 XPLINK;所在库类型(PDS vs PDSE)
- 诊断:dump 类型、IPCS 视图(XPLINK 下重点看 LEDATA)、跟踪表
- 验证:能同时说清「工作单位是 TCB 还是 SRB + 当前 primary/secondary/home 各是谁 + 这段代码在哪种寻址模式与调用约定下运行」
该平台的坑(汇总)
- 把 TCB/thread 模型直接套上去:SRB 是另一类可调度单位,约束完全不同
- 以为所有执行都有线程创建图:SRB 由事件触发
- 把 primary 与 home 混同:PC 之后它们不同,且 home 永不改变
- 用 primary 的地址解释跨内存模式下的权限:身份取自 home ASCB 或 TCB/SRB
- 跨地址空间复用 TCB 指针:经典 S0C4-11 成因
- 忘记 SRB 不能 WAIT/不能调 SVC
- 把 XPLINK 的栈行为判成损坏:方向相反、栈指针带偏置、展开机制不同
- 忽略 XPLINK 与非 XPLINK 之间转换只支持 31 位
- 只看程序对象忽略运行中程序的 AMODE:两者都有该属性
- 在 XPLINK 下按 31 位的控制块清单找现场:控制块更少,要看 LEDATA 视图
- 按 ASCII 处理字符串与跟踪表:这里是 EBCDIC
- 把数据集/记录格式当字节流文件