降级系统
公开「元类型」
文言:降级之目标,系统与指令之集也。系统定入口、导入入系统之途、内存增长之策、址式与可执行之式;指令之集定编码。裸机、Linux 与苹果共用同一名义地址之布:用户代码、元数据、线性内存、传参暂存、栈与动态之区。裸机与 Linux 以名义之址为实址;苹果位置无关,以全局基址为锚。汉语:寄存器降级的目标描述:操作系统 × 指令集。操作系统决定程序入口、导入如何进入系统(入口绑定表)、线性内存增长的策略、地址模式与可执行文件格式(裸机镜像、ELF 或 Mach-O);指令集决定机器编码。裸机、Linux 与 macOS 共用同一套名义地址布局(用户代码与元数据、线性内存、传参暂存、栈、动态区)。裸机与 Linux 直接用名义地址;macOS 必须位置无关,名义地址一律换成“全局基址寄存器 + 偏移”。
裸机系统
公开「降级系统」
暂无说明。
Linux系统
公开「降级系统」
暂无说明。
苹果系统
公开「降级系统」
暂无说明。
降级目标
公开「元类型」
暂无说明。
降级目标项
公开化「降级系统」而化「爻」而「降级目标」
暂无说明。
裸机目标
公开化「爻」而「降级目标」
文言:臂为真者 ARM64,否则 AMD64。汉语:参数“臂”为真表示 ARM64,否则 AMD64。
Linux目标
公开化「爻」而「降级目标」
暂无说明。
苹果目标
公开化「爻」而「降级目标」
文言:苹果之目标,位置无关,映像随机而移。汉语:macOS 目标:可执行文件必须位置无关,映像每次随机滑动。
目标臂
公开化「降级目标」而「爻」
暂无说明。
目标是裸机
公开化「降级目标」而「爻」
暂无说明。
目标是苹果
公开化「降级目标」而「爻」
暂无说明。
目标址式
公开化「降级目标」而化「整数」而「址式」
文言:址式依目标:苹果位置无关,以名义之全局基址为锚;余皆绝对。汉语:按目标取地址模式:macOS 为相对址式(锚是名义全局基址),裸机与 Linux 为绝对址式。
目标用户基址
公开化「降级目标」而「整数」
文言:用户代码之始址。汉语:用户代码起始地址:ARM64 为 0x40200000,AMD64 为 0x200000。
目标线性基址
公开化「降级目标」而「整数」
文言:线性内存之始址。汉语:线性内存起始地址:ARM64 为 0x40300000,AMD64 为 0x300000。
目标栈顶
公开化「降级目标」而「整数」
文言:栈之顶,苹果增其栈,以容编译器深调用。汉语:用户栈顶:macOS arm64 为 0x42400000(栈约 32 MiB),其余 ARM64 为 0x40400000,AMD64 为 0x400000。栈下界(0x403D0000、0x3D0000)由函数序言检查。
苹果文本区
公开「整数」
文言:苹果之布:代码居映像之始后一千二十四字节;数据段始于映像之始后六十四兆字节,其间之隙不映,故代码之长不改锚距。数据段载元数据、页数、线性内存、传参暂存与栈,其后为导入之槽,再后为动态之区;诸名义之址同裸机之布。汉语:macOS 布局:代码在映像起址后 1024 字节;数据段固定从映像起址后 64 MiB 开始(中间不映射),因此代码长短不影响从代码到数据的距离。数据段依次是元数据、页数、线性内存、传参暂存与栈(名义地址与裸机相同),栈顶之上是导入槽(每个 8 字节,第零个留给 ___error),再往上按 16 KiB 对齐是动态区。
苹果数据名义起址
公开化「降级目标」而化「整数」而「整数」
文言:数据段名义之始:用户基址加段偏移,向下对齐于一万六千三百八十四。汉语:数据段的名义起址:元数据起址(全局基址)向下对齐到 16 KiB。
苹果锚距
公开化「降级目标」而化「整数」而「整数」
文言:锚距:自代码之始至全局基址之运行距离。汉语:锚距:运行时从代码起址到全局基址的距离 = 数据段偏移 − 1024 + 全局基址在数据段内的偏移。
苹果导入槽址
公开化「降级目标」而化「整数」而「整数」
文言:第若干导入槽之名义址,在栈顶之上。汉语:第 序 个导入槽的名义地址:栈顶 + 8 × 序。
苹果动态基址
公开化「降级目标」而「整数」
文言:动态之区,在导入之槽之上,对齐于一万六千三百八十四;导入至多二千零四十七。汉语:macOS 动态区名义起址:栈顶之上 16 KiB(导入槽至多 2048 个,含 ___error)。
目标动态基址
公开化「降级目标」而「整数」
文言:线性内存逾八页,则迁于动态之区。汉语:线性内存超过八页后迁入的动态区起址:裸机与 Linux 的 ARM64 为 0x60000000,AMD64 为 0x8000000;macOS 见「苹果动态基址」。
导入绑定
公开「元类型」
文言:导入之绑定:裸机者内核服务之号;Linux 者系统调用之号,并诸参之类,零为整数,一为线性内存之址(入系统前加线性基址);苹果者 libSystem 之函数,并诸参之类与转错之标。汉语:入口绑定:裸机导入绑定到内核服务号;Linux 导入绑定到本指令集的系统调用号,并给出每个参数的类别:零是整数(零扩展为六十四位),一是线性内存地址(进入系统前加上线性内存基址);macOS 导入绑定到 libSystem 函数(经导入槽调用),给出参数类别与是否把返回 -1 转成 -errno。
服务绑定
公开化「整数」而「导入绑定」
暂无说明。
系统调用绑定
公开化「整数」而化(「列」于「整数」)而「导入绑定」
暂无说明。
库函数绑定
公开化(「列」于「整数」)而化「爻」而「导入绑定」
暂无说明。
常量绑定
公开化「整数」而「导入绑定」
暂无说明。
基址绑定
公开化「整数」而「导入绑定」
暂无说明。
陷阱绑定
公开「导入绑定」
暂无说明。
目标平台号
公开化「降级目标」而「整数」
文言:目标之号,同底层接口“取平台”之号:裸机一,Linux 二,苹果三。汉语:目标的平台号,与底层接口“取平台”的编号相同:裸机 1、Linux 2、macOS 3(Windows 将为 4)。
本目标模块名
公开化「降级目标」而「字符串」
文言:本目标之导入模块名:裸机平台,Linux 为 Linux,苹果为苹果。汉语:本目标自己的导入模块名:裸机为“平台”,Linux 为“Linux”,macOS 为“苹果”。
是目标内建导入
公开化(「字符串」合「字符串」合「整数」)而「爻」
文言:目标之内建导入,模块名目标:平台号者,诸目标皆绑为常量,程序以之择平台之途;内存基址低、内存基址高者,返线性内存基址之低高三十二位,以造系统所需之绝对指针(如 execve 之参数表)。汉语:目标内建导入(模块“目标”):“平台号”在每个目标上绑定为返回本目标平台号的常量桩,同一份程序(如执行器)据此在运行时选择平台实现;“内存基址低”“内存基址高”返回线性内存基址(ARM64 的 x28、AMD64 的 r9)的低、高 32 位,供程序拼出操作系统要求的绝对指针(如 execve 的参数指针表)。
是本目标导入
公开化「降级目标」而化(「字符串」合「字符串」合「整数」)而「爻」
文言:他目标之导入,绑为陷阱:一份程序兼载诸平台之途,唯本目标之途真行。汉语:是否本目标自己的导入。其他目标的导入(如 Linux 程序里的“平台”导入)绑定为陷阱桩:同一份程序可以同时带着几个平台的实现,运行时只会走本目标那一支。
Linux入口表
公开(「列」于(「字符串」合「整数」合「整数」合(「列」于「整数」)合「整数」))
文言:Linux 入口之表:名、臂之号、兼之号、诸参之类、结果之数。类者,零为整数(零扩),一为线性内存之址,二为有符号整数(符扩)。导入之模块名为 Linux,导入之名即系统调用之名。汉语:Linux 入口表:每行为 名称、ARM64 调用号、x86-64 调用号、参数类别列表、结果数。参数类别:0 整数(零扩展),1 线性内存地址(加线性基址),2 有符号整数(符号扩展,如 lseek 的偏移)。空指针参数(如 accept4 的地址)按整数 0 传。导入模块名为 Linux,导入名就是系统调用名。这是数据,不是代码;新增系统调用只加一行。至多六个参数。
Linux入口
公开化「字符串」而(「字符串」合「整数」合「整数」合(「列」于「整数」)合「整数」)
暂无说明。
苹果入口表
公开(「列」于(「字符串」合「字符串」合(「列」于「整数」)合「整数」合「爻」))
文言:苹果入口之表:名、libSystem 之符号、诸参之类、结果之数、返负一时是否以 errno 之负代之。导入之模块名为苹果。汉语:macOS 入口表:每行为 导入名、libSystem 符号名、参数类别、结果数、是否把返回 -1 转成 -errno。参数类别:0 整数、1 线性内存地址、2 有符号整数、3 可变参数中的整数、4 可变参数中的地址(可变参数按 Apple ARM64 约定放在栈上)。导入模块名为“苹果”。这是数据;新增函数只加一行。
苹果入口
公开化「字符串」而(「字符串」合「字符串」合(「列」于「整数」)合「整数」合「爻」)
暂无说明。
苹果导入检
公开化((「列」于(「整数」合「整数」))合(「列」于(「字符串」合「字符串」合「整数」))合(「列」于(「整数」合「整数」合(「列」于「网页指令」)))合(「列」于(「字符串」合「整数」)))而化(「字符串」合「字符串」合「整数」)而「有」
文言:苹果导入之验:模块名须为苹果,名在表中,签名合表。汉语:检查 macOS 导入:模块名须为“苹果”,名称在入口表中,参数数与结果数和表一致(至多八个参数)。
目标导入绑定
公开化「降级目标」而化(「字符串」合「字符串」合「整数」)而「导入绑定」
文言:导入之绑定,依目标而定:裸机之导入出自平台,Linux 之导入出自 Linux,苹果之导入出自苹果。汉语:按目标查导入的绑定。裸机导入须来自“平台”模块(见 整数降级 的服务号表);Linux 导入须来自“Linux”模块且名在入口表中;macOS 导入须来自“苹果”模块且名在入口表中。
Linux函数入口
公开化「降级目标」而化((「列」于(「整数」合「整数」))合(「列」于(「字符串」合「字符串」合「整数」))合(「列」于(「整数」合「整数」合(「列」于「网页指令」)))合(「列」于(「字符串」合「整数」)))而「整数」
文言:Linux 目标之入口:验函数之核,诸导入之签名须合入口之表,末取启动之函数。汉语:Linux 目标的启动函数号:验证函数核心,检查每个导入的参数数与结果数和入口表一致(至多六个参数,AMD64 至多四个),再找导出的“启动”。
苹果函数入口
公开化((「列」于(「整数」合「整数」))合(「列」于(「字符串」合「字符串」合「整数」))合(「列」于(「整数」合「整数」合(「列」于「网页指令」)))合(「列」于(「字符串」合「整数」)))而「整数」
暂无说明。
目标函数入口
公开化「降级目标」而化((「列」于(「整数」合「整数」))合(「列」于(「字符串」合「字符串」合「整数」))合(「列」于(「整数」合「整数」合(「列」于「网页指令」)))合(「列」于(「字符串」合「整数」)))而「整数」
文言:依目标取启动之函数号。汉语:按目标取启动函数号(含导入检查)。
苹果槽符号们
公开化((「列」于(「整数」合「整数」))合(「列」于(「字符串」合「字符串」合「整数」))合(「列」于(「整数」合「整数」合(「列」于「网页指令」)))合(「列」于(「字符串」合「整数」)))而(「列」于「字符串」)
文言:苹果之导入槽所绑之符号,依槽序:第零为 ___error,其后依导入之序。汉语:macOS 导入槽要绑定的符号,按槽序排列:第 0 个是 ___error,其后按模块导入的顺序。