linux boot 烧写纪要以及内存相关分析

1, printenv

8197F# printenv

baudrate=38400

ethact=eth0

ethaddr=00:00:00:81:97:f0

fileaddr=a0a00000

filesize=2bdf2

ipaddr=192.168.1.6

serverip=192.168.1.55

stderr=serial

stdin=serial

stdout=serial

Environment size: 189/65532 bytes

查看网络互通性

8197F# ping 192.168.1.100

Using eth0 device

host 192.168.1.100 is alive

1,tftpput

8197F# tftpput 0xa0a00000 0x40000 192.168.1.100:uboot.bin

Using eth0 device

TFTP to server 192.168.1.100; our IP address is 192.168.1.6

Filename 'uboot.bin'.

Save address: 0xa0a00000

Save size: 0x40000

Saving: #################

3.4 MiB/s

done

Bytes transferred = 262144 (40000 hex)

2,tftpboot

8197F# tftpboot 0xa0a00000 192.168.1.100:boot.bin

Using eth0 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.6

Filename 'boot.bin'.

Load address: 0xa0a00000

Loading: #############

4.5 MiB/s

done

Bytes transferred = 179698 (2bdf2 hex)

3, 烧写测试

sf erase 0x0 0x40000

将下载的 uboot.bin 写入 Flash 起始位置

sf write 0xa0a00000 0x0 0x40000

两个分区查看

8197F# md.b 0xa0000000

a0000000: a9 8c 31 95 ff ff eb bf 7f fb ff ff ff ff ff f7 ..1.............

a0000010: ff ff ff ff ff df ef df ff ff ff ff ff ff ff ff ................

a0000020: ff ff ff ff ff ff ff ff ff fb ff ff ff ff ff ff ................

a0000030: ff ff ef ff ff ff fd ff ff ff ff ff ff ff ff fd ................

8197F# md.b 0x80000000

80000000: a9 8c 31 95 ff ff eb bf 7f fb ff ff ff ff ff f7 ..1.............

80000010: ff ff ff ff ff df ef df ff ff ff ff ff ff ff ff ................

80000020: ff ff ff ff ff ff ff ff ff fb ff ff ff ff ff ff ................

80000030: ff ff ef ff ff ff fd ff ff ff ff ff ff ff ff fd ................

读出boot.bin整个镜像

8197F# sf probe

flash vendor: EON

tangtao@SF: Detected EN25QX128A with page size 256 Bytes, erase size 64 KiB, total 16 MiB

8197F# sf read 0xa0a00000 0x0 0x40000

SF: 262144 bytes @ 0x0 Read: OK

8197F# tftpput 0xa0a00000 0x40000 192.168.1.100:boot_read.bin

Using eth0 device

TFTP to server 192.168.1.100; our IP address is 192.168.1.6

Filename 'boot_read.bin'.

Save address: 0xa0a00000

Save size: 0x40000

Saving: #################

1.8 MiB/s

done

Bytes transferred = 262144 (40000 hex)

地址范围 缓存 (Cache) 用途 访问速度
KSEG0 0x8000_0000 ~ 0x9FFF_FFFF 带缓存 (Cached) 正常运行代码、数据
KSEG1 0xA000_0000 ~ 0xBFFF_FFFF 无缓存 (Uncached) 寄存器、设备、早期启动 慢、稳定

1,缓存差异(最重要)

KSEG0:走 Cache,速度快,但DDR 初始化前不能用。

KSEG1:不走 Cache,直接读写物理地址,DDR 初始化前也能用。

  1. 与你之前的 boot.bin/u-boot.bin 关系

boot.bin (SPL):

运行在 KSEG1(因为 DDR 还没初始化,不能用缓存)

u-boot.bin:

运行在 KSEG0(DDR 已初始化,开启 Cache 加速)

  1. 地址换算公式(超级实用)

物理地址 0xXXXXXXX ↔ 虚拟地址

KSEG0 虚拟地址 = 物理地址 + 0x80000000

KSEG1 虚拟地址 = 物理地址 + 0xA0000000

8197F# bdinfo

arch_number = 0x00000000

boot_params = 0x80000100

DRAM bank = 0x00000000

-> start = 0x80000000

-> size = 0x08000000

ethaddr = 00:11:22:33:44:55

ip_addr = 192.168.1.10

baudrate = 38400 bps

relocaddr = 0x80F80000

reloc off = 0x80F80000

fdt_blob = 0x80F80000

sp = 0x80F7EF10

flashstart = 0xBC000000

flashsize = 0x01000000

flashoffset = 0x00000000

示例操作

1. 查看 DDR 起始 64 字节内容
复制代码
md 0x80000000 40   # 显示 64 字节(每行 16 字节)
2. 查看 Flash 起始 256 字节内容(通过 KSEG1 访问,绕过缓存)
复制代码
md.b 0xBC000000 100   # 显示 256 字节
3. 比较内存中两份数据(例如验证写入)
复制代码
cmp.b 0x80000000 0x81000000 0x1000
4. 向 DDR 写入测试数据
复制代码
mw.l 0x80010000 0xdeadbeef 10   # 向 0x80010000 写入 10 个字
5. 将 Flash 内容读到内存
复制代码
# 从 Flash 地址 0xBC000000(虚拟)读取 256KB 到内存 0x80020000
cp.b 0xBC000000 0x80020000 0x40000
相关推荐
yy_xzz1 小时前
【Linux开发】 04 Linux UDP 网络编程
linux·网络·udp
123过去2 小时前
mdb-sql使用教程
linux·网络·数据库·sql
m0_694845572 小时前
Docker 从入门到实践教程:docker_practice 完整学习指南
运维·服务器·docker·容器·云计算·github
hweiyu002 小时前
Linux命令:pgrep
linux·运维·服务器
eam0511232 小时前
HCIA复习实验
网络
瑞瑞大大2 小时前
国家“东数西算”工程八大算力枢纽节点及10个国家数据中心集群介绍
网络
belldeep2 小时前
python:Scapy 网络数据包操作库
网络·python·抓包·scapy
23.2 小时前
【分析】网络不通会显示404吗?
网络
爱写Bug的小孙2 小时前
多智能体概述
服务器·数据库·ai·oracle·agent·多智能体·agentscop