如何在ROM中加载程序

How is a program loaded in ROM?

本文关键字:加载 程序 ROM      更新时间:2023-10-16

当你在windows上运行一个程序时,它会被加载到计算机内存中,组织为:

  • 数据段
  • 堆栈
  • 代码段

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

例如:

char *c = "Hello World";

字符串CCD_ 1被称为存储在存储器的只读部分中。它是存储在有时被称为RAM的物理存储器中,还是存储在只读存储器中?如果它是只读的,怎么能写出来?

一台电脑只有一个真正符合ROM条件的内存区域,那就是BIOS的存储区域。所有的Windows和加载在Windows中的程序都将在RAM中。

x86处理器内存管理可以将内存块标记为只读,但链接器和操作系统必须协同工作才能实现这一点。它发生在程序加载到内存之后。

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

在许多嵌入式系统中,它们都有RAM和某种类型的只读存储器,通常被称为闪存(它可以在不从印刷电路板上移除的情况下进行多次编程)。

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

  char * c = "Hello World!";

在上面的语句中,变量c存在于RAM中,因为变量的默认设置是read&写入访问。如果您指定变量是常量,它将存在于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)。

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

它存储在RAM中。

用字符串初始化的字符指针(如您的示例中所示)是只读的。您可以强制转换const变量,以便对其进行"写入",但程序的行为是不可预测的。

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

这可能取决于你使用的系统类型。上面的答案适用于你的标准PC。嵌入式系统实际上可能会将恒定数据写入某种非易失性存储器。

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

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

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

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

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