程序如何加载到 ROM 中?

Posted

技术标签:

【中文标题】程序如何加载到 ROM 中?【英文标题】:How is a program loaded in ROM? 【发布时间】:2012-01-18 10:17:36 【问题描述】:

当您在 Windows 上运行程序时,它会被加载到计算机内存中,组织结构如下:

数据段 堆栈 代码段

数据段可能包含只读或具有读写权限的数据。

例如:

char *c = "Hello World";

字符串Hello World 被称为存储在内存的只读部分。它是存储在有时称为 RAM 的物理内存中还是存储在只读的 ROM 中?只读怎么写?

【问题讨论】:

谨慎使用术语。 ROM是可以存储数据或程序代码但不能写入的物理内存。只读段是 MMU 配置为防止写入的内存块。 【参考方案1】:

一台 PC 只有一个真正符合 ROM 条件的内存区域,即存储 Bios 的地方。所有 Windows 和 Windows 中加载的程序都将在 RAM 中。

x86 处理器内存管理能够将内存块标记为只读,但链接器和操作系统必须协同工作才能启用此功能。它发生在程序加载到内存之后。

【讨论】:

【参考方案2】:

它存储在 RAM 中。操作系统与处理器本身合作,能够保护内存区域,以便任何从用户代码写入它们的尝试都会导致异常。

【讨论】:

【参考方案3】:

在许多嵌入式系统中,它们具有 RAM 和某种类型的只读存储器,通常称为闪存(它可以多次编程而无需从印刷电路板上移除)。

简单的嵌入式应用程序将可执行和只读数据部分放在 Flash 中并在 Flash 外执行。读/写变量被放入 RAM。让我们为您的示例代码片段考虑这个模型:

  char * c = "Hello World!";

在上面的语句中,变量c 存在于 RAM 中,因为变量的默认设置是读写访问。如果您指定变量是常量,它将存在于 ROM 中 实际上,它代表 ROM 中的一个位置。:在此处输入代码

char * const c = "Hello World!"; // A constant pointer that lives in ROM.

编译器将文字文本"Hello World!" 处理得稍微复杂一些。实际的文本存在于 ROM 中,要么在可执行区,要么在数据区;取决于译者。许多编译器会在 RAM 中分配内存并将文字复制到 RAM 中,并使变量 c 指向 RAM 中的副本。这是因为没有将文字指定为常量。

为避免将文字复制到 RAM 中,请声明指向常量数据的变量:

const char * c = "Hello World"; // A pointer to constant data.

上面的定义仍然允许指针在执行过程中指向不同的东西。如果您想在整个程序中引用文本文字的一个实例,请声明一个指向常量数据的常量指针:

const * char * const c = "Hello World!"; // A constant pointer to constant data

此技术允许可执行文件加载到 RAM(以加快执行速度)并仍然从 ROM 访问只读数据(这为真正的读/写变量释放 SRAM)。

在大多数 PC 上,所有内容都存在于非易失性内存(硬盘驱动器、BIOS 等)或 RAM 中。常用的方法是从 ROM(包括硬盘)加载程序并在 RAM 中执行。将可执行文件加载到 RAM 时,操作系统通常也会将只读数据加载到 RAM 中。只读数据可能会受到操作系统的保护,因此当应用程序写入该区域时会产生异常。

【讨论】:

【参考方案4】:

它存储在 RAM 中。

用字符串初始化的字符指针,就像在你的例子中一样,是只读的。 你可以cast a const variable so that you can "write" to it,但是你的程序的行为是不可预测的。

RAM 的只读区域受操作系统保护。

这可能因您使用的系统类型而异。上面的答案适用于您的标准 PC。嵌入式系统实际上可能会将常量数据写入某种非易失性存储器。

【讨论】:

【参考方案5】:

如果有帮助,请考虑内存只读的两种不同方式。

在硬件级别,您指的是 ROM。一旦写入/创建,它的物理属性就不允许改变它的值。 在软件级别,操作系统(或高于用户程序空间的其他级别)防止修改存储在 RAM 中的值。

当您谈论程序值的只读内存时,您通常是在谈论第二种类型。这些值在程序启动时被初始化,然后操作系统不允许修改它们。

注意:以上是一个极其简单的解释,但它确实给出了大致的概念。

【讨论】:

【参考方案6】:

它存储在 RAM 内存中。 ]:>

【讨论】:

以上是关于程序如何加载到 ROM 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何编译一个可以烧写进手机中的ROM,Android安卓开发者

android手机 如何才能把软件安装到系统分区(rom)下?

如何解决使用keil下载或者调试程序是提示的“Invalid ROM Table”信息!

单片机如何实现IAP升级啊?升级程序应该在制定的位置吧,要不它也就被擦除了吧?只能升级其他的ROM吧?

如何使用spflashtool备份mtk rom

如何自己编译android系统并制作刷机包