linux内核使用段页式存储流程

首先,8086一开始是地址总线是20位,而寄存器只有16位,因此采用了两个16位数字错位相加的方式,完成了采用16位寄存器控制20位地址总线的目的,为何地址总线大?因为想要控制更多的内存空间。

那么8086是没有保护机制的,那些负责作为基地址的段寄存器,也是可以修改的,那么用户就可以访问到内存地址的任何空间。
为了达到能够在地址转换的过程中检查权限,并且把每个段设置固定的长度这个功能,采用16位寄存器显然就不够了,在演进的过程中,80386已经将寄存器和地址总线都实现了32位的功能。然后为了向上兼容,16位的寄存器仍然要保留,那么这些段寄存器就更不可能作为任何一个地址,无论是基地址还是偏移量了。
因此16位寄存器发生了变化,简单来说变为了一个内存中全局数组的下标。用寄存器作为下标找到相应的全局变量,然后取到根据全局变量中数据结构,这个数据结构中有基地址,有段长度,有权限校验位。校验通过之后,用基地址加上数据总线上的地址,得到物理地址。

具体来说,80386继承8086留下4个段寄存器,意图将整个物理空间划分为用户代码空间,用户数据空间,内核代码空间,内核数据空间。当一个数据总线带着逻辑地址来的时候,它经历的流程是这样的:

在这里插入图片描述

对于linux内核来说,GDT中所有的段表描述符中的段起始地址都是0,长度均为0到4G,因此对于linux来说,段式转换没有任何变化,就是把一个32位原封不动的拿过来用,再使用自己的页式存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值