使用 "md" Uboot 可以看到什么类型的内存?
What type of memory is Uboot able to see using "md"?
我在这方面完全是个新手,我偶然发现了一些我找不到答案的东西。我目前正在使用一个名为 Toradex Verdin iMX8MM 的基于 Linux 的系统。当我将它启动到 U-boot 时,我可以看到某种内存。这是通过标准的“md”命令完成的。为了好玩,我尝试打印一堆不同的地址,然后在 u-boot 中显示这些地址。这似乎使系统崩溃,我无法查看那些特定地址。这是否意味着它有某种不同的内存、某种访问被拒绝或正在发生什么?我粘贴了下面用于打印 som 地址的代码。
#include <lib.h>
#include <stdio.h>
#include <unistd.h>
static char mystr[256] = "Hello There\n";
int main(int argc, char const *argv[])
{
while(1){
static char str[14] = "Hello World\n";
printf("%s", mystr);
printf("%s", str);
printf("point %p\n", str);
printf("main %p ",(char*)main);
sleep(3);
}
}
我的命令例如:
MD 0xaaaadb65040
抛出错误
aaaadb65040:"Synchronous Abort" handler, esr 0x96000004
elr: 00000000402758cc lr : 0000000040275830 (reloc)
elr: 00000000bff858cc lr : 00000000bff85830
x0 : 000000000000000c x1 : 00000000308600b4
x2 : 00000000bff36890 x3 : 0000000000000000
x4 : 00000aaaadb65040 x5 : 00000000bd70efe8
x6 : 00000000bff9fbf4 x7 : 0000000000000004
x8 : 00000000bd70f9e8 x9 : 0000000000000008
x10: 00000000ffffffd0 x11: 0000000000000010
x12: 0000000000000006 x13: 000000000001869f
x14: 00000000bffa9c50 x15: 0000000000000021
x16: 00000000bff5581c x17: 00000000000041a0
x18: 00000000bd70fdb8 x19: 0000000000000040
x20: 00000aaaadb65040 x21: 00000aaaadb65040
x22: 00000000bff9f11c x23: 0000000000000008
x24: 0000000000000009 x25: 0000000000000004
x26: 0000000000000004 x27: 00000000bd70faa8
x28: 0000000000000004 x29: 00000000bd70fa20
Code: 12800000 17ffffcf 7100135f 54000201 (b9400085)
Resetting CPU ...
resetting ...
您能看到的内容取决于您使用的特定处理器的内存映射。一般来说,如果某个东西被映射到物理内存的地址X
,你可以使用md
读取它,mw
写入它。
现在您显示的代码看起来像一个简单的 C 程序,通常 运行 在用户 space 中。这在这里行不通,因为确实有 none 支持基础设施。对于系统的探索,这不是最有用的途径。
如果你想在内存中四处看看,找到有问题的特定处理器的手册(它会在启动日志的前面说明它是什么),然后查看不同的外围设备以及它们映射到的位置默认在内存中。可能有点令人困惑,请记住 DRAM 只是另一个外围设备,它会出现在内存中的一个范围内,而 GPIO 控制器会出现在内存中的另一个位置。
我在这方面完全是个新手,我偶然发现了一些我找不到答案的东西。我目前正在使用一个名为 Toradex Verdin iMX8MM 的基于 Linux 的系统。当我将它启动到 U-boot 时,我可以看到某种内存。这是通过标准的“md”命令完成的。为了好玩,我尝试打印一堆不同的地址,然后在 u-boot 中显示这些地址。这似乎使系统崩溃,我无法查看那些特定地址。这是否意味着它有某种不同的内存、某种访问被拒绝或正在发生什么?我粘贴了下面用于打印 som 地址的代码。
#include <lib.h>
#include <stdio.h>
#include <unistd.h>
static char mystr[256] = "Hello There\n";
int main(int argc, char const *argv[])
{
while(1){
static char str[14] = "Hello World\n";
printf("%s", mystr);
printf("%s", str);
printf("point %p\n", str);
printf("main %p ",(char*)main);
sleep(3);
}
}
我的命令例如: MD 0xaaaadb65040
抛出错误
aaaadb65040:"Synchronous Abort" handler, esr 0x96000004
elr: 00000000402758cc lr : 0000000040275830 (reloc)
elr: 00000000bff858cc lr : 00000000bff85830
x0 : 000000000000000c x1 : 00000000308600b4
x2 : 00000000bff36890 x3 : 0000000000000000
x4 : 00000aaaadb65040 x5 : 00000000bd70efe8
x6 : 00000000bff9fbf4 x7 : 0000000000000004
x8 : 00000000bd70f9e8 x9 : 0000000000000008
x10: 00000000ffffffd0 x11: 0000000000000010
x12: 0000000000000006 x13: 000000000001869f
x14: 00000000bffa9c50 x15: 0000000000000021
x16: 00000000bff5581c x17: 00000000000041a0
x18: 00000000bd70fdb8 x19: 0000000000000040
x20: 00000aaaadb65040 x21: 00000aaaadb65040
x22: 00000000bff9f11c x23: 0000000000000008
x24: 0000000000000009 x25: 0000000000000004
x26: 0000000000000004 x27: 00000000bd70faa8
x28: 0000000000000004 x29: 00000000bd70fa20
Code: 12800000 17ffffcf 7100135f 54000201 (b9400085)
Resetting CPU ...
resetting ...
您能看到的内容取决于您使用的特定处理器的内存映射。一般来说,如果某个东西被映射到物理内存的地址X
,你可以使用md
读取它,mw
写入它。
现在您显示的代码看起来像一个简单的 C 程序,通常 运行 在用户 space 中。这在这里行不通,因为确实有 none 支持基础设施。对于系统的探索,这不是最有用的途径。
如果你想在内存中四处看看,找到有问题的特定处理器的手册(它会在启动日志的前面说明它是什么),然后查看不同的外围设备以及它们映射到的位置默认在内存中。可能有点令人困惑,请记住 DRAM 只是另一个外围设备,它会出现在内存中的一个范围内,而 GPIO 控制器会出现在内存中的另一个位置。