我期待了解内存映射在嵌入式系统中的用途。这里的函数堆栈与普通的 unix 系统有何不同。
任何可以帮助我调试嵌入式系统内存相关崩溃的见解都会有所帮助。
嵌入式系统,尤其是实时系统,通常有大量静态分配的数据,和/或放置在内存中特定位置的数据。内存映射告诉您这些东西在哪里,这在您遇到问题并需要检查系统状态时会很有帮助。例如,您可能会转储所有内存,然后在事后对其进行分析;在这种情况下,内存映射将非常方便地查找您怀疑可能与问题相关的对象。
在代码方面,您的系统可能会记录一个硬件异常,该异常指向检测到异常的指令地址。查找函数的内存位置,结合函数的反汇编,可以帮助您分析此类问题。
细节实际上取决于您正在构建什么样的嵌入式系统。如果您提供更多详细信息,人们可能会给出更好的回应。
我不确定我是否理解这个问题。您似乎在暗示“内存映射”是嵌入式系统独有的东西,或者它是有形的软件组件。两者都不是;它只是对应用程序内存使用布局的描述。
无论平台如何,所有应用程序都将具有内存映射,不同之处在于通常在嵌入式系统上,应用程序链接为单个整体实体,因此最终的内存布局指的是整个系统,而不是可能的单个进程GPOS 平台上的应用程序。
决定内存映射的是链接器和链接器脚本,您的链接器将能够输出一个映射报告文件,描述应用的布局和分配。无论操作系统或架构如何,嵌入式和桌面应用程序都是如此。
RTOS 的内存映射与任何计算机的内存映射没有太大区别。它定义了哪些硬件驻留在处理器的哪个地址。该硬件可以是 RAM、ROM、闪存、串行端口、并行端口、定时器、中断向量或处理器可寻址的任何数量的其他部分。
内存映射还描述了您打算如何为系统设计中的 RAM、ROM 或闪存等有限资源进行预算。
例如,如果有多个任务正在运行,则可能会映射 RAM,以便每个任务都有自己的特定 RAM 区域分配给它。
反过来,每个任务的 RAM 部分将被映射,以便有特定区域用于堆栈,另一个用于静态变量,也许还有更多用于堆。
当你在目标上有一个操作系统时,它会动态地处理很多这样的事情。但是,如果您的应用程序是设备上唯一的软件,则您必须自己管理这些决定,通常是在编译/链接时。搜索“链接脚本”以获取更多线索,
内存映射是系统内存的布局。它存在于嵌入式系统和普通应用程序中。虽然它存在于普通应用程序中,但由于系统限制,它在嵌入式系统中的使用得到了很好的认可。
内存映射通过链接器脚本或链接器命令文件进行管理。它映射资源,如闪存或内部 RAM(L1P、L1D、L2、L3)或外部 RAM(DDR)或 ROM 或外围设备(端口、串行、并行、USB 等)或特定设备寄存器或具有适当固定地址的 I/O 端口在系统的内存空间中。
在嵌入式系统的情况下,根据内存配置或板卡和性能要求的限制,文本段或数据段或 BSS 等段也可以放置在选择的适当内存中。
在某些情况下,不同版本的开发板会有不同的内存和外设配置。在这种情况下,我们可能需要根据电路板的内存配置和外围设备编辑链接器脚本,作为电路板启动中的一个重要检查点。
内存映射也可以帮助定义共享内存,这可以在多线程应用程序和多核应用程序中发挥关键作用。
可以通过回溯崩溃的地址并将其映射到系统的内存来调试崩溃,以获得对可能导致问题的库或对象的高级概念。