linux内存管理理解

前言废话:
linux内存管理涉及的原理知识太多了,也是学习linux系统软硬件绕不开的部分,笔者水平有限,只能随心列出一点点理解,希望能帮助到众多学习linux的技术人员。

我们知道处理器core序列化执行指令,第一步是读指令,从哪里读呢,当然是支持随机访问的ram存储器(norflash也可以,这里不说)。
当然啦,要读ram,就需要一个叫做地址的东西去规定从ram的哪一个单元去读,这里拿32位core总线来举例简单说明硬件原理,从硬件上说就是在某几个时钟周期内给这32位地址总线上加上不一样的电平,比如这32位地址线的状态是10000000 00000000 00000000 00000000,就代表要操作第0x80000000的存储单元,然后再给用电平逻辑告诉ram是要读,然后就用数据总线输出这个单元的数据。

处理器core执行指令干嘛呢?当然是处理数据,对于cpu而言,直接的数据来源可能是ram,也可能是某外设(统一编地址独立编址,这里不说),都是需要一个地址来表征要操作哪个单元。
综上所述,地址很重要。
正题:

1.三类地址:逻辑地址 虚拟地址 物理地址

物理地址:当存储器与cpucore总线接好之后,每一个存储单元的地址在特定的配置下是唯一的,不变的,每个存储单元都有一个地址,这个地址就是物理地址。

逻辑、虚拟地址:linux系统中,虚拟地址是理论地址,是理论上能操作的地址,有一个范围,比如32位系统,就是0~0xffffffff,并且在linux系统中,逻辑地址与虚拟地址一致,举例,逻辑地址的0x88888888就是虚拟地址的0x88888888,可这个逻辑、虚拟的0x88888888可不一定对应到物理地址的0x88888888,可能一会是0x02019888一会是0x12019888,linux内存管理的魅力就在这里。那干脆一个名字不行么,不行,逻辑地址只是说和虚拟地址在linux系统中一致,他它两在概念上差别可大了,这里我们不多说。

一个现实的问题是,不是所有使用32位core的系统都要配全4G地址的存储和设备,在linux早期很多系统只有几百k 大小的ram,那虚拟地址和物理地址一定要产生某些联系才行,我们接下来就来看看linux下这个逻辑、虚拟地址以下简称是怎样与物理地址产生关联的。

2.MMU
MMU是一个与core相连的模块,其功能就是是把虚拟地址转化成物理地址,我们搞个图来看看:
在这里插入图片描述
图相当明显了,功能上没什么好说的。但具体到这个模块是怎么工作的,怎么配置的,那就有的说了,再搞张图来看看:
在这里插入图片描述
上图是个两级mmu的映射表示,20-31 共12bits一级,对应为4096个项,第二级12-19共8bits共256项,最后0-11共12bits是OFFSET。
举例:给一个虚拟地址1000 0000 0001 0001 0002 0000 0000 0101对应的物理地址是啥呢,我们就要去查表,首先查20-31bit 一级映射1000 0000 0001对应的物理地址的低20-31bit表的第1000 0000 0001项里面的内容是0000 0000 0000 ,物理地址12bits就有了,以此类推,二级0001 0002项的内容是0000 0000则物理地址的中间8bit就有了,然后最后再来个0000 0000 0101的OFFSET,整个物理地址就出来了:0000 0000 0000 0000 0000 0000 0000 0101,是不是与原来的虚拟地址比只剩一个OFFSET是一直的的了,并且值小了许多。linux虚拟地址0-4G而实际运行在物理内存只有几百M的的系统上的原因了。

拓展:现在有6G内存,12G内存是如何处理的呢?
----用64bit的core。

3.三个数据集:页目录DIRECTORY,页表TABLE,偏移量OFFSET
32位系统中,
页目录:1024项,每项32位,每项大小范围二进制10bits即0~1023也即1024个项,每项里面的内容是啥呢?是物理内存中一个页表的地址。这里的1024不准确,不同体系的cpu可能不一样,arm会有4096项,甚至将来的8192项等等。

盗个图来看看:

图中只能是示意图,是intel X86 32位的情景下的图,读者可能会发现,与上面的mmu映射有点像哦.
未完待续

猜你喜欢

转载自blog.csdn.net/niubichen16/article/details/88847572