博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存 (一) linux 内存
阅读量:4285 次
发布时间:2019-05-27

本文共 4219 字,大约阅读时间需要 14 分钟。

u-boot 对 内核 启动时 内存相关 造成的影响

  • u-boot 做的事情 0
初始化sdram将 kernel 搬运到 sdramkernel 启动时就不会 再去初始化 sdram ,而是直接使用.kernel 怎么使用内存? 什么接口 ? 直接用地址线传送地址,然后用数据线进行数据的获取
  • uboot 做的事情1
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); }
  • uboot 做的事情2
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做的事情
内核在启动阶段,会两次去解析从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 = 505140‬KB 被内核管理
  • 系统启动最后一步,此时还未完成启动 free_initmem();
Freeing unused kernel memory: 548K (c0d11000 - c0d9a000)这时 505140K + 548K = 505688‬K此时 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/

你可能感兴趣的文章
横竖屏切换的生命周期
查看>>
广播的使用
查看>>
Python Requests库
查看>>
下载离线 Visual Studio 离线安装包
查看>>
Makefile Project 中 MSBuild MSB3073 error 不能正确检测字符串 “error:"
查看>>
Error Code 0x800F081F when Installing .NET Framework 3.5
查看>>
Xamarin.Forms.Xaml.XamlParseException: No embeddedresource found for
查看>>
如何 禁掉 Hyper-V && 如何解决禁不掉 Hyper-V 的问题
查看>>
杂记 7/30
查看>>
杂记 7/31
查看>>
了解 内核、操作系统 的一些链接
查看>>
Linux 学习笔记 (九) 软件安装
查看>>
Linux 学习笔记 (十) shell 脚本初探
查看>>
关于移动开发的一些思考
查看>>
Java 进阶 -- final 解析
查看>>
VS 2013 Professional 安装问题
查看>>
Xamarin.Forms.Xaml.XamlParseException: No embeddedresource found for
查看>>
error: Mono.Android could not be found
查看>>
使用 RDCMan
查看>>
Xamarin 实现 Button LongClick 和 Touch
查看>>