程序的存储态与运行态

简介: 程序的存储态与运行态

程序的存储态与运行态

☞认识程序的运行与存储:结合硬件存储器来分析程序在运行和静止时的存储状态。


相关文章链接


应用程序有静止状态(存储态)和运行状态(运行态)。静止状态就是程序在运行之前存储在非易失性存储器中的状态,比如stm32的内部Flash中,因此,系统掉电后程序也能正常保存。当我们把程序下载(烧写)到STM32F429的Flash中,如果不运行程序,那么程序就处于静止状态,关机重启后程序依然存在,不会丢失。在程序开始运行的时候,也就是程序处于运行态的时候,程序经常会修改一些暂存数据,为了提高速度,这些数据一般会加载到内存(RAM)中,而内存中的数据在掉电后会丢失。因此,程序在静止和运行两种状态下,它们在存储器中的位置是不一样的。

程序在存储态时,RO节(RO section)和RW节(RW section)都保存在ROM区,比如STM32的Flash中。当程序开始运行时,内核直接从ROM中读取代码,并在执行主体代码前先执行一段加载代码,把RW section中的数据从ROM拷贝到RAM内存中,并在RAM中加入ZI section,ZI节的数据都被初始化为0,加载完RAM区之后,正式开始执行主体程序。

在《MDK编译过程及ARM编译工具链》一文中说到,编译后的信息划分了几个域(可参考本人文章)。编译信息中的RW-data和ZI-data分别对应这里的RW section和ZI section,二者的区别在于是否需要掉电保存。因为在RAM中创建数据时,默认初值都是0,比如ZI节,但是有的数据要求初值非0,也就是被初始化为非0值的数据,这些数据需要通过ROM来记录初值(因为初值是程序运行前就确定好的,也就是说这个非0初值应该具有掉电保存的性质,所以这就需要把具有非0初值的数据保存在ROM/Flash中,而初值为0的数据掉电后重新在RAM内存中加载并不会影响初值,所以不需要掉电保存,也就不需要保存到ROM/Flash中记录初值,而是在运行态时直接在RAM中创建即可,即ZI section),而存放在ROM中的数据会在程序运行时复制到RAM。STM32的RO区不会加载到RAM中,内核直接从Flash读取指令。这里需要区分开的是,计算机会把RO区加载到内存,因为计算机有MMU单元,支持虚拟内存,可以运行大于物理内存的程序。

当程序下载到STM32的Flash(RAM)中的时候,它占用的空间为 code + RO-data + RW-data ,若这个总和大于STM32的Flash存储空间,将会出现错误。程序执行时占用的SRAM空间为 RW-data + ZI-data。

程序状态 编译后的数据域
运行态RO区 code + RO-data
运行态RW区 RW-data + ZI-data
存储态ROM区 code + RO-data + RW-data


相关文章
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
799 0
深入理解InnoDB索引数据结构和算法
|
9月前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
568 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
Web App开发 安全 Java
《手把手教你》系列技巧篇(七)-java+ selenium自动化测试-宏哥带你全方位吊打Chrome启动过程(详细教程)
【2月更文挑战第16天】本文介绍了如何通过查看源码理解Selenium启动Chrome浏览器的过程。首先,展示了启动Chrome的Java代码,包括设置系统属性、创建WebDriver实例、最大化窗口、设置隐性等待、打开网站、获取页面标题以及关闭浏览器。文章还讲解了包(package)、import导入、setProperty设置系统属性、WebDriver接口、driver实例、manage方法、get方法加载网页以及quit方法退出浏览器的基本概念和作用。适合没有Java基础的读者了解Selenium与Java的交互方式。
185 3
|
10月前
|
缓存 监控 Java
|
10月前
|
机器学习/深度学习 计算机视觉 Ruby
【YOLOv11改进 - 注意力机制】iRMB: 倒置残差移动块,即插即用的轻量注意力
【YOLOv11改进 - 注意力机制】iRMB: 倒置残差移动块,即插即用的轻量注意力本文提出了一种新的轻量级密集预测模型EMO,结合高效的倒置残差块(IRB)和Transformer组件,设计了单残差元移动块(MMB)和倒置残差移动块(iRMB)。EMO在ImageNet-1K、COCO2017和ADE20K基准上表现出色,参数、效率和准确度达到良好平衡,尤其在iPhone14上运行速度比EdgeNeXt快2.8-4.0倍。
【YOLOv11改进 - 注意力机制】iRMB: 倒置残差移动块,即插即用的轻量注意力
|
关系型数据库 MySQL Java
解决com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large
这篇文章提供了解决MySQL JDBC驱动中`com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large`错误的步骤,主要是通过增加配置文件中的`max_allowed_packet`参数值并重启服务来允许更大的数据包传输。
解决com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large
|
前端开发 关系型数据库 MySQL
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
|
消息中间件 存储 Java
kafka 性能优化与常见问题优化处理方案
kafka 性能优化与常见问题优化处理方案
244 1
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
553 6
|
Linux 开发工具
蓝易云 - 在CentOS7/RHEL7上安装OpenSSL1.1.x教程
以上就是在CentOS7/RHEL7上安装OpenSSL 1.1.x的步骤。希望对你有所帮助。
665 0