嵌入式软件面试之程序在存储器中的分布

Hi, 大家好,今天阿目分享的是一个嵌入式软件面试的常见问题,内存分布或者说程序在内存中的布局,我们写的程序是按照怎么的准则放在内存中的?

一般有操作系统的嵌入式设备,都会有一个Bootloader, 它负责在上电后初始化外设和系统配置,并把操作系统的代码从硬盘搬运到内存上,然后跳到操作系统的入口函数开始执行。因此,这种设计架构就会把程序放在内存,那么是遵循怎样的原则呢?相信大家一定看到过这样的内存分布图:

图片

其中常见的各个段的解析:

  1. 栈区(stack):
    用来存储函数调用时的临时信息的结构,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。

  2. 堆区(heap):
    一般由程序员分配、和释放,用来存储程序运行时分配的变量。

  3. 全局区(静态区static):
    存放全局变量、静态数据。程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)。

  4. 代码区(.text):
    存放函数体(类成员函数、静态函数和全局函数)的二进制代码。

  5. 内核区

    用于有操作系统的设计,用于存放操作系统代码,并会受到访问保护

需要注意的是上图中的分区,并不是固定的,也就是说每个软件设计者都可以灵活的安排这些区域的地址范围。这些都是在编译的链接脚本中可以指定地址范围的。

下面阿目还是以STM32的keil工程为例,为大家介绍,STM32工程配置的内存分布,该工程是基于STM32F103芯片,且不带操作系统。所以分区中就不需要考虑操作系统的部分了,那么具体有哪些分区呢?我们可以通过编译的map文件查看:

图片

上图就是map文件中的关于编译后的程序的地址分配信息,可以看到从1331行开始列出了地址信息,它属于哪个段呢?可以看关键字“Type”一列写的“Data”且属性列写的RO(read only的意思),所以0x0800_0000地址处放的就是一个只读变量,属于.data段;1332行“Type”一列写的“Code”,就是代码段(.text)的内容,它的地址是0x0800_00ec,其他行以此类推。

这里需要注意的是,STM32单片机运行时,代码段(.text)并不是在内存中的(启动模式设置为从Flash启动的情况),不像上面说的有些带有操作系统的设计方式,直接把所有代码放在内存中(因为一般这种设备内存会比较大),但是单片机芯片一般内存都比较小且执行效率要求没有那么高,所以为了节省成本会把程序放在Flash中,在执行过程中从Flash中取指令执行,所以这里的地址是从0x0800_0000开始的。

如果Flash的大小是10KB,那么这里代码段的地址空间可以理解为0x0800_0000~0x0800_2800, 一般不会把Flash空间全部当作用户的代码存放空间,因为芯片厂商一般会保存自家芯片的一些参数到Flash中,所以会占用一些空间。

图片

上面就是需要放在RAM中的.data段了,上期也有讲到,.data段在没有启动时是放在Flash中保存的,在启动后,将他们搬运到ram中,所以这里map文件列出了两个地址一个是 Exec Addr(执行地址), 一个是Load Addr(加载地址), 执行地址就是RAM的地址,加载地址就是这个变量存放在Flash中的地址。

1426行的一个数据它在RAM中的地址就是0x2000_0000,RW表示可读可写;1437行写出了STACK(栈空间)的地址,0x2000_0058,大小是0x400,也就是1KB,即stack空间的地址范围为:0x2000_0058 ~0x2000_0457。

这里的.data段的空间其实并没有明确规定,它只是在编译时由编译器安排的,程序中有几个全局变量或者静态变量就安排几个地址,并没有指定这个空间的结束地址。

ending~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/321027.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

70.网游逆向分析与插件开发-角色数据的获取-自动化助手UI显示角色数据

内容参考于:易道云信息技术研究院VIP课 上一个内容:利用技能点属性分析角色数据基址-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:367aa71f60b…

HCIP之OSPF大实验

华子目录 实验拓扑及要求实验步骤合理划分网段配置IP地址两个area 0区域可以访问公网首先使用ospf使私网通在边界路由器上写静态缺省在边界路由器上做nat,实现公网访问在边界路由器上强制下放缺省 使用GRE连接两个area 0,解决不规则区域划分在边界路由器…

【Vue3】2-11 : 生命周期钩子函数及原理分析

本书目录:点击进入 一、组件生命周期概述 1.1 官方生命周期 1.2 钩子函数(回调函数) ▶ 生命周期可划分为三个部分(- >表示执行循序): 二、实战:测试生命周期流程 > 代码 > 效果 一…

(十二)EEPROM的补充

文章目录 EEPROM补充篇读EEPROM补充内容写EEPROM补充内容单字节写入多字节拆成单字节写入现象 EEPROM补充篇 读EEPROM补充内容 对于上一篇博文在读EEPROM的时候,提到的DUMMY WRITE: 这里怎么理解呢: 大家看,写EEPROM的逻辑除了…

MySQl Mybatis

一、MySQL 1.1 概述 1.1.1 MySQL安装 1.1.2 数据模型 1.1.3 SQL简介 1.2 DDL 1.2.1 数据库操作 1.2.2 图形化工具 1.2.3 表结构操作 (一)创建 (二)数据类型 (1)数值类型 age tinyint unsigned——加上…

技术阅读周刊第十四期:Golang 作者 Rob Pike 在 GopherConAU 上的分享

技术阅读周刊,每周更新。 历史更新 20231215:第十期20231122:第十一期20231129:第十二期20240105:第十三期:一些提高生产力的终端命令 What We Got Right, What We Got Wrong URL: https://commandcenter.b…

pinyin-pro库使用方式

pinyin-pro 是一个专业的 JavaScript 中文转拼音的库,具备多音字识别准确、体积轻量、性能优异、功能丰富等特点。 pinyin-pro官网链接:介绍 | pinyin-pro 运行展示 pinyin-pro安装命令: # 选择一个你使用的包管理器进行安装即可# NPM $ n…

基于Java SSM框架实现企业车辆管理系统项目【项目源码】

基于java的SSM框架实现企业车辆管理系统演示 JSP技术 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了运动员的需求…

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制:对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处: 安全性较低(因为只有一个token在客户端和服务器端之间进行传递,一旦Access Token被截…

对闭包的理解

概念: 一个函数对周围状态的引用捆绑在一起,闭包让开发者可以从内部函数访问外部 函数的作用域 简单理解:闭包 内层函数 外层函数的变量 一个函数对周围状态的引用捆绑在一起,闭包让开发者可以从内部函数访问外部 函数的作…

【5G Modem】5G modem架构介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

openFeign 多模块调用失败问题

第一次做一个完整的SpringCloud微服务项目,踩了好多好多坑,都记录下来! openFeign 多模块调用失败 排错第一阶段 创建一个openfeign服务,并把它注册到nacos上去 然后A模块通过Feign调用B模块 但是我在A模块实现AdminArticleServiceFeignClient这个接口,报错: 后面我查找这个问…

phpinfo和php -m 加载的php.ini不一致

目的: 将phpinfo在web中展示的php.ini和在命令行中展示的php.ini加载路径设置一致。 原本的php.ini加载路劲是: /usr/local/lib/php.ini 解决思路: (1)which php 查看服务器加载的php的位置,这里原来是&a…

win10 安装配置 Rust 环境和简单使用

文章目录 安装 Rustup基本命令hello wrold使用 cargo 创建项目构建并运行项目发布 最近几年,Rust 因其卓越的内存安全性和并发性能备受关注。不仅连续七年获得 StackOverflow 最受开发者喜爱的语言榜榜首,也在越来越多知名公司内部使用,比如&…

通过Wireshark抓包分析谈谈DNS域名解析的那些事儿

原创/朱季谦 本文主要想通过动手实际分析一下是如何通过DNS服务器来解析域名获取对应IP地址的,毕竟,纸上得来终觉浅,绝知此事要躬行。 一、域名与IP地址 当在浏览器上敲下“www.baidu.com”时,一键回车,很快&#x…

分布式链路追踪专栏,Spring Cloud Sleuth:分布式链路追踪之通信模型设计

Spring Cloud Sleuth 赋予分布式跟踪的 Spring Boot 自动配置的一键解决方案。Spring Cloud Sleuth 是基于 Brave 的封装,也是很多公司采用开源加自研的最佳解决方案。 那么从作为架构师或者技术专家如何去借鉴优秀框架的设计理念和思想,本次 Chat 将开…

肯·汤普逊 :我心目中的神,好像真正无敌之上的大佬都对C++提出了批判!大佬们的思想像红太阳太耀眼,常人不能直视

肯尼斯蓝汤普逊(英语:Kenneth Lane Thompson,1943年2月4日—),小名肯汤普逊(英语:Ken Thompson),美国计算机科学学者和工程师。黑客文化圈子通常称他为“ken”[1]。在贝尔…

为什么很多公司选择不升级JDK版本,仍然使用JDK8?

在讨论为什么许多公司选择不升级JDK版本,而继续使用JDK 8时,我们需要从多个角度来分析这个问题。以下是根据您提供的背景信息进行的一些分析和真实案例。 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术…

test Symbolic Execution-03-Soot - A Java optimization framework

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) test fuzz-01-模糊测试(Fuzz Testing) Soot 重要…

【linux】awk的基本使用

awk是shell中一个强大的文本处理工具,被用于处理文本和数据 当你心中默念想要使用类似于 处理某一行,处理某一列 的文本 的功能时,就是awk登场的时候了 举个简单的例子是,当我们想知道自己的所有网卡的名字时,可以用i…