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
相关推荐
2401_894915534 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
huainingning8 小时前
R4930-G7服务器(RAID-LSI-9560-LP-8i-4GB)网页方式做Raid方法
服务器
我是乌鸦的空间9 小时前
什么是网络安全中的电子数据取证与响应?
网络·网络安全
跨境旺仔小拳头9 小时前
如何使用Crawl4AI进行网页爬虫?从0搭建教程与代理配置指南
网络·人工智能·爬虫·chatgpt·aigc
沫儿笙9 小时前
焊接机器人氩弧焊省气装置
网络·机器人
ltl9 小时前
QUIC 握手实现:Initial 到 1-RTT 的最小路径
linux
80s77710 小时前
什么是动态IP?静态IP和动态IP有什么区别?
网络·网络协议·tcp/ip
小杨不想秃头11 小时前
信息安全工程师教程第二章密码学
运维·服务器·密码学
I'mChloe11 小时前
WGCLOUD怎么监控多台服务器?从Server、Agent 部署到监控面板实战
运维·服务器
那年窗外下的雪.11 小时前
AIDC 学习日志|第 15 天|EVPN 多归属故障收敛与撤销机制
网络·学习·php