Linux内核是如何知道物理内存大小的?
在嵌入式系统中物理内存的实际大小是由bootloader传递给内核的,bootloader传递给内核的内存大小值是由开发人员根据内存的实际大小配置的,有改动就需要重新编译,而且并不是所有的物理内存内核都能用,有相当一部分内存会留给私有模块(像camera、gpu等),这些内存内核自身访问不到。
uboot相关的linux内存配置:
(E)early_mem
该函数用于处理bootargs中的"mem=size@start".参数
如果没有定义mem起始地址, 使用PHYS_OFFSET ,这个参数是由具体的开发板定义的,在611中,在arch\unicore\mach-sep0611\include\mach\memory.h中定义的。
#definePHYS_OFFSET UL(0x40000000)
通过unicore_add_memory(start, size);函数将一段连续的内存空间添加到struct meminfo meminfo中去。对于ramdisk的处理也比较简单,在此不详解了。
(F)paging_init(\arch\unicore-linux\mm\mmu.c)这个函数比较大,下面分布介绍(关于内存的启动部分,推荐去看一个网友的博客http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=72836)。
(1)sanity_check_meminfo用于检测内存的虚拟地址(线性映射)是否超过了VMALLOC_MIN的地址(如果内存太大,可能会这样)。如果内存太大的话,那么就重新计算内存的可用大小。显然这时候一部分内存就不可以使用了或者一分为二(一部分给系统正常使用,一部分划给highmem)。内核为VMALLOC和initrd保留了128M的空间,那么内核可使用的最大空间只有1G-128M=896M。