访问通过 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
传输的文件内容的原因,您正在从一个不正确但有效的地址读取。
我正在尝试访问通过 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
传输的文件内容的原因,您正在从一个不正确但有效的地址读取。