如何在ROM中加载程序
How is a program loaded in ROM?
当你在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内存中。]:>
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- C 链接器错误尝试包含Tiny OBJ加载程序标头文件
- 如何将项目共享"system calls"作为单例对象构建和链接到引导加载程序?
- OpenCL 从二进制加载程序
- 使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统
- OpenGL ES模型加载程序示例
- 模拟动态加载程序以修复共享库偏移
- 带有c/cpp材料文件的Wavefront obj加载程序
- Qt-setText()加载程序
- Linux 进程加载程序在 C++
- 在win32加载程序之前执行代码
- 将共享库与dlopen一起使用-共享对象找不到加载程序导出的符号
- 简单的进程加载程序内存映射
- 重载内存映射文件加载程序(C++)
- 如何防止在加载程序中重新创建页面
- 加载程序如何从动态模块分配/取消分配静态数据
- 从内存嵌入加载程序集
- Irrlicht Collada 加载程序警告:发现错误的标记用法:库控制器
- 如何查找加载程序 DLL 的路径
- 服务加载程序找不到服务提供程序类,即使类与 META-INF/services 位于同一 JAR 文件中也是如此