首页 > 系统相关 >内存、存储中(计算机、MCU)的引导流程、存储器

内存、存储中(计算机、MCU)的引导流程、存储器

时间:2024-07-18 11:40:39浏览次数:20  
标签:引导 存储 存储器 ROM RAM 内存 MCU

内存、存储中(计算机、MCU)的引导流程、存储器

一、内存

  • 栈区(stack):存放 非静态局部变量
  • 堆区(heap):存放 malloc()、calloc() 、realloc()、free()等函数动态分配的数据 ——malloc() - C语言标准库中的函数
  • 全局静态区:存放 静态局部变量、全局变量
  • 代码区:存放 程序代码

  • 栈区和堆区 存放 程序运行的动态数据

栈区(Stack)和堆区(Heap)是程序运行时在RAM(Random Access Memory,随机存取存储器)中划分的两个主要的内存区域,它们用于存储程序运行时的动态数据。


栈区

  • 栈是由编译器自动分配和释放的,用于存储局部变量、函数调用信息(如返回地址、参数)等。
  • 栈具有自动管理的特点,函数调用时自动分配,函数返回时自动释放。
  • 栈的内存空间相对较小,但访问速度快。
  • 栈按照后进先出(LIFO,Last In First Out)的原则操作。

堆区

  • 堆是由程序员手动分配和释放的,通常使用如malloccallocreallocfree这样的函数(在C/C++中)。
  • 堆用于存储动态分配的对象,其生命周期由程序员控制。
  • 堆的内存空间相对较大,但访问速度较慢,因为分配和释放需要额外的管理开销。
  • 堆按照自由可用的原则操作,分配的内存可以在任何时候释放。

注:虽然RAM是最常见的包含栈和堆的存储区域,但这并不意味着其他类型的存储器就不能有类似的概念。

eg:例如,某些嵌入式系统可能在非易失性存储器(如EEPROM或闪存)中模拟堆的行为,用于存储需要持久化的数据。但是,这种“堆”不会像RAM中的堆那样快速或灵活,而且可能受到写入次数的限制。

在讨论栈和堆时,我们通常指的是运行时动态分配的内存,而这几乎总是与RAM相关联,因为RAM提供了必要的速度和随机访问特性,这是栈和堆高效操作所必需的。

二、从 存储 中,计算机、单片机的开机/执行程序 的引导流程

1、计算机引导流程

​ 现代计算机的开机通常要经历一个复杂且精心设计的过程,这个过程叫做引导。引导是计算机启动和运行操作系统的初始步骤,它确保了系统能够正确地加载和执行所需的程序。

​ 引导过程随CPU架构不同而不同,我们平常接触最多的是x86架构


CPU内部ROM(存储固定的指令)

内存中的存储介质选用的是RAM

磁盘模块代表的是持久化存储模块,其实和内存模块电路类似,采用了独立端口的EEPROM

目前我们的计算机总共有三块存储:
iRom:CPU内部很小的一块存储,只读;(该块存储器在出厂的时候已经把代码烧录好了,一般是不允许修改的;该存储器写入代码的功能主要是用于调用内存中的代码,然后执行)
内存(RAM):无法持久化保存数据,只有上电之后才能由程序修改;
硬盘(ROM):存放我们的自定义代码和数据。[目前硬盘大部分已经使用 EEPROM ]
引导程序 设计如下:

​ 1. iRom负责将硬盘前32个寻址长度的程序加载到内存并跳转;

​ 2. 硬盘前32个寻址长度负责加载(硬盘32个指令之后的)自定义程序并跳转;

  1. 最终(在内存中)执行自定义程序。

    注:而硬盘前32个寻址地址存放的程序,我们就称之为引导程序,而这32个寻址地址,我们称之为引导区。

​ 终端最终会显示自定义程序执行的内容

2. 单片机的引导流程

​ 可以把单片机视为ROM和RAM都内置在MCU中 【相对于计算机少了一个硬盘】

​ 只暴露一些输入输出总线接口和外部通信的设备。引导过程就相当于在ROM上直接执行程序,只有需要用到RAM时才会向RAM中写入数据。

51单片机的固定初始化流程
  • 程序编译完成以后的汇编文件:

    ​ 在ROM中,第一条指令:直接跳转到 单片机的固定初始化流程 ,当这段代码执行完毕后,最后一句代码就是跳转到 main函数入口,执行main主函数。

三、存储器和寄存器

1、存储器

存储器是计算机结构的重要组成部分。存储器是用来存储程序代码和数据的部件,有了存储器计算器才具有记忆功能

​ 分为两大种:RAM(随机存取存储器) 、 ROM(只读存储器)

​ RAM -> 内存

​ * RAM提供了程序运行时所需要的高速随机访问存储能力

​ ROM -> 硬盘(一般用的较多的是flash [又名闪存,是可重复擦写的存储器] )

STM32:

​ 在STM32中,芯片能访问的存储空间有多大,是由芯片的*地址总线的数量*决来定的,STM32芯片内部的地址总线为32根。所以STM32有*4G*的地址空间。(2的32次方)

​ ARM把可访问的存储器空间分成8个主要块,每个块为512MB。ARM 在对这 4GB 容量分块的时候是按照其功能划分,每块都有它特殊的用途。

在这8个Block里面,要特别注意Block0、Block1和Block2这3个块。因为其中包含了STM32芯片的内部 Flash、RAM和片上外设

2、寄存器

​ 寄存器是单片机内部一种特殊的存储器,可以实现对单片机各个功能的控制。

​ 给已经分配好地址的有特定功能的存储器单元*取别名的过程*就叫*寄存器映射*

注:寄存器映射在ST提供的头文件stm32f10x.h中已经通过预编译的形式完全映射好了,以后如果再操作某个特定外设的时候,就不用直接操作地址,直接操作对应的寄存器名就可以了。

eg:PA这组IO端口的映射

// 外设基址
#define PERIPH_BASE           ((uint32_t)0x40000000) 
// APB2外设的基址 
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000) 
// GPIOA 外设的基址
#define GPIOA_BASE            (APB2PERIPH_BASE + d)
// 做了类型转换,地址仍然是GPIOA 外设的基址
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

标签:引导,存储,存储器,ROM,RAM,内存,MCU
From: https://www.cnblogs.com/petard/p/18309189

相关文章

  • 记一次 redis 事件注册不当导致的内存泄露
    线上的程序跑着跑着内存越来越大,并且没有下降的趋势,重启一下程序也只能短暂恢复。通过htop命令再按一下M键按内存占用大小排个序,程序会占好几个G。那好,让我们来分析一下。收集dump通过top或htop进程管理器,或ps命令查找到目标进程id,然后使用如下命令生成dump:created......
  • C++之动态内存分配
    目录(1)动态内存分配概述A.C++内存空间模型B.What(什么是动态内存分配)C.Why(为什么要进行动态内存分配)D.How(如何进行动态内存分配)(2)定位new运算符A.What(什么是定位new运算符)B.Why(定位new运算符的作用)C.How(如何使用定位new运算符)(3)重载new和delete(1)......
  • 在 PowerShell 中Get-WmiObject Win32_PhysicalMemory,SMBIOSMemoryType 是一种用于描
    在PowerShell中Get-WmiObjectWin32_PhysicalMemory,SMBIOSMemoryType是一种用于描述系统中物理内存类型的属性。数字26表示特定的内存类型,具体为DDR4内存。每种内存类型在SMBIOS(SystemManagementBIOS)规范中都有一个对应的数字码,用来标识不同类型的内存。以下是一些常见......
  • 19集 两款ESP32开发板如何选择?-《MCU嵌入式AI开发笔记》
    19集两款ESP32开发板我们用哪款?-《MCU嵌入式AI开发笔记》有两款ESP32的开发板分别是ESP32S3和C3的,我们该如何选择?1、ESP32-S3-BOX-3在乐鑫官网上,https://www.espressif.com.cn/zh-hans/products/devkits有ESP32S3BOX开发板,链接如下:https://github.com/espressif/es......
  • 高质量C/C++编程指南总结(七)—— 内存管理
    1.内存分配的方式从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处......
  • C++ 智能指针动态内存简单测试
    代码示例,主要来自《C++Primer》,动态内存相关那章内容。#include<iostream>#include<memory>#include<string>namespace{//未初始化的智能指针,默认保存的空指针voiddef_null_sp_test();//不是唯一用户,复制一份新的考拷贝。voidsp_unique_copy_te......
  • C++第七弹 -- C/C++内存管理
    目录前言一.C/C++内存分布二.C语言中动态内存管理方式三.C++中动态内存管理四.operatornew与operatordelete函数五.new和delete的实现原理1.内置类型2.自定义类型六.定位new表达式(placement-new)七.常见面试题总结前言在C/C++编程中,内存管理是至关重要的......
  • 【YashanDB知识库】virt虚拟内存远大于res内存问题分析
    YASDB内存占用简介参数配置:默认参数配置:DBMS_PARAM高级包生成配置参数数据库内存配置,使用默认参数步骤:1、DBMS_PARAM.OPTIMIZE();//生成默认参数,使用总内存的80%2、SELECTDBMS_PARAM.SHOW_RECOMMEND()FROMdual;//查看生成的参数3、EXECDBMS_PARAM.APPLY_RECOMMEND();......
  • 从ThreadLocal底层源码一直聊到内存泄漏,干货满满!!
    小强最近在疯狂补习高并发的相关知识,但是在学到threadLocal时有点力不从心了,尤其是threadLocal的底层架构和如何导致内存泄漏,今天我们帮小强一把!!把这一块彻底聊清楚!!!文章目录1.threadLocal的前世今生1.为什么要使用threadLocal2.threadLocal和Synchonized的比较3.使用场......
  • FTK Imager的强大功能:详细解读内存和磁盘镜像导出
    本指南将详细解读如何使用FTKImager进行内存镜像导出、镜像挂载和磁盘镜像导出。通过这篇文章,我希望能够帮助你更好地理解和应用这些技术,提高你的工作效率和准确性。文档目录简介准备工作1.1安装FTKimager1.2汉化(可选)1.3界面介绍磁盘镜像导出2.1什么是磁盘镜......