kernel中如何读取内存的大小和地址

目录

    • 目录
    • 内存信息的传递方式
      • 什么是DDR
      • 内存信息的传递
    • 代码阅览
      • 文件列表
      • 代码块

本文中所有的描述都是基于高通平台,并且涉及的所有的操作都是在手机上完成

内存信息的传递方式

什么是DDR

  
  本文并不对DDR具体的物理特性做详细解读, 我们只需要了解如下的一些基本概念, 就能够满足对本文描述的核心内容的理解的需求.
  1. 和LCD, TP等常规器件一样, DDR也是手机中必不可少的器件之一
  2. 我们平时常说的内存, 从目前大部分机器来看, 指的就是DDR, 只不过对于这种需要重点考虑功耗的产品来说, 我们加了LP(low power低功耗)的DDR前面, 也就是LPDDR.
  3. 全称Double Rate Synchronous Dynamic Random Access Memory, wiki翻译过来就是双倍数据率同步动态随机存取存储器.
  4. 就一般意义来说所有的程序软件必须依靠内存才能运行, 此器件非常重要!

内存信息的传递

  就像上面所述, 内存虽然必不可少, 但归根结底就是一种手机器件, 和其他器件一样, 同样需要初始化, 只不过比其他的器件初始早而已.
  就高通平台而言, 如下图所示, 内存信息的传递如下:

Created with Raphaël 2.1.0 开始 内存初始化(sbl) lk中读取信息修改dt kernel中读取dt信息,读取内存大小和地址 结束
  • 在内存没有初始化完成前, 内存是不能使用的, 这时候系统的启动程序运行在片上RAM中, 而此时的启动过程在高通平台我们称之为sbl阶段. DDR器件就是在这一阶段中完成的初始化.

  • 在初始化完成后, 内存的信息存储在共享内存(从内存中单独划分一块作为SMEM)中, 以供lk使用. 在sbl结束后, 会将lk的image从EMMC(对比PC可以理解为硬盘) 加载到内存中运行, 然后lk通过共享内存来读取器件信息.

  • 读取出了信息后, 在lk中, 需要对device tree (dt image中的数据) 进行修改, 因为当前的高通平台lk和kernel的沟通不再是atags, 而变成了device tree.

  • lk结束运行后, 系统启动到了kernel, kernel再通过读取device tree的信息将内存的信息读取出来进行管理.

代码阅览

文件列表

  下面的表, 按照顺序从lk更新dt, 到kernel读取dt列出了相应的代码实现文件和函数.
  

顺序 阶段 文件名 函数名
1 lk aboot.c boot_linux
2 lk dev_tree.c update_device_tree
3 lk meminfo.c target_dev_tree_mem
4 lk dev_tree.c dev_tree_add_mem_info
5 kernel setup.c setup_arch
6 kernel setup.c setup_machine_fdt
7 kernel fdt.c early_init_dt_scan
8 kernel fdt.c early_init_dt_scan_memory

代码块

  下面的两块代码实际上是两部分, 一部分是lk中修改dt, 一部分是kernel中读取dt: (下面的代码是经过精简的, 只反映了程序运行的流程)

  • lk中修改dt

    信息安全代码略 见上表 4

  • kernel中读取dt信息

    信息安全代码略 见上表 7

你可能感兴趣的:(老黑看内核)