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寄存器的地址上,从而绕过了段映射

推荐阅读更多精彩内容