- 论坛徽章:
- 0
|
本帖最后由 armips 于 2011-01-14 10:05 编辑
感谢 二楼的回复 grep命令还真狠:
grep -R 'Memory' ./linux-2.6.36 | grep 'reserved' > mygrep.txt
.....
./linux-2.6.36/arch/arm/mm/init.c: printk(KERN_NOTICE "Memory: %luk/%luk available, %luk reserved, %luK highmem\n",
.....
void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)
{
int i;
memblock_init();
for (i = 0; i < mi->nr_banks; i++)
memblock_add(mi->bank.start, mi->bank.size);
/* Register the kernel text, kernel data and initrd with memblock. */
#ifdef CONFIG_XIP_KERNEL
memblock_reserve(__pa(_data), _end - _data);
#else
memblock_reserve(__pa(_stext), _end - _stext);
#endif
#ifdef CONFIG_BLK_DEV_INITRD
if (phys_initrd_size) {
memblock_reserve(phys_initrd_start, phys_initrd_size);
/* Now convert initrd to virtual addresses */
initrd_start = __phys_to_virt(phys_initrd_start);
initrd_end = initrd_start + phys_initrd_size;
}
#endif
arm_mm_memblock_reserve();
/* reserve any platform specific memblock areas */
if (mdesc->reserve)
mdesc->reserve();
memblock_analyze();
memblock_dump_all();
}
这个函数保留了内存, 包括linux内核占用的代码数据段空间, initrd占用的空间 以及一些平台相关的内存
系统启动打印信息:
Memory: 16MB = 16MB total
Memory: 12920k/12920k available, 3464k reserved, 0K highmemVirtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc1800000 - 0xf4000000 ( 808 MB)
lowmem : 0xc0000000 - 0xc1000000 ( 16 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.init : 0xc0008000 - 0xc0021000 ( 100 kB) ---->(系统启动过程中 以__init宏标识的函数占用的空间 被vmlinux.lds标识为 __init_begin __init_end 启动init进程前被释放掉 :Freeing init memory: 100K)
.text : 0xc0021000 - 0xc02fa000 (2916 kB)
.data : 0xc0310000 - 0xc03292a0 ( 101 kB)
保留内存3464K中 linux内核占用了100+2916+101=3117K
加上boot的时候参数等平台空间占用32K = 3149K
其它还差3464-3149=315K 没有着落
其它还包括影射的向量表4K
还有可能是系统管理内存的页表占用空间等其它的占用
系统启动成功后 Freeing init memory: 100K
所以用free命令看会多了100K
而free命令中看到的used基本是缓存 buffer占用的,为了提高i/o速度的缓存,很多都并非真正应用
在我应用中去试图malloc更多的内存的时候 used中很多都能被malloc出来的. |
|