System V AMD64 ABI中%gs寄存器属于调用方保存还是被调用方保存?
System V AMD64 ABI 中
%gs寄存器规范解答 对应提问:该ABI是否对
%gs有明确规定?%gs属于caller-save(调用方保存)还是callee-save(被调用方保存)寄存器?它是否属于保留寄存器?
System V AMD64 ABI 对%gs寄存器有明确的规定,相关规则如下:
- 用途定义:
%gs属于系统预留的段寄存器,用户态场景下由操作系统为每个线程预配置其对应的内存基地址,专门用于实现线程本地存储(TLS)相关的访问逻辑,用户态代码仅可通过%gs的地址偏移读取或写入TLS区块数据,不允许直接修改%gs本身的段选择子取值。 - 调用保存规则:
%gs不属于普通通用寄存器的caller-save/callee-save分类范畴。ABI明确要求所有符合规范的函数都不能修改%gs的取值,也不需要在函数调用流程中对它做保存或恢复操作,它的取值由操作系统/运行时保证在整个线程的生命周期内稳定。 - 保留属性:
%gs属于严格的保留寄存器,任何用户态代码随意修改%gs的行为都会违反ABI约定,大概率会导致程序崩溃或者不可预期的运行错误。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

