访问通过 tftp 加载的内存

Accessing memory loaded via tftp

我正在尝试访问通过 tftp 加载的文件中的数据。我使用的是 AM3358 处理器

tftp 81000000 mydata

我可以看到数据正在正确加载

=> md 81000000
81000000: 00004000 00000000 00002000 00000400    .@....... ......

在 u-boot 代码中,我创建了一个指向该地址的指针,然后尝试取消引用它,但该值不正确,这让我觉得我使用了不正确的地址

unsigned long addr = 0x81000000;
uint32_t *ptr = &addr;
uint32_t val = *(ptr+0);
printf("addr %ul val: %ul", addr, val);

此外,我试图将mydata的地址加载到32位LCD寄存器中,但是0x81000000的物理地址超出了32位数字的物理地址。我想我只是对这里涉及的地址映射感到困惑。

bdi 收益率

=> bdi
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x20000000
baudrate    = 115200 bps
TLB addr    = 0x9fff0000
relocaddr   = 0x9ffb4000
reloc off   = 0x1f7b4000
irq_sp      = 0x9df8ba90
sp start    = 0x9df8ba80
Early malloc usage: 4a8 / 1000
fdt_blob    = 0x9df8bea0

为什么 0x81000000 不是有效的 32 位数字?

0x00000000 <= 0x81000000 <= 0xFFFFFFFF。

我认为您的逻辑可能有误:您初始化ptr时使用的是addr的地址,而不是其内容的地址。

正确的代码应该是这样的:

uint32_t addr = 0x81000000;
uint32_t *ptr = (uint32_t*)(uintptr_t) addr;
uint32_t val = *(ptr+0);
printf("addr %ul val: %ul", addr, val);

这可以在您的 PC 上进行测试 - 您可能需要添加对构建 32 位应用程序的支持,即在 Ubuntu.

上执行 sudo apt-get install gcc-multilib

ptr.c:

#include <stdio.h>
#include <stdint.h>

int
main ()
{
  uint32_t addr = 0x81000000; // gcc 9.3.0 is complaining about uint32_t *ptr = &addr;
  
  // your code
  {
    uint32_t *ptr = &addr;
    printf ("%p\n", ptr);
  }

  // correct code
  {
    uint32_t *ptr = (uint32_t *) (uintptr_t) addr;
    printf ("%p\n", ptr);
  }
}

gcc -m32 -o ptr ptr.c

./ptr
0xff83bc60
0x81000000

这就是为什么您无法访问使用 TFTP 传输的文件内容的原因,您正在从一个不正确但有效的地址读取。