计算机中三类地址
- 逻辑地址:汇编指令中使用的地址(一般为 段:偏移量 形式)
- 线性地址:32位无符号整型,地址转换的中间量
- 物理地址:cpu通过针脚输出到地址总线上的地址,并不是物理内存地址。
三者之间的地址转换完全由硬件电路实现,叫做memory managerment unit,内存管理单元。
段选择子和段寄存器
逻辑地址由两部分组成:段选择子(16位) + 偏移量(32位)
段选择子里面有三部分信息:段索引(13位) + TI(1位) + RPL(2位)
段索引可以理解为【段描述符表】数组的下标,它可以表示0,1,2,3,...,2^13-1个索引——0 0000 0000 0000~1 1111 1111 1111(2^13-1)
TI指定了【GDT】还是【LDT】
段寄存器是专门用来存储【段选择子】的寄存器,共6个cs, ss, ds, es, fs, gs(全部是16位)RPL指名【用户态】还是【内核态】
段描述符(64位=8字节)
上面提到了【段表述符表】数组,这个数组里面的元素就是【段描述符】
段描述符结构中的域(field)
base(32位):指明该段在【线性地址】中的【基地址】
G(1位):颗粒度,按【1字节】或者按【4KB】(4KB = 4096bytes)
Limit(20位):段限制,【颗粒度】 x 【段限制】 = 段长度
如果G=0,段长度范围为:1字节 x (0 ~ 2^20) = 1byte ~ 1MB
如果G=1,段长度范围为:4KB x (0 ~ 2^20) = 4KB ~ 4GB
S(1位):系统段标志,S=0表示该段是【系统段】,S=1表示该段是【数据段】或【代码段】
Type(4位):指出该段的类型和访问权限
数据段描述符
代码段描述符
Type=11 or 9,任务状态段
本地描述符表描述符
DPL(2位):描述符特权级。暂时不详~
P(1位):段存在标志。P=0表示段没有存储在当前内存中,linux内核总是设置P=1,因为内核从来不把整个段从内存交换给磁盘。
D or B(1位):当段偏移量位32位时,设置为1。当段偏移量位16位时,设置为0。
AVL(1位):被Linux内核忽略。
第53位(1位):常为0。