本文共 4219 字,大约阅读时间需要 14 分钟。
初始化sdram将 kernel 搬运到 sdramkernel 启动时就不会 再去初始化 sdram ,而是直接使用.kernel 怎么使用内存? 什么接口 ? 直接用地址线传送地址,然后用数据线进行数据的获取
void setup_memory_tags(void) { params->hdr.tag = ATAG_MEM; params->hdr.size = tag_size (tag_mem32); params->u.mem.start = 0x30000000; params->u.mem.size = 64*1024*1024; params = tag_next (params); }
setup_commandline_tag("mem=64M");void setup_commandline_tag(char *cmdline) { int len = strlen(cmdline) + 1; params->hdr.tag = ATAG_CMDLINE; params->hdr.size = (sizeof (struct tag_header) + len + 3) >> 2; strcpy (params->u.cmdline.cmdline, cmdline); params = tag_next (params); }
内核在启动阶段,会两次去解析从uboot传递过来的关于内存的信息parse_tags parse_tag_mem32 // 解析 uboot 做的事情,解析 内存初始地址和长度parse_cmdline early_mem // 解析 mem= ,解析 内存长度. 初始地址由 宏PHYS_OFFSET 定义可见, u-boot 做的这个事情 1 和 2 在 kernel 看来是一件事情. 就是解析 可用内存的初始地址和长度.并在kernel 看来 ,如果存在 mem= , 则 mem= 的设置生效,setup_memory_tags 无效,即 setup_memory_tags 被覆盖
前提为uboot 设置了 setup_commandline_tag(“mem=512M”); 524288KB
mem_init
// mm_init->mem_init->mem_init_print_info 打出来的Memory: 505140K/524288K available (11523K kernel code, 229K rwdata, 1820K rodata, 548K init, 187K bss, 19148K(524288K-505140K) reserved, 0K cma-reserved, 0K highmem)// mm_init->mem_init 打出来的Virtual kernel memory layout: // 下面的打印 为 虚拟内存,跟物理内存有出入 vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xffc00000 - 0xfff00000 (3072 kB) vmalloc : 0xe0800000 - 0xff000000 ( 488 MB) lowmem : 0xc0000000 - 0xe0000000 ( 512 MB) pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB) modules : 0xbf000000 - 0xbfe00000 ( 14 MB) .text : 0xc0008000 - 0xc0d10240 (13345 kB) .init : 0xc0d11000 - 0xc0d9a000 ( 548 kB) // 这个在启动后期会被free 掉 .data : 0xc0d9a000 - 0xc0dd3408 ( 230 kB) .bss : 0xc0dd3408 - 0xc0e021d8 ( 188 kB)// mm_init->kmem_cache_init 打出来的SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1解析:512 MB 是 524288KB , 19148K 内存(其中有11523K kernel code, 229K rwdata, 1820K rodata, 548K init, 187K bss,和其他4841KB) 被保留了所以 剩下只有 524288KB - 19148K = 505140KB 被内核管理
Freeing unused kernel memory: 548K (c0d11000 - c0d9a000)这时 505140K + 548K = 505688K此时 19148K 中的 548KB 被 释放到 内核可管理内存中.
cat /proc/cmdline mem=512M// (proc.txt)MemTotal: Total usable ram (i.e. physical ram minus a few reserved bits and the kernel binary code)cat /proc/meminfo MemTotal: 505688 kB# topMem: 12724K used, 492964K free, 0K shrd, 108K buff, 2824K cached12708 + 492980 = 505688# free total used free shared buff/cache availableMem: 505688 9792 492964 0 2932 491848Swap: 0 0 0
本来有 512MB(524288KB) 内存 ,可是 启动完毕,只有 505688 KB 被内核管理,也就是用户和驱动或其他模块可以申请的内存比实际物理内存小一些,小了18600KB (18.1640625MB)最直观的的就是通过/proc/meminfo查看MemTotal,实际上可能远小于RAM物理大小。这里有个明显的分界点:在free_initmem()之后,MemTotal也即totalram_pages就固定在一个值。这也是Linux可以支配的内存,这之外的内存称之为内存黑洞。MemTotal之外的内存黑洞主要包括以下内容:内核代码段(不包括代码段中的init段)dtb占用内存dtb中reserved-memory段(不包括CMA部分部分)系统共用部分(待分析)
转载地址:http://qligi.baihongyu.com/