程序的存储态与运行态

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

程序的存储态与运行态

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


相关文章链接


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


相关文章
|
5月前
【操作系统】—进程的状态与转换
【操作系统】—进程的状态与转换
【操作系统】—进程的状态与转换
|
5月前
|
监控 安全 Windows
4.3 Windows驱动开发:监控进程与线程对象操作
在内核中,可以使用`ObRegisterCallbacks`这个内核回调函数来实现监控进程和线程对象操作。通过注册一个`OB_CALLBACK_REGISTRATION`回调结构体,可以指定所需的回调函数和回调的监控类型。这个回调结构体包含了回调函数和监控的对象类型,还有一个`Altitude`字段,用于指定回调函数的优先级。优先级越高的回调函数会先被调用,如果某个回调函数返回了一个非NULL值,后续的回调函数就不会被调用。当有进程或线程对象创建、删除、复制或重命名时,内核会调用注册的回调函数。回调函数可以访问被监控对象的信息,如句柄、进程ID等,并可以采取相应的操作,如打印日志、记录信息等。
35 0
4.3 Windows驱动开发:监控进程与线程对象操作
|
6月前
|
存储 算法 Java
深入理解操作系统中进程与线程的区别及切换机制(下)
本文首先介绍了进程的控制结构,即进程控制块(PCB),它是表示进程的数据结构,包含了进程的相关信息和资源。PCB之间通过链表连接,形成就绪队列和阻塞队列,用于进程调度和资源管理。接着,文章详细探讨了进程的切换过程。进程切换是为了保证公平分配CPU时间片,涉及保存和恢复进程的执行上下文、更新进程状态和调度算法选择等步骤。文中还提到了进程上下文切换的场景,如时间片用完、内存不足、高优先级进程需求等。最后,文章介绍了线程的概念和上下文切换过程。线程是进程中的独立执行流程,可以共享进程的资源。线程的上下文切换开销较小,只需要保存和恢复线程的寄存器和计数器等信息。
深入理解操作系统中进程与线程的区别及切换机制(下)
|
6月前
|
Java 调度
深入理解操作系统中进程与线程的区别及切换机制(上)
进程是正在运行的程序的实例,它可以包含一个或多个线程。我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。就绪状态表示进程已经准备好运行,但还没有被调度执行。运行状态表示进程正在执行。阻塞状态表示进程被阻塞,需要等待某些事件的发生才能继续执行。结束状态表示进程已经完成执行。
深入理解操作系统中进程与线程的区别及切换机制(上)
|
7月前
|
存储 算法 Linux
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
141 0
|
7月前
|
资源调度 调度
操作系统中进程的就绪和等待两个状态的区别
操作系统中进程的就绪和等待两个状态的区别
107 0
|
8月前
|
索引
进程的状态和转换
注意:运行态回到就绪态有两种方式: 1.运行态——阻塞态——就绪态 2.运行态——就绪态(每个进程行CPU运行都是一个时间片,一个时间片的时间到了,CPU接收到时钟中断信号,该进程就会下CPU,进入就绪态)
43 0
进程的状态和转换
|
9月前
|
消息中间件 Linux 调度
Linux进程管理:深入探索进程的创建、终止与调度
在Linux操作系统中,进程管理是一个重要的主题。进程是程序的执行实例,负责执行应用程序的代码,并拥有自己的内存空间和资源。本文将深入探讨Linux进程管理的相关知识,包括进程的创建、终止与调度,以帮助读者更好地理解Linux操作系统中的进程运行机制。
166 0
|
10月前
|
编译器 程序员 C语言
编译时间和运行态时间交换的优缺点
编译时间和运行态时间交换的优缺点
61 0
|
NoSQL Linux 调度
Linux进程控制【创建、终止、等待】
进程创建后,需要对其进行合理管理,光靠OS是无法满足我们的需求的,此时可以运用进程控制相关知识,对进程进行手动管理,如创建进程、终止进制、等待进程等,其中等待进程可以有效解决僵尸进程问题
168 1
Linux进程控制【创建、终止、等待】