程序的存储态与运行态

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

程序的存储态与运行态

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


相关文章链接


应用程序有静止状态(存储态)和运行状态(运行态)。静止状态就是程序在运行之前存储在非易失性存储器中的状态,比如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


相关文章
|
6月前
|
Linux 调度
Linux进程状态
Linux进程状态
|
5月前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
40 1
|
5月前
|
存储 缓存 安全
详解CPU的态
详解CPU的态
36 0
|
6月前
|
缓存 Linux
【进程控制】谈谈进程终止的三种状态
【进程控制】谈谈进程终止的三种状态
|
存储 算法 Java
深入理解操作系统中进程与线程的区别及切换机制(下)
本文首先介绍了进程的控制结构,即进程控制块(PCB),它是表示进程的数据结构,包含了进程的相关信息和资源。PCB之间通过链表连接,形成就绪队列和阻塞队列,用于进程调度和资源管理。接着,文章详细探讨了进程的切换过程。进程切换是为了保证公平分配CPU时间片,涉及保存和恢复进程的执行上下文、更新进程状态和调度算法选择等步骤。文中还提到了进程上下文切换的场景,如时间片用完、内存不足、高优先级进程需求等。最后,文章介绍了线程的概念和上下文切换过程。线程是进程中的独立执行流程,可以共享进程的资源。线程的上下文切换开销较小,只需要保存和恢复线程的寄存器和计数器等信息。
266 0
深入理解操作系统中进程与线程的区别及切换机制(下)
|
Java 调度
深入理解操作系统中进程与线程的区别及切换机制(上)
进程是正在运行的程序的实例,它可以包含一个或多个线程。我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。就绪状态表示进程已经准备好运行,但还没有被调度执行。运行状态表示进程正在执行。阻塞状态表示进程被阻塞,需要等待某些事件的发生才能继续执行。结束状态表示进程已经完成执行。
120 0
深入理解操作系统中进程与线程的区别及切换机制(上)
|
存储 算法 Linux
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
253 0
|
消息中间件 Linux 调度
Linux进程管理:深入探索进程的创建、终止与调度
在Linux操作系统中,进程管理是一个重要的主题。进程是程序的执行实例,负责执行应用程序的代码,并拥有自己的内存空间和资源。本文将深入探讨Linux进程管理的相关知识,包括进程的创建、终止与调度,以帮助读者更好地理解Linux操作系统中的进程运行机制。
355 0
|
NoSQL Linux 调度
Linux进程控制【创建、终止、等待】
进程创建后,需要对其进行合理管理,光靠OS是无法满足我们的需求的,此时可以运用进程控制相关知识,对进程进行手动管理,如创建进程、终止进制、等待进程等,其中等待进程可以有效解决僵尸进程问题
211 1
Linux进程控制【创建、终止、等待】
|
物联网 Linux 调度
进程的状态及切换|学习笔记
快速学习进程的状态及切换
进程的状态及切换|学习笔记