linux的内核分段图,Linux内核之内存分段管理

前不久求职Linux嵌入式开发没成功,在自尊心的趋势下,我决定利用工作之余要搞定Linux,起码得看起来像个大牛,恩就是这样

a4c26d1e5885305701be709a3d33442f.png

最近在看《深入理解Linux内核》,作为整理复习,和看得见的小成果,从今天开始记录整个学习过程,也和正在学习Linux的各位分享。

第一部分是内存管理,Linux内存管理分为分段和分页管理两部分,我们先将逻辑地址通过分段成为线性地址,再通过分页将线性地址映射到物理地址,在linux中我们把逻辑和线性地址看做虚拟地址就可以了,先来说分段。

为什么要分段?早先内存并不需要分段,一直到硬件上实现地址线扩增到20根,但数据线还停留在16根,这样就致使了16位的指针并不能完整的表示出20位的内存空间,指针只能表示0-0xFFFF,而真正内存却0xFFFFF之多,因此硬件上加入了段寄存器来实现数据位的扩增,因为暂时看来不必纠结具体的实现具体的实现方式,这里就不多说了,将其左移4位加些偏移就是20位的地址了,完全在于先人的想法,也可能有高深的玄机。

如何分段?硬件上添加了6个段寄存器,CS代码段寄存器(code segment),DS数据段(data)

ss栈段寄存器(stack),其他3个可以作为任意的数据段,同时SS也是由DS实现的。

段寄存器中存放的是什么呢?一个16位长的段选择符,具体的16位拆分后的各个位代表什么,后面会作解释,先介绍段选择符是用来干什么的。它是用来确定一个段描述符的,什么是段描述符?简单来说段描述符里存放了地址,用来确定线性地址用的。一个段描述符有8个字节,它被存放于段描述符表中,你可以想象一个数组,每个元素有8个字节,有很多这样的元素。段描述符表又分为全局GDT(global

descriptor

table)和局部LDT(local)两种,传说我们暂时掌握全局的就可以了。如何找到这两张表?数组怎么寻找元素?只要给出它的首地址就可以了,所以,有两个寄存器GDTR,LDTR专门存放他们的首地址。知道了首地址怎么确定数组中的元素?找下标。下标就在段寄存器中存放的段选择符里。我们来拆分一下这16位。

a4c26d1e5885305701be709a3d33442f.png

第1,2两位用来作权限位,linux只有0(内核态)和3(用户态)两个值,0权限最高,它的作用是当用户访问内存时用来判断他有没有权利。

第3位用来确定要去哪个段描述符表中找:0为GDT,1为LDT。

最后13位就是下标索引号:加入GDT首地址为0x20000000,index为3,那么这个段描述符的确切地址的计算方式为0x20000000+3*(8个字节)=0x20000018.前面说过一个段描述符为8个字节。

到这里整理一下:linux内核维护了两个8字节结构体的数组(单CPU下),即LDT和GDT,他们存放着段描述符,并且首地址存放在LDTR和GDTR中,我们通过段寄存器中的段选择符来确定段描述符。剩下的就是段描述符的内容了。

段描述符中我能理解的字段有:

base:线性基地址(一个线性地址是基地址+偏移得到的)

G:段大小表示为1字节倍数,4096字节倍数两种

Limit:段便宜量,决定段大小

S:系统和非系统段标志(系统段内核态才可用)

TYPE:段类型,和权限(cs,ds..多了个任务状态段TSSD:task state

segment,之后会学习到,和进程切换有关)

DPL:0,3 内核用户态权限

P:在内存中否,一定在

D,B:标记偏移地址32位还是16位

Linux中的分段管理:分段其实是X86上才需要的,ARM下分页就可以了,考虑到多平台可移植性,Linux内核对分段作了特殊处理。Linux的GDT中有这样几个段描述符:

__KERNEL_CODE:内核代码段

__KERNEL_DATA:内核数据段

__USER_CODE:用户代码段

__USER_DATA:内核数据段

TSS:任务状态段

LDT:局部段描述符表

3个TSL:局部线程存储段,还不理解

double fault TSS:能够处理双重异常,不理解,这个太刁。

剩下几个电源管理之类的不能理解,学到了再深入,扩散开去会出人命的。

分段暂时先这样吧,深入还需水平~~有错望纠正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值