【问题标题】:How to dereference a specific address in memory through dereferencing another address in memory?如何通过取消引用内存中的另一个地址来取消引用内存中的特定地址?
【发布时间】:2016-08-10 09:56:33
【问题描述】:

我在我的项目中将引导加载程序用作 hex 和 s19 文件,因此我不允许修改其内容。在此引导加载程序中,有一部分以以下方式实现,以验证我的应用程序是否为有效应用程序:

#define CHECK_PATTERN_ADDRESS ((int32)0x00020000)
#define VALID_PATTERN             ((int16)0xE900)
#define VALID_PATTERN_MASK        ((int16)0xFF00)

    int16    pattern_data = *(int16 *)CHECK_PATTERN_ADDRESS;
    if ((pattern_data & VALID_PATTERN_MASK) == VALID_PATTERN)
    {
        //Valid application
    }
    else
    {
        //Not Valid application
    }

从上面的代码中,为了让引导加载程序认为我的应用程序有效,需要将有效模式放在提到的地址“0x00020000”中。

下载应用程序时,此模式直接加载到此地址。

这是通过使用包含此模式的程序集文件并通过链接器文件指定将其加载到内存中的地址来完成的。

因此,目前在我的应用程序下载过程中,有效模式已成功加载到提到的地址“0x00020000”中。

主要约束是:

引导加载程序应在此特定地址“0x00020000”中找到有效模式

问题是:

我需要在另一个地址“假设 0x00040000”中添加我的有效模式,而 DLL 将继续从请求的地址“0x00020000”中取消引用数据..

不过,我可以通过汇编文件将任何数据添加到原始地址“0x00020000”,或者直接将任何特定的十六进制数据添加到该地址。

问题是:

我可以在这个地址“0x00020000”中加载什么,这样当引导加载程序在其代码中“如上所述”使用它时,它将采用在另一个地址“0x00040000”中加载的值

【问题讨论】:

  • DLL?那是 Win32 的东西,不是嵌入式的,当然也与引导加载程序无关。特别是,DLL 运行在进程的地址空间中。而那些有虚拟地址空间。
  • 是的,你写的是,我的意思是它被用作十六进制和 s19 文件..我没有任何修改它的代码的能力..我会在原始帖子中修改。 . 谢谢..
  • IOW,DLL 包含一个 S19/hex 文件,用于将某些东西刻录到 EPROM 或类似的东西中,或用于仿真器?
  • 刻录到 EPROM .. 用于真实目标“MPC”
  • 进入 EPROM 的内容,应该将地址 0x00020000 的字节设置为 0xE90x00020001 的另一个字节可以设置为任何东西,在 big-endian 平台上.. 在 little-字节序是 0x00020000 被忽略的另一种方式,0x00020001 必须有 0xE9)。我不明白你在问什么,你在0x00040000 中输入的任何内容都将在0x00040000 中,除非某些指令加载该值并将其放入0x00020000(在主机平台上)。但是您可能不会要求这样做,您可能希望在将源数据刻录到 EPROM 之前对其进行修补?

标签: c++ c assembly embedded bootloader


【解决方案1】:

在 0x00020000 处,您可以放置​​知道 0x00040000 “扩展”的代码的起点。然后,无需任何进一步的修改,您的引导加载程序将照常引导该代码,并且该代码(我们将其称为“辅助引导加载程序”)将引导您放置在 0x00040000 下的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2013-09-16
    • 1970-01-01
    • 2020-04-17
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多