linux内核32位如何绕过段映射

段映射

如上图所以 x86处理器有一个GDTR寄存器,存放段描述符表的物理地址 ,在保护模式下,CS DS 等段寄存器的地址会被mmu解释成指向段描述符表项的索引,段寄存器中高13位用于指向段描述符表中的下表,而TI1位表示该表象在ldtr还是gdtr中,linux内核中并未使用ldtr(不严禁的说法),RPL位则表示该段的特权级别(操作系统的四个环)

内核在初始化和加载程序的时候会将cs ds等寄存技赋初值,我们来看下他们的初值 如下表:

段寄存器初始值

根据段描述符表和段寄存器中的内容可以找到相应的段描述符,从图中来看,kernel cs ds分别占用描述符表中第3,第4项,user cs ds占用5,6项

对于段描述符的解释如下

段描述符项

从图中可以看到所有的段都是从0开始,长度为4G,所以线性地址和物理地址是重合的,cpu寻址则指落在了ip寄存器的地址上,从而绕过了段映射

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容