在剖析明天的内容之前,我们先来看出自的一位前辈做的显存管理图,真心钦佩高手。虽然这张图可以分为两个部份,一部份是地址映射,另一部份就是显存分配。
所以明天我们会剖析到以下内容:
1.Linux地址映射
2.Linux显存分配
lLinux地址映射
下边的剖析我们根据上图进行剖析,首先我们来看其最左边的地址分布图(其实这是虚拟空间)。其地址分布总的可以分为两个部份我们下边渐渐剖析(基于32位处理器)。
1.用户空间(0~3G)
a)空间简介
其从0x00000000到0xBFFFFFFF共3GB的线性地址空间,每位进程都有一个独立的3GB用户空间,其实这是虚拟的空间。
b)怎样转换为化学空间
这一部份虚拟空间到数学空间的转换方式是我们曾经在一文中剖析过的MMU地址转换。
2.内核空间(3~4G)
其从0xCxC0000000到0xFFFFFFFF共1GB大小,内核空间又可以按照映射方法的不同分为下边四块linux内核空间访问用户空间,我们一一剖析
a)内核逻辑地址空间
l空间简介
其从0xCxC0000000到high_memory(图中896MB的地方)最大为896MB(也就是说这块空间有可能不满linux内核空间访问用户空间,但最大为896MB),其实是虚拟空间。
注:在此注意一下896MB我们一会在剖析。
l怎样转换为化学空间
这一部份虚拟地址与数学显存中对应的地址只差一个固定偏斜量(3G),倘若显存化学地址空间从0x00000000地址编址,这么这个固定偏斜量就是PAGE_OFFSET(如上图)。
b)Vmalloc空间
l空间简介
其地址没有严格的界限,这段空间既可以访问到我们的高档显存,也可以访问到高端显存。(高档和高端一会解释)
l怎样转换为化学空间
不是通过简单的线性关系映射,在此不研究。
c)永久内核映射
l空间简介
其固定拿来访问高档显存。
l怎样转换为化学空间
不是通过简单的线性关系映射,在此不研究。
d)固定映射
l空间简介
其在系统初始化期间永久映射I/O地址空间,或则特殊的寄存器。
3.遗留知识
在刚刚我们上面的剖析中我们留下了一些问题下边进行解释。
a)高端显存
内核逻辑地址空间所映射的数学显存就是高端显存(实际化学显存的大小,并且大于896MB)
b)高档显存
高端显存地址之上的数学显存是高档显存(化学显存896MB之上)。
c)896MB由来
Linux将显存分为内核空间和用户空间linux社区,其中内核空间中的0xC0000000~high_memory部份拿来映射数学显存linux系统装win7,并且我们还须要映射I/O空间和固定的寄存器,所以留出了high_memory~0xFFFFFFFF之间的地址来映射I/O空间和固定的寄存器,而在X86平台依据经验设定了这个high_memory为896MB。
lLinux显存分配
通过前面的介绍我们对linux对显存的管理,以及地址的映射有了一个了解,下边我们来剖析linux是怎样进行显存分配的。
通过上图我们可以剖析出显存的分配过程
1.由malloc、fork等系统调用和kmalloc、vmalloc申请得到虚拟显存。
2.在我们使用该显存的时侯,形成请页异常(kmalloc除外)
3.从空闲的页框分配化学显存,和虚拟地址构建映射。
注:kmalloc申请空间是不用经过请页异常的,返回的虚拟地址早已对应了数学显存。Kmalloc可以分配到连续的数学显存,vmalloc分配的是非连续的数学显存。