访问通过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

我认为您的逻辑可能有误:您正在使用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传输的文件的内容的原因,因为您正在从错误但有效的地址进行读取。