Operating system 关于基于ROM的可执行文件的基本问题

Operating system 关于基于ROM的可执行文件的基本问题,operating-system,cpu,computer-architecture,embedded,Operating System,Cpu,Computer Architecture,Embedded,我对存储在ROM中的可执行文件有基本的怀疑 据我所知,具有text和RO属性的可执行文件存储在ROM中。问题是,由于ROM是只读内存,如果代码需要写入内存,会发生什么情况 我无法在这里举出任何例子(可能我对这种情况一无所知,或者我遗漏了一些基本的东西;),但对这个话题的任何了解都可以极大地帮助我理解!) 最后一次- 1.有没有这种情况? 2.在这种情况下,将代码从ROM复制到RAM是答案吗 用一些例子来回答会很有帮助 非常感谢 /MS通常只有程序代码、常数和初始化数据存储在ROM中。RAM中的单

我对存储在ROM中的可执行文件有基本的怀疑

据我所知,具有text和RO属性的可执行文件存储在ROM中。问题是,由于ROM是只读内存,如果代码需要写入内存,会发生什么情况

我无法在这里举出任何例子(可能我对这种情况一无所知,或者我遗漏了一些基本的东西;),但对这个话题的任何了解都可以极大地帮助我理解!)

最后一次- 1.有没有这种情况? 2.在这种情况下,将代码从ROM复制到RAM是答案吗

用一些例子来回答会很有帮助

非常感谢


/MS通常只有程序代码、常数和初始化数据存储在ROM中。RAM中的单独内存区域用于堆栈、堆等。

由于硬件限制,只读内存是只读的。该程序可能位于闪存中,防止写入、CD-ROM或任何硬件物理上不允许写入的地方。如果软件写入ROM,则硬件无法更改存储的数据,因此不会发生任何事情

因此,如果中的软件程序想写入内存,它会写入。这是唯一的选择。如果一个程序是从ROM运行的,并且想要,它不能,因为它不能写入ROM。但是,是的,程序可以从RAM运行

事实上,除了最小的嵌入式系统外,从ROM运行是很少见的。操作系统在运行可执行代码之前将其从ROM复制到RAM。有时在ROM中,必须在运行前解压缩到RAM中。如果RAM已满,操作系统将使用它进行管理。从ROM运行的原因如此罕见,是因为ROM比RAM慢,有时代码需要在运行前由管理员更改


请注意,如果您有修改自身的代码,那么您确实需要了解您的系统。许多系统使用(DEP)。可执行代码进入RAM的读+执行区域。数据进入读写区。因此,在这些系统上,代码永远无法在RAM中自行更改。

您希望在运行时修改代码部分的正当理由很少。编译器本身不会生成需要该功能的代码

链接器将具有生成映射文件的选项。这将告诉您所有内存对象的位置

链接器根据链接器脚本(您可以根据需要自定义以组织内存)选择定位位置。通常,在基于闪存的微控制器上,代码和常量数据将放置在ROM中。也将非零初始化静态数据的初始化数据放置在ROM中,在调用main()之前将其复制到RAM中。在main()之前,零初始化静态数据被简单地清除为零

可以安排链接器在ROM中定位部分或全部代码,并让运行时启动代码以与非零静态数据相同的方式将其复制到RAM中,但代码必须是可重新定位的,或者在第一个实例中定位到RAM中,通常,您不能将打算从ROM运行的代码复制到RAM并期望它运行,因为其中可能有绝对地址引用(除非您的目标具有MMU并且可以重新映射地址空间)。在微控制器上的RAM中定位通常是为了提高执行速度,因为当使用高时钟速度时,RAM通常比闪存快,从而产生更少或零等待状态。当代码在运行时从文件系统加载而不是存储在ROM中时,也可以使用它。即使加载到RAM中,如果处理器有MMU,RAM部分中的代码部分很可能会被标记为只读。

Harvard architecture Microscors 许多小型微控制器(Microchip PIC、Atmel AVR、Intel 8051、Cypress PSoC等)都有哈佛体系结构。 它们只能从程序存储器(闪存或ROM)执行代码。 可以将程序内存中的任何字节复制到RAM中。 然而,(2)将可执行指令从ROM复制到RAM并不是答案——对于这些小型微控制器,程序计数器总是指向程序存储器中的某个地址。不可能在RAM中执行代码

将数据从ROM复制到RAM是很常见的。 首次通电时,典型的固件应用程序会将所有RAM归零,然后在main()启动之前将非常量全局变量和静态变量的初始值从ROM复制到RAM中。 每当应用程序需要将固定字符串从串行端口推出时,它都会从ROM中读取该字符串

对于这些微控制器的早期版本,连接到微控制器的外部“设备程序员”是更改程序的唯一方法。 在正常操作中,该设备与“设备程序员”相去甚远。 如果微控制器上运行的软件需要写入程序存储器ROM——对不起,太糟糕了-- 这是不可能的。 许多嵌入式系统都有非易失性EEPROM,代码可以写入,但这只是用于存储数据值。微控制器只能执行程序ROM中的代码,而不能执行EEPROM或RAM中的代码。 人们用这些微控制器做了很多奇妙的事情,包括基本的解释器和字节码解释器。 因此显然(1)代码永远不需要写入程序内存

使用一些最新的“自编程”微控制器(来自Atmel、Microchip、Cypress等), 芯片上有特殊的硬件,允许微控制器上运行的软件擦除和重新编程自己的程序存储器闪存块。 一些应用程序使用这种“自编程”功能来读取和写入数据到“额外”闪存块——这些数据从未执行过,因此它不算是自修改代码——但这并不是使用更大的EEPROM所不能做到的。 到目前为止,我只看到两种软件在哈佛体系结构微控制器上运行,它们可以编写新的可执行软件