【问题标题】:What is ROM Copy Section in Startup [closed]什么是启动中的 ROM 复制部分 [关闭]
【发布时间】:2021-07-19 14:45:33
【问题描述】:

由于我是使用编译器的新手,所以到目前为止我所理解的是目标文件包含:

  1. .数据部分
  2. .text 部分(有时也称为代码部分)
  3. .调试部分

在玩分区放置时,我遇到了一个名为“ROM 复制表”的术语 有人可以解释一下什么是 ROM 复制表/部分吗? 这样做的目的是什么?

感谢您的帮助

【问题讨论】:

  • 你是从哪里看到的?
  • 我在Tasking编译器中遇到过它
  • 自从我使用 Tasking 以来已经很长时间了,但我认为这只是在启动期间应该从 ROM 闪存复制到 RAM .data 的默认初始化值。

标签: c embedded microcontroller


【解决方案1】:

当您对没有操作系统的小型计算机(例如,微控制器)进行编程时,您可以将程序物理地编程到 ROM 芯片(只读存储器)上,并有一个 RAM 芯片来保存您的变量。当您的程序启动时,它必须将所有变量初始化为其起始值。最简单的方法是将它们全部放在相邻的地址(即一个部分),将起始值存储在程序旁边的 ROM 中,并在程序开头使用 memcpy 将起始值复制到RAM 中的实际变量。您无法制作具有预编程起始值的 RAM 芯片。

在现代微控制器上,ROM 和 RAM 都在微控制器芯片中,而不是单独的芯片,但设计仍然相同。

根据您的特定链接器的术语,初始值存储在 ROM 中的位置、它们最终存储在 RAM 中的位置或两者都可以称为“ROM 复制部分”,尽管我不相信这是标准术语。

【讨论】:

  • 您不使用 memcpy 复制 .​​data 或 memset 来解决 .bss、鸡和蛋的问题。该代码只是 bootstrtap 中的一个复制循环
  • @old_timer 这样的引导加载程序可以用任何能够完成任务的语言编写。我们曾经有一个环境使我们能够使用纯 C 来完成工作,包括 memcpy()memset()。但这并不常见。 ;-)
  • 你有鸡和蛋的问题,使用 C 引导 C。它也非常低效。可能还有其他你看不到这样做的原因。
【解决方案2】:

您的问题含糊不清,因此不可能提供完整/准确的示例。

历史上共有三个主要部分,分别命名为 .text、.data、.bss,尽管任何特定的工具链都可以随意调用它们,甚至不必使用“部分”一词。

.text 是代码(并且取决于指令集一些只读数据和/或基于工具链和程序员的所有只读数据)(代码加池)。

.data 是我想说的初始化的全局变量或局部全局变量

int x=5;
...
int fun ( void )
{
   static int y=3;

以及在调用编译代码入口点之前读/写和初始化的任何其他项。

.bss 被归零的全局变量

int z;
int more_fun ( void )
...

MCU 通常意味着有一个非易失性存储器(rom/flash/eeprom/...)和一些 ram 以及处理器和外围设备。

当我们在计算机上运行程序时,操作系统会将我们的程序加载到内存中,并且可以选择让加载程序将这些项目提取到正确的位置,或者可以构建二进制文件以便操作系统加载程序简单地复制图像到 ram 并运行它。

在 MCU 或其他类似的裸机系统上,代码本身必须初始化 ram。如果程序员希望使用这些类型的全局信息,那么在他们期望该信息可用之前,需要放置它。非易失性存储器是...非易失性的...因此需要存储.data 和有关.bss 的信息。不需要将所有的 .bss 零存储在闪存上,您只需要存储起始地址和字节数。

程序员通过链接和引导程序(一对紧密结合)(在这种情况下,引导程序是在编译代码运行之前发生的基于汇编的代码,它准备系统运行编译代码)将 .data 和 .bss 信息放入在某处闪现。引导程序中的一些代码获取闪存偏移量、内存偏移量和 .data 的字节数并复制这些字节。同样,引导程序采用 ram 中的地址和 .bss 的字节数并将该数据归零。

调试不是二进制文件的要求,它是可选的。通常它不会放在闪存上,它是某些文件格式的二进制文件(例如.elf),但闪存上的字节通常是可加载的部分。调试器将读取匹配的 elf 文件和/或下载/刷新并运行/重置以知道它匹配,然后使用文件中的字符串和其他信息使单步执行代码等更加用户友好。

当然,二进制文件可能有一个 rom 监视器或其他属于调试类别的东西。错误调试不是典型/必需的。

根据工具链,您可能有一个不属于 .text 的只读 .rodata(gnu 在较新版本上执行此操作)。同样,.text、.data、.bss 等名称更多地是一种习惯,而不是硬性要求。不使用这些名称会给有经验的用户造成混淆,并且可能会对您的产品产生负面看法,因此我怀疑大多数人只是使用这些名称。

这个 ROM Copy table,听起来像是二进制文件的生成方式,在继续执行之前需要将信息从 rom 复制到 ram。

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 2016-04-01
    • 2011-07-15
    • 2016-04-16
    • 2016-08-27
    • 1970-01-01
    • 2012-08-10
    • 2021-09-20
    • 2013-05-21
    相关资源
    最近更新 更多