长模式下的段权限检查机制
在x86_64的长模式Long Mode下段机制发生了根本性的简化段基址和段限长检查被弱化但权限检查即特权级检查仍然至关重要。长模式下的段权限检查实际上只围绕一个核心规则数据段的访问权限检查被大幅简化但代码段和控制转移的权限检查依然严格。一、长模式下的关键变化与保护模式对比特性保护模式32位长模式64位段基址可任意指定CS/SS/DS/ES 基址强制为0FS/GS可通过MSR独立设置段限长有效基于Limit字段CS/SS/DS/ES 段限长被忽略视为全64位地址空间分段检查每个内存访问都检查基址限长仅对FS/GS进行基址/限长检查其他段跳过权限检查DPL/RPL严格检查仍然严格检查特别是代码段和控制转移段类型检查完整检查代码/数据/系统段简化为代码段CS和数据段DS/SS/ES两类CALL/JMP门支持任务门、调用门等不再支持任务门/调用门使用中断门/陷阱门替代二、长模式下的段权限检查核心机制1. 当前特权级CPL的确定CPU通过CS段选择子的RPL请求特权级字段来确定当前特权级CPL而不是通过段描述符中的DPL。具体地在长模式下CS.RPL 0内核态ring 0CS.RPL 3用户态ring 3注意长模式只支持ring 0和ring 3ring 1和ring 2在长模式下没有实际用途但段描述符中的DPL仍然允许设置为1或2只是操作系统通常不使用。2. 数据段访问权限检查DS/SS/ES长模式下数据段的权限检查简化为仅检查CPL与段描述符DPL的关系条件结果CPL DPL数值上0 ≤ 3不对数值越小特权越高允许访问CPL DPL触发#GP通用保护异常具体规则CPL0内核可访问任何DPL的数据段DPL0/1/2/3CPL3用户只能访问DPL3的数据段不能访问DPL0/1/2示例; 用户态代码CS.RPL 3 mov rax, [0x12345678] ; 数据段默认为DS用户态DS指向DPL3的段→ 允许 mov rax, [fs:0x10] ; FS基址独立权限检查基于GS的段描述符通常也是DPL3→ 允许如果用户态试图加载一个DPL0的内核数据段到DS会触发#GP。3. 代码段访问与控制转移检查这是长模式下权限检查最复杂的部分涉及代码段切换和控制转移指令JMP、CALL、RET、IRET等。a. 直接转移JMP/CALL到同一代码段在同一代码段内跳转不涉及CPL变化只检查目标地址是否在当前段限长内但段限长被忽略所以总是允许。到不同代码段的跳转通过JMP/CALL远跳转在长模式下直接远跳转使用JMP FAR被禁止只能通过中断门/陷阱门或系统调用SYSCALL/SYSRET实现跨段转移。b. 通过中断门/陷阱门的控制转移异常和中断这是长模式中最常见的跨段转移方式。CPU通过IDT中断描述符表中的门描述符来转移控制权限检查条件当前特权级CPL必须等于中断门的DPL或者数值上小于DPL即特权级更高不对于中断门要求CPL DPL这里需要澄清用户态CPL3可以通过int 0x80触发一个DPL3的中断门例如Linux的系统调用。内核态CPL0触发任何中断通常内核中断门的DPL0。CPL 目标代码段的DPL不对于中断门目标代码段的DPL通常是0内核代码段但中断门本身有DPL权限检查的是CPL必须 中断门的DPL数值上0 3内核可触发任何中断3 3用户可触发DPL3的中断。目标段描述符的DPL代码段的DPL决定了目标代码段运行的特权级通常是0。示例Linux系统调用int 0x80用户态CPL3执行int 0x80。IDT中的0x80中断门的DPL3允许用户态触发。目标代码段__KERNEL_CS的DPL0内核态。权限检查CPL(3) 中断门DPL(3)→ 允许转移到内核代码段CPL变为0。c. 系统调用SYSCALL/SYSRET长模式下的系统调用不经过中断门直接使用SYSCALL指令它绕过了一般的段权限检查但依然通过MSRIA32_STAR、IA32_LSTAR指定目标代码段和栈并在执行时自动切换CPL从3到0返回时通过SYSRET切换回用户态从0到3。d. 返回指令RET/IRETIRET从中断返回会检查返回目标代码段的CPL是否与栈上的CS选择子的RPL一致如果不一致例如内核返回到用户态会触发#GP。RET远返回在长模式下RETF远返回是不允许的会被忽略或触发#GP。三、长模式下的段权限检查流程状态机┌─────────────────┐ │ 当前 CPL │ CS.RPL (从段选择子读取) │ (0 或 3) │ └────────┬────────┘ │ ▼ ┌───────────────────┐ │ 数据访问DS/SS/ES │ │ 检查CPL 目标段描述符的 DPL │ └────────┬──────────┘ │ ▼ ┌───────────────────┐ │ 代码转移JMP/CALL/IRET │ │ 1. 检查中断门/陷阱门的 DPL │ │ 2. 检查目标代码段的 DPL │ │ 3. 检查栈段SS的 DPL │ └────────┬──────────┘ │ ▼ ┌────────────────────┐ │ 返回IRET │ │ 检查返回目标 CS 的 RPL 与当前 CPL │ └────────────────────┘四、段寄存器在长模式下的实际角色段寄存器基址段限长权限检查角色CS0固定忽略确定CPL通过RPL字段代码执行权限SS0固定忽略特权级切换时确定是否切换栈通过IRETDS0固定忽略数据访问权限检查CPL DPLES0固定忽略同DSFS / GS独立MSR设置可设置仍进行完整的基址/限长检查用于线程局部存储、CPU核心数据五、实际代码示例// 尝试在内核态加载用户态数据段x86_64 static inline void load_user_ds(void) { asm volatile ( mov %0, %%ds\n : : r (__USER_DS) // 用户态数据段选择子DPL3 : memory ); } // 如果在内核CPL0中执行此函数会触发 #GP // 因为 CPL(0) 用户态DS的DPL(3)不CPL0 DPL3应该允许 // 实际上内核可以加载用户态DS因为0 3但访问内存时DS的基址为0且权限检查基于CPL与DS.DPL的关系。 // 但出于安全考虑Linux内核通常不这样做。六、总结长模式下的段权限检查规则操作检查内容失败结果加载数据段DS/SS/ESCPL 段描述符.DPL且段类型 数据段#GP加载代码段CS仅通过中断门/陷阱门或SYSCALL间接加载不能直接LOAD#GP中断/异常处理CPL 中断门.DPL且目标代码段.DPL 0通常#GP/#DFIRET返回栈上CS.RPL 目标CPL且CPL 目标栈段.DPL#GPSYSCALL进入无检查硬件直接切换#GP如果MSR配置错误SYSRET返回要求目标CS.RPL 3 且 目标栈段.DPL 3#GP七、常见误解澄清“长模式下段寄存器被弃用了”→ 不准确。CS和SS仍然用于特权级管理FS和GS仍然用于TLS/CPU核心数据。“长模式下段限长检查被完全忽略”→ 仅对CS、DS、SS、ES而言。FS和GS仍然有基址和限长通过MSR设置。“长模式下CPL只能从CS选择子读取”→ 正确。段描述符的DPL只用于数据段权限检查不用于确定CPL。

相关新闻

今天我们来真正地认识 AI Agent

今天我们来真正地认识 AI Agent

引: 普通用户在各大平台(如豆包、通义千问等)大多体验过“创建我的智能体”功能。在早期,我们只能通过配置简单的提示词(Prompt),让大模型扮演特定角色进行对话交互;随后&#xff0…

2026/9/27 14:29:22 阅读更多 →
突破阿里云OSS图片20MB限制:客户端压缩、异步处理与替代方案实战

突破阿里云OSS图片20MB限制:客户端压缩、异步处理与替代方案实战

1. 问题缘起:当20MB成为图片处理的隐形门槛 那天下午,运营同事急匆匆地跑过来,说后台又卡住了,用户上传的一张产品全景图死活处理不了。我一看报错日志,熟悉的“ The image size exceeds the limit ”赫然在目。这已…

2026/9/23 19:15:51 阅读更多 →
【2027最新】基于SpringBoot+Vue的大学生竞赛管理系统管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的大学生竞赛管理系统管理系统源码+MyBatis+MySQL

💡实话实说:CSDN上做毕设辅导的都是专业技术服务,大家都要生活,这个很正常。我和其他人不同的是,我有自己的项目库存,不需要找别人拿货再加价。我就是个在校研究生,兼职赚点饭钱贴补生活费&…

2026/9/27 1:12:35 阅读更多 →

最新新闻

从直连到聚合:大模型API对接的架构演进与实战避坑指南

从直连到聚合:大模型API对接的架构演进与实战避坑指南

1. 从直连到聚合:API对接思路的转变2026年开年到现在,我陆续参与了三个不同规模的AI应用项目,从智能客服到内容生成工具,再到一个内部知识库问答系统。这三个项目有一个共同点:都需要对接大模型API。而在这三个项目的推…

2026/10/13 16:19:32 阅读更多 →
Linux内核inotify联动端侧模型:实现敏感配置文件变动的毫秒级语义差分告警

Linux内核inotify联动端侧模型:实现敏感配置文件变动的毫秒级语义差分告警

运维堡垒机与核心边缘节点上,/etc/pam.d/、/etc/sudoers 以及各类服务的核心配置文件始终是攻防对抗的最前线。传统的内核审计大多仰仗 auditd 规则或轻量级的 inotify 机制。当文件发生写入关闭事件(IN_CLOSE_WRITE)时,工具通常会…

2026/10/13 16:19:32 阅读更多 →
易语言视频转文本源码解析:从取帧到字幕文本的完整实现

易语言视频转文本源码解析:从取帧到字幕文本的完整实现

简介:面向易语言开发者的视频转文本功能实现源码,定位在图形图像与多媒体处理场景,适合对OCR、语音识别及中文编程感兴趣的初中级学员。压缩包共三个文件,大小约6.3MB,包含易语言主程序源文件(.e)、演示动画(.swf)和HT…

2026/10/13 16:19:32 阅读更多 →
易语言 esqlite3 V1.1 源码升级:多线程事务锁与加密数据库实战

易语言 esqlite3 V1.1 源码升级:多线程事务锁与加密数据库实战

简介:本资源为 sqlite3 易语言支持库与模块的 esqlite3 V1.1 版本,面向使用易语言进行数据库开发的中高级开发者,重点解决多线程环境下 SQLite 操作的稳定性与功能扩展问题。相比 1.0,本次更新新增了 S3 互斥体进入/退出、S3 聚合…

2026/10/13 16:19:32 阅读更多 →
WeTTY 源码安装与开发环境搭建:从 git clone 到热重载开发服务器

WeTTY 源码安装与开发环境搭建:从 git clone 到热重载开发服务器

后端开发工具运维 【免费下载链接】wetty Terminal in browser over http/https. (Ajaxterm/Anyterm alternative, but much better) 项目地址: https://gitcode.com/gh_mirrors/we/wetty 点击查看 免费下载 本文是基于 docs/development.md 展开的源码级开发指南&…

2026/10/13 16:19:32 阅读更多 →
交互式 ER 图 + Schema 差异对比 + 迁移SQL生成:LibreDB Studio 数据库设计工作流完整实操

交互式 ER 图 + Schema 差异对比 + 迁移SQL生成:LibreDB Studio 数据库设计工作流完整实操

【免费下载链接】libredb-studio One browser tab for PostgreSQL, MySQL, Oracle, SQL Server, MongoDB, Redis, SQLite, Couchbase, ClickHouse, Druid, DuckDB, Turso and more. An open-source SQL IDE with SSO, audit trail and AI-assisted queries MIT licensed, with …

2026/10/13 16:18:31 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →