码迷,mamicode.com
首页 > 系统相关 > 详细

《linux 内核完全剖析》 笔记 由逻辑地址转换成线性地址代码分析

时间:2014-04-29 13:42:20      阅读:546      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   数据   2014   

一开始由这段代码引发的纠结

get_base(current->ldt[1])

下面是各个相关的代码,摘自不同的header files。。。

current是指向当前task的指针


struct desc_struct ldt[3];


struct desc_struct {
unsigned long a,b;
} ;



#define _get_base(addr) ({unsigned long __base; __asm__("movb %3,%%dh\n\t" "movb %2,%%dl\n\t" "shll $16,%%edx\n\t" "movw %1,%%dx" :"=d" (__base) :"m" (*((addr)+2)), "m" (*((addr)+4)), "m" (*((addr)+7))); __base;})




#define get_base(ldt) _get_base( ((char *)&(ldt)) )



          事实证明(说的直接点就是代码看不懂),前面的8086保护模式编程是相当重要的,是理论基础。我现在越来越理解汤老师的话,只有坚实的理论基础,才能更好的实践。


不复习分页保护模式,这段代码是看不懂的,而且一开始我特别纠结

 :"m" (*((addr)+2)),  "m" (*((addr)+4)),  "m" (*((addr)+7))); \


为什么取addr的偏移量偏偏就是2 4 7 



通过ldt(locale descriptor table)可以找到它映射的物理地址空间。


struct desc_struct {
unsigned long a,b;
} ;


这个结构体里面的 a b 是unsigned long类型,8 byte长, 32位

对应的是段描述符, 贴图吧。。


mamicode.com,码迷



ldt[1],是代码段,ldt[2]数据段,ldt[0]为空,至于为什么,现在。。。我也布吉岛。。。

get_base传参的方式有点技巧,他传递了ldt的地址

然而这里的ldt其实是一个指针current->ldt[1] ,于是这里的addr是一个指针,这个对于理解为什么addr偏移2 4 7“至关重要”。。。

#define get_base(ldt) _get_base( ((char *)&(ldt)) )



但是我觉得赵炯博士的解释说明图和具体代码对应的时候,是有点问题的。


我纠结了很久这里的addr+2 addr+4 addr+7究竟指向哪儿了。

事实上

addr+2是指向那个有16位长度的base address的(0-15)

addr+4是指向那个有最右边的8位base address(16-23)

addr+7是指向那个最左边的8为base address的(24-31)



数据段描述符是对应结构体

struct desc_struct {
unsigned long a,b;
} ;


那么这里的a 对应的应该是下面的那个32位长度描述符

b对应的应该是上面那个32位长度的描述符,这样一来,图片这样说明可能更好

mamicode.com,码迷mamicode.com,码迷


mamicode.com,码迷



这样说明才能对应结构体a b在内存地址中的状态



#define _get_base(addr) ({unsigned long __base; __asm__("movb %3,%%dh\n\t" "movb %2,%%dl\n\t" "shll $16,%%edx\n\t" "movw %1,%%dx" :"=d" (__base) :"m" (*((addr)+2)),  "m" (*((addr)+4)),  "m" (*((addr)+7))); __base;})




这个获取基地址就很好解释了。

首先 取addr+4开始的8个位,置于寄存器%dl,取addr+7开始的8个位置于寄存器%dh

然后左移16位,把刚移入的16位数据(本来在寄存器中的低16位),移位到高16位

取addr+2开始的16位,置于寄存器%dx,也就是%edx的低16位。

这样edx就被填满了。是 segment base!




mamicode.com,码迷

《linux 内核完全剖析》 笔记 由逻辑地址转换成线性地址代码分析,码迷,mamicode.com

《linux 内核完全剖析》 笔记 由逻辑地址转换成线性地址代码分析

标签:des   style   blog   http   数据   2014   

原文地址:http://blog.csdn.net/cinmyheart/article/details/24688695

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!