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

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~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

reids优化系列(五)

后面更新的这些文章是将所学的redis知识进行巩固并且分享,也希望这些知识不仅仅是用于复习面试,更能在实际的应用中起到优化的作用。 有时候我们会存储一些查询多,修改少,业务逻辑较弱的数据,并且还能高效查询&#x…

漏洞修复整理

一、Geoserver Apache HTTP/2拒绝服务漏洞(CVE-2023-44487)、Eclipse Jetty 资源管理错误漏洞(CVE-2023-26048)、Eclipse Jetty 信息泄露漏洞(CVE-2023-26049) 受影响版本:9.4.53以下版本 处理方式:原地升级 ( jdk版本…

【记录】求职经历

目标岗位:嵌入式开发 1. 线上笔试 常用算法,比如动态规划、递归等标准模板库(STL)C 11新特性LeetCode刷题牛客刷题 2. 技术一面 3. 技术二面 4. 主管面 5. HR面

学习redis有效期和数据类型

1、安装redis和连接redis 参考:ubuntu安装单个redis服务_ubuntu redis单机版安装-CSDN博客 连接redis:redis-cli.exe -h localhost -p 6379 -a 123456 2、Redis数据类型 以下操作我们在图形化界面演示。 2.1、五种常用数据类型介绍 Redis存储的是key…

BCPL语言 :这可是B语言啊,汤姆森大佬趁老婆回老家用来开发第一个unix操作系统的语言(大佬基于BCPL开发的bon语言,C语言前身)

BCPL(“基本组合编程语言”)是一种过程式、命令式和结构化的编程语言。BCPL最初旨在为其他语言编写编译器,现在已不再常用。然而,它的影响仍然存在,因为BCPL的一个剥离和语法改变的版本,称为B,是C编程语言的基础。BCPL…

Linux文件创建教程:简单易懂的操作指南和示例代码详解

在Linux系统中,文件的创建是日常使用中经常遇到的操作之一。本篇教程将向你介绍如何在Linux系统中创建文件,并提供详细的示例代码,让你能够轻松上手。 1. 使用touch命令创建文件 touch命令是最简单、最常用的创建文件的方法之一。它可以用来…

jenkins-cl参数化构建

pipeline片段(对应jenkins-cli -p参数的BRANCHdevelop) parameters {string(name: BRANCH, defaultValue: master, description: Enter the branch name)}stages {stage(Get Code) {steps {script {def branch params.BRANCHcheckout scmGit(branches: …

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求:假设你有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序?  分析:这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

单片机学习记录(四)

第8章 1.在异步串行通信中,接收方是如何知道发送方开始发送数据的? 答:当接收方检测到RXD引脚上有负跳变时,即可知道发送方开始发送数据; 2.AT89S51单片机的串行口有几种工作方式?有几种帧格式&#xff…

世邦通信 SPON IP网络对讲广播系统addscenedata.php任意文件上传漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统存在任意文件上传漏洞,攻击者可以通过构造特殊请求包上传恶意后门文件&#xff…

Sentinel微服务保护

文章目录 Sentinel微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.解决方案1.1.3.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.1.快速入门2.2.流控模式2.2.1.…

华纳云:cdn主服务器连通性异常怎么办

当 CDN 主服务器连通性异常时,可能会影响到内容分发网络(CDN)的正常运行。在面对这种情况时,可以采取以下步骤来处理: 检查网络连接: 首先确保本地网络连接正常。尝试通过其他网络或设备访问 CDN 主服务器,以确定问题是…

redis.conf配置文件常用配置项详解

redis.conf 是 Redis 的配置文件,用于配置 Redis 服务器的各种参数和行为。这个配置文件包含了丰富的选项,允许用户调整 Redis 的行为以满足特定需求。以下是一些 redis.conf 中常见配置项的详解: daemonize: 默认值: …

c++八股3

多态:在C中,如果类B继承自A,并且定义了虚函数f(), 类C又继承自B但没有重写f(),那么当你执行如下代码: Cpp C *c new C(); c->f();调用的将是B类中实现的f()方法,因为C没有提供自己的覆盖版本。若要调用…

onlyoffice导入字体

1.进入容器 docker exec -it onlyoffice-server bash 2.删除自带字体 cd /var/www/onlyoffice/documentserver/core-fonts/ rm -rf * 3.退出容器 exit 1.将字体放入/home/Fonts/ ,如果不存在可以新建 2.执行docker cp /home/Fonts onlyoffice-server:/var/www/only…

avcodec send_packet和receive_frame

下面是解码的过程代码,对输入给解码器的pkt桢类型进行判断,关键桢打印出is key frame,解码出来的桢根据pict_type打印桢类型出I/P/B桢类型,从这里也可以看出来,没解码之前,AVPacket只能得到是否关键帧&…

Zung氏焦虑症测试SAS

SAS被称为焦虑自评量表,是一种用来测量焦虑症状程度以及观察治疗过程中变化情况的心理量表。主要用于评估心理状态,辅助参考数据,也是焦虑评定的标准。焦虑自评量表系是由William W.K. Zung编制的,该量表已成为心理咨询师、心理医…

【Python基础】一文搞懂:Python中文件路径的处理方式

文章目录 1 引言2 os 模块2.1 常用函数2.2 示例 3 pathlib 模块3.1 常用类和方法3.1 示例 4 比较 os 和 pathlib5 实例演示5.1 使用 os 模块5.2 使用 pathlib 模块5.3 封装为pathlib_example.py脚本 6 结语 1 引言 在 Python 编程中,正确处理文件路径是一个常见且重…

【GitHub项目推荐--克隆你的声音】【转载】

今天推荐一个黑科技开源项目,只需要你 5 秒钟的声音对话,就能克隆出你的声音,而且能够实时的生成你任意语音。 是不是很顶? 我举个例子,如果我这里有 300 条你说话的语音,我把你的语音数据用这个开源项目…

为求增长,这家消金公司也开始发力小微

来源 | 镭射财经(leishecaijing) 消金公司业务转向,小微贷越来越香,已成消金行业近年转型奋进的一个插曲。 为求业绩增长,拓宽获客基数,越来越多的消金公司不再局限于单一的C端客群,将目光瞄向…