linux内核-内存地址

计算机中三类地址

  • 逻辑地址:汇编指令中使用的地址(一般为 段:偏移量 形式)
  • 线性地址: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】

RPL指名【用户态】还是【内核态】

段寄存器是专门用来存储【段选择子】的寄存器,共6个cs, ss, ds, es, fs, gs(全部是16位)


段描述符(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。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值