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
相关推荐
huainingning2 小时前
RJ SW Console口忘记密码处理方法
linux·运维·服务器
布裘2 小时前
【银河麒麟】桌面系统循环登录,无法进入桌面?
linux·运维·服务器
慧都小项3 小时前
程序到了Linux才出错?用CLion把调试接到目标环境
linux·运维·服务器
汤姆yu3 小时前
Gemini 4 Argon模型综述:技术、能力与实际使用指南
网络·安全·web安全·ai·大模型
Seraphina364 小时前
SQL注入(二)盲注
网络·数据库·经验分享·笔记·sql
Ruiery5 小时前
Linux 6.6内核内存管理深度解析(一):物理内存初始化 — memblock 怎么把内存交给 buddy
linux·运维·服务器
2401_868534785 小时前
无线网络规划设计
服务器·网络
螺蛳粉 螺蛳粉5 小时前
第二篇:keepalived VRRP 原理篇:协议与 VIP 漂移机制深入解析
网络·智能路由器·负载均衡·keepalived·高可用
库拉镜像AI牛牛5 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
天蓝蓝的本我5 小时前
conda日常用到的命令积累1-登录linux,安装pycharm
linux·pycharm·conda