内存划分概述

linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例) 对于嵌入式工程师了解芯片启动过程是十分有必要的,在分析、调试各种问题的时候都有可能涉及到这方面的知识。同时这部分知识也是比较复杂的,因为其中涉及到芯片内部架构,启动各个阶段软件代码执行顺序,启动模式等等。下面以比较常用的Qualcomm MSM8953芯片的启动过程为例,进行宏观分析(大部分翻译了高通的手册^-^),下一篇文章进行代码分析。 可以看到MSM8953中的处理器有5个,分 阅读详情
1)SBL阶段
AMSS/boot_images/build/ms/8953.target.builds
定义很多内存地址,比如SCL_SBL1_IMAGE_BASE等
AMSS/boot_images/build/ms/build_8937.sh
用$TOOLS_SCONS_ROOT/build/build.sh -f target.scons --tcfgf=8953.target.builds  $BUILD_CMD
加载上述内存地址的定义,并编译Image
AMSS/boot_images/build/ms/targlaasanaza.h
使用上述地址,再定义代码中使用的地址宏
AMSS/boot_images/core/boot/secboot3/hw/msm8953/boot_mmu_table.h
引用各个内存地址,创建const struct mem_block sbl_initial_memory_map[]数组、sbl1_addtional_memory_map[]数组、sbl1_rw_dep_mem_block、sbl1_code_dep_mem_block、sbl1_ddr_mem_block等内存块
AMSS/boot_images/core/boot/secboot3/hw/msm8953/sbl1/DDR_DEBUG_8953_ASIC.map等map和sym文件中定义了固定位置放置关键符号的内存地址,也包括上述这些
AMSS/boot_images/core/boot/secboot3/hw/msm8952/sbl1/sbl1_mc.c
对上述内存块进行了创建工作
注:SET TOOLS_SCONS_ROOT=%BUILD_ROOT%\tools\build\scons对于boot_images来说就是AMSS/boot_images/tools/build/scons
build/ms/build_8953.sh:export BUILD_CMD="BUILD_ID=$BUILD_ID BUILD_VER=$BUILD_VER MSM_ID=$MSM_ID HAL_PLATFORM=$HAL_PLATFORM TARGET_FAMILY=$TARGET_FAMILY BUILD_ASIC=$BUILD_ASIC CHIPSET=$CHIPSET  $IMAGES"


2)LK阶段
target/msm8953/rules.mk
MEMBASE := 0x8F600000 # SDRAM
MEMSIZE := 0x00400000 # 1MB
BASE_ADDR        := 0x80000000
SCRATCH_ADDR     := 0xA0100000
platform/msm8953/platform.c
static mmu_section_t mmu_section_table[] = {
/*           Physical addr,         Virtual addr,            Size (in MB),     Flags */
{    MEMBASE,               MEMBASE,                 (MEMSIZE / MB),   LK_MEMORY},
{    MSM_IOMAP_BASE,        MSM_IOMAP_BASE,          MSM_IOMAP_SIZE,   IOMAP_MEMORY},
{    APPS_SS_BASE,          APPS_SS_BASE,            APPS_SS_SIZE,      IOMAP_MEMORY},
{    MSM_SHARED_IMEM_BASE,  MSM_SHARED_IMEM_BASE,    1,                COMMON_MEMORY},
{    SCRATCH_ADDR,          SCRATCH_ADDR,            512,              SCRATCH_MEMORY},
{    MIPI_FB_ADDR,          MIPI_FB_ADDR,            20,                     COMMON_MEMORY},
{    RPMB_SND_RCV_BUF,      RPMB_SND_RCV_BUF,        RPMB_SND_RCV_BUF_SZ,    IOMAP_MEMORY},
};
kmain()->arch_early_init()(定义ARM_WITH_MMU宏时)->arm_mmu_init()(ENABLE_LPAE_SUPPORT宏定义时为mmu_lpae.c否则为mmu.c->platform_init_mmu_mappings()


3)内核
就是dtsi中的各个memory节点的定义
手把手教你用DCA1000EVM解析IWR6843毫米波雷达数据(附MATLAB代码) 本文提供了一份详尽的实战指南,手把手教你使用DCA1000EVM采集并解析TI毫米波雷达IWR6843的原始数据。内容涵盖硬件连接配置、mmWave Studio参数设置、LVDS数据流结构解析,并附有核心MATLAB代码,详细演示了从原始二进制文件到距离-速度谱的信号处理全链路,帮助开发者快速掌握数据解析与处理的关键步骤。 阅读详情

相关推荐

用STM32L552驱动AD9102:一个硬件工程师的实战避坑指南(附完整代码)

本文详细介绍了如何使用STM32L552微控制器驱动AD9102任意波形发生器芯片,从硬件设计到波形生成的完整实战指南。内容包括电源架构、时钟电路设计、输出调理电路等关键硬件设计要点,以及软件驱动架构、波形存储优化和典型波形生成实例。通过实战经验分享,帮助硬件工程师避开常见设计陷阱,提升开发效率。

weixin_30889885的博客 333

高通平台Android源码bootloader分析之sbl1(二)

在上一篇博文中主要描述了启动流程,及代码执行流程,并重点介绍了一下我重点关注的部分。这个sbl部分也算有点庞大,我们没有精力也没有必要去分析全部,所以接下来就来分析一下sbl1中另外几个需要格外关注的部分: CDT :主要提供平台设备数据 log system:log日志系统,当然没有kernel里面那么强大了 download:代码下载烧写实现 ramdump:异常信息dump 本篇博文就先来...

qq_36781842的博客 2953

C语言|深入浅出讲解int转换为float全过程(附2017年统考大题案例)

int转换为float类型为什么会发生精度损失? 精度损失的详细过程究竟是什么样的? 什么样情况float会发生精度损失?没有弄懂2017年浮点数统考大题? 这一篇用2017年统考大题案例帮你更深的理解浮点数的存储规则。

DADONGOOO的博客 1万+

高通android 源码,高通平台Android源码bootloader分析之sbl1(一)

/* Enable the secure watchdogThis is done after boot_dload_check that way if we are in the final stageof an abnormal reset boot_dload_check will finalize the stage. */boot_secure_watchdog_init,/* Load...

weixin_29065659的博客 458

手把手教你用DLP4500投影仪玩转结构光3D扫描(附固件烧录与序列设置避坑指南)

本文详细解析了如何使用DLP4500投影仪搭建结构光3D扫描系统,涵盖硬件组装、固件烧录、图案生成与优化等全流程。重点解决了固件烧录失败、图像格式错误等常见问题,并提供了实用的避坑指南和进阶技巧,帮助读者快速掌握DLP4500在3D扫描中的应用。

weixin_42662293的博客 301

PCL 法向量夹角剔除错误匹配点对【2026最新版】

实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 41万+

高通8917/8937 sbl 初始化流程(ddr部分1)

ddr初始化入口:BOOT.BF.3.3\boot_images\core\boot\secboot3\hw\msm8952\sbl1\sbl1_config.c中load_qsee_pre_procs[]函数指针数组,如下。1、boot_save_reset_register_log :在downloder模式下通过dumping寄存器来调试硬件重启过程。过程很简单,就是记录下寄存器的值到日志中...

qq_20789875的博客 2560

《QGIS快速入门与应用基础》223:纸张大小与方向(A4/A3/自定义)

本文详细介绍了QGIS布局页面设置的核心操作,重点讲解了纸张大小与方向的设置方法。文章首先指出页面设置是地图排版的基础前提,强调合理设置可避免导出打印时出现尺寸不符等问题。随后详细说明了三种打开页面设置面板的方式,并重点解析了纸张设置的要点:标准预设纸张(A4/A3等)适用于大多数场景,提供国内常用规格对照表;自定义纸张则需谨慎使用,需注意单位选择和尺寸限制。通过界面标注图和操作步骤示意图,帮助用户掌握正确的设置方法,确保最终出图符合规范要求。文章特别提醒新手要优先使用标准预设纸张,避免常见错误,为后续地图

LuckyHanMo的博客 346

高通8996启动流程-4. lk启动之boot_linux_from_mmc

1.前言 本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明。在lk正常启动时会进入boot_linux_from_mmc。 2. boot_linux_from_mmc boot_linux_from_mmc主要完成了bootimg读取到缓存,解压kernel,重定位kernel, ramdisk, dtb,并最终启动kernel,启动的同时会向kernel传递dtb地址,dtb的chosen保存了cmdl

HZero 1432

YTM32B1M SDK解析31:软件I2C驱动详解

YTM32B1M微控制器软件I2C驱动解析 本文详细介绍了YTM32B1M微控制器中通过GPIO引脚模拟I2C总线的软件实现方案。核心内容包括: 驱动架构:采用swi2c_config_t配置结构体和swi2c_state_t状态结构体管理I2C参数 功能接口:提供初始化、数据传输(主/从模式)、底层控制等API 应用示例:包含基本配置、EEPROM读写、传感器数据采集、总线扫描等典型应用场景 优化建议:给出引脚选择、时序配置、错误处理等方面的最佳实践 该驱动在硬件I2C资源不足时提供可靠替代方案,支持标准

VehSwHwDeveloper的博客 158

QEMU理解与分析系列(11):QEMU内存机制

在物理机上,CPU 对于内存的访问在保护模式下通过分段分页的形式实现。在该模式下,CPU 访问时使用的是虚拟地址,通过 MMU 映射到物理地址,将虚拟地址转换为物理地址才能访问实际的物理内存。同样的,虚拟机模拟的物理机同样需要有上述的机制,也需要有从虚拟地址到物理地址的转换。这里需要注意,模拟的物理机的物理地址本质上是 qemu 的虚拟地址。

swh547的博客 49

java中内存的划分,简要概述

** java中内存的划分,简要概述 ** 内存的分类 在java中,分为栈、堆、方法区、本地方法栈、寄存器,五大部分。此篇主要对前三种进行简要概述。 栈(Stack): 存放的都是方法中的局部变量。方法的运行一定要在栈中运行。 局部变量:方法的参数,或是方法{}内部的变量。 作用域:一旦超出作用域,立即从栈内存当中消失。 堆(Heap): **凡是new出来的东西都存放在堆中,**堆内存里的东西...

weixin_44836685的博客 217

图解B+树的插入过程

B+ 树在现代数据库中很常见,如果我们了解它,在工作中可能对性能优化会有更好的帮助! 最近我一直在思考 B+ 树的高度是由什么决定的。知道我了解了 B+ 树的插入过程,才有一种恍然大悟的感觉! 网上的一些资料杂乱无章,不同的数据库可能还有对 B+ 树有不同的实现。但是万变不离其宗,B+ 树的定义,大致如下所示: 总结一下,B+ 树有下面 5 个重要的特点。 B+ 树包含 2 种类型的结点: 内部结点(也称索引结点)和叶子结点。 根结点本身即可以是内部结点,也可以是叶子结点。 根结点的关键字个数最

愿君出走半生,归来时仍是少年 2134

java的内存划分概述

java的内存划分概述 概念示意图 总括—分为五个部分 栈空间(Stack):存放方法中的局部变量. 堆空间(Heap):存放动态创建的变量和对象 方法区(Method Area) :存放.class文件,包括方法的信息 本地方法栈(Native Method Stack):与操作系统有关 程序计数器(Program Counter):与CPU有关 ...

阿伟のBlog 1893

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

内存概述、Java虚拟机的内存划分

内存 内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机(JVM)要运行程序,必须要对内存进行空间的分配和管理。 Java虚拟机的内存划分 为了提高运算效率,Java虚拟机(JVM)就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 具体划分如下: 举几个例子: 对象的内存 public class Test02Phone { public s

further_的博客 167

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java学习笔记]java语言基础概述之内存的划分&堆和栈

1.内存的划分 1.寄存器         cpu处理 2.本地方法区        和所在系统相关 3.方法区 4.栈内存 5.堆内存 2.栈和堆 1.栈:      存储的都是局部变量。而且变量所属的作用域一旦结束,就释放该变量。      栈中的变量生命周期都很短,更新速度会很快。 局部代码块:限定局部变量的生命周期。局部代码块一旦执行结束,里面的变量就会

joke1031095867的博客 266

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[java学习笔记]java语言基础概述之内存的划分&堆和栈

1.内存的划分 1.寄存器 cpu处理 2.本地方法区 和所在系统相关 3.方法区 方法加载进内存,其实就是开辟了一块该方法的方法区 方法区中还可以有静态区,用于存放静态变量(类变量) 4.栈内存 5.堆内存 2.栈和堆 1.栈: 存储的都是局部变量。而且变量所属的作用域一旦结束,就释放该变...

weixin_30567471的博客 87

jvm对象内存划分

vm内存空间是逻辑上连续的虚拟地址空间(虚拟内存中的概念)映射到物理内存(不一定连续),物理内存不足时还会将物理内存中的数据交换到swap(磁盘的一块区域)。这块水有点深,查阅资料做了个个人的总结。

z275598733的博客 994

动态内存管理

动态内存管理

f_2789889770的博客 2062

Java内存管理之什么是JVM堆内存?JVM 内存是怎么划分的?

JVM 内存划分 方法区(线程共享):常量、静态变量、JIT(即时编译器) 编译后的代码也都在方法区; 堆内存(线程共享):垃圾回收的主要场所; 程序计数器: 当前线程执行的字节码的位置指示器; 虚拟机栈(栈内存):保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量; 本地方法栈 :为 JVM 提供使用 native 方法的服务。 ...

RunFromHere的博客 292

java的内存划分与数据的类型

标识符注意点 所有的标识符都应以字母(AZ或者az)、美元符($); 首字符之后可以是字母(AZ或者az)、美元符($)、下划线( _ )或数字的任何字符组合; 不能使用关键字作为变量名或方法名; 标识符是大小写敏感的; 合法的标识符;举例:age、$salary、_value等; 非法标识符;举例:123abc、-salary、#abc等; 数据的类型 基本类型: byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8

qq_48692860的博客 242

JVM堆内存如何划分新生代与老年代?

本文探讨了JVM堆内存中新生代与老年代的划分方法。新生代用于存储短期对象,采用Eden区和Survivor区的分配策略;老年代存储长期对象,空间随运行逐渐增大。划分依据包括对象生命周期、GC策略和系统性能需求,需动态调整内存分配。文中还提出了划分过程中的注意事项,强调需综合考虑系统性能、GC策略等因素,以确保JVM运行的稳定性和效率。通过优化内存划分,可提升JVM的整体性能表现。

searchboy2025的博客 85

详解动态内存管理!

然而,我们用来接受返回值的指针。注意:在使用free时,我们。置为空指针NULL~

2301_80221228的博客 1914

动态内存管理详解

C/C++程序内存分配的⼏个区域:1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内 存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。2. 堆区(heap):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配⽅ 式类似于链表。3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。

2301_80634989的博客 1082

linux---内存管理

即使是现代操作系统中,内存依然是计算机中很宝贵的资源,看看你电脑几个T固态硬盘,再看看内存大小就知道了。为了充分利用和管理系统内存资源,Linux采用虚拟内存管理技术,利用虚拟内存技术让每个进程都有4GB互不干涉的虚拟地址空间。进程初始化分配和操作的都是基于这个「虚拟地址」,只有当进程需要实际访问内存资源的时候才会建立虚拟地址和物理地址的映射,调入物理内存页。

badman_lee的博客 3601

Linux内核内存管理架构详解

因为访问效率等原因,内核对内存采用简单的线性映射,但是因为32位CPU的寻址能力(4G大小)和内核地址空间起始的设置(3G开始),会导致内核的地址空间资源不足,当内存大于1GB时,就无法直接映射所有内存。高端内存分配的内存是虚拟地址连续而物理地址不连续的内存,一般用于内 核动态加载的模块和驱动,因为内核可能运行了很久,内存页面碎片情况严 重,如果要申请大的连续地址的内存页会比较困难,容易导致分配失败。内核内存管理的核心工作就是内存的分配回收管理,其内部分为2个体系:页管理和对象管理。

huanxiajioabu的博客 1702
上一篇: 连接CMW 500综测仪VoLTE时的设置
下一篇: android 集成第三方静态库的编译方法
makeyourprogress
博客等级 码龄11年 26粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值