内核学习之内存寻址(一)

本文深入解析内存地址的概念,包括逻辑地址、线性地址和物理地址的区别。解释了如何通过段描述符实现逻辑地址到线性地址的转换,并介绍了硬件如何进行分页处理,将线性地址映射为物理地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存地址

逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址,它由一个段和偏移量组成,偏移量指明了从端开始的地方到实际地址的距离

线性地址:表示高达4GB的地址(32位)

物理地址:用于内存芯片级内存单元寻址

分段

端选择符和段寄存器

逻辑地址(48位)由段选择符(16位)和偏移量(32位)组成


T1:0表示GDT,1表示LDT

段寄存器(16位):用来存储段选择符,由于段描述符为8字节,因此,索引号只需要13字节即可

cs:代码段寄存器,指向包含程序指令的段。它包含两位的字段:CPL:0表示内核态,3表示用户态

ss:栈段寄存器,指向包含当前程序栈的段

ds:数据寄存器,指向包含静态数据和全局数据的段

段描述符

它有8字节组成,表示段的特征,它放在全局描述符表(GDT,它的地址和大小存储在gdtr)和局部描述符表(LDT,它的地址和大小存储在ldtr),它主要的内容是基地址(32位)和偏移量(20位)组成。

分段单元:


1.根据T1字段,选择GDTR或LDTR作为基地址的寄存器

2.通过上面所述的基地址+index字段的值*8得到描述符的地址

3.通过描述符的基地址加偏移就得到线性地址

除linux的80x86,所有段(用户代码段、内核代码段、用户数据段、内核数据的)都是从0x0开始的,因此逻辑地址偏移量就是线性地址。

硬件中分页

分页单元把线性地址转为物理地址,线性地址被分为以固定长度为单位的组,称为页,页内部连续线性地址被转为连续的物理地址。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值