2 在链接脚本中,可以使用PROVIDE命令来指定_start的地址,例如:PROVIDE(_start = 0x80000000);
3 在编译器参数中,可以使用-T选项来指定链接脚本的路径,例如:arm-linux-gcc -T xxxld。
延伸:_start是程序的入口地址,它的值通常由链接器生成,并被写入程序的头部信息中。
在嵌入式系统中,由于系统资源有限,需要精确控制程序的加载和运行地址,因此需要手动设置_start的地址。本人用的android平台用的bootloader用的是uboot,貌似大多数手持设备平台都不用这个,因为功能过于强大用不上,反而显得太复杂了。不知道这个平台开发者是怎么想的。既然用了那就来分析一下,顺便修改一下其中的几个小问题,以符合我们的要求。
uboot等同于其他所有的bootloader程序,从根本上讲是一个稍复杂的裸机程序,是最底层的东西,要分析裸机程序我们要从它的连接文件开始。连 接文件(lds文件)定义了程序编译之后整个连接过程,这样我们就可以找到这个程序的第一句汇编代码,进而来下一步分析。uboot的链接文件代码在 android\bootable\bootloader\uboot-imx\u-bootlds
[cpp] view plaincopy
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //文件输出格式
OUTPUT_ARCH(arm)
ENTRY(_start) //首地址标示符
SECTIONS
{
= 0x00000000; //其实地址0
= ALIGN(4); //4字节对齐
text : //代码段
{
board/freescale/mx6q_sabresd/flash_headero (textflasheader) //第一个文件是board/freescale/mx6q_sabresd/flash_headero
cpu/arm_cortexa8/starto //第二个cpu/arm_cortexa8/starto
board/freescale/mx6q_sabresd/libmx6q_sabresda (text)
lib_arm/libarma (text)
net/libneta (text)
drivers/mtd/libmtda (text)
drivers/mmc/libmmca (text)
= DEFINED(env_offset) env_offset : ;
common/env_embeddedo(text)
(text) //剩余的所有代码
}
= ALIGN(4);
rodata : { (SORT_BY_ALIGNMENT(SORT_BY_NAME(rodata))) } //readonly data 段
= ALIGN(4);
data : { (data) } //所有的readonly data
= ALIGN(4);
got : { (got) }
= ;
__u_boot_cmd_start = ; //u_boot_cmd段,里面是所有uboot命令的一个列表
u_boot_cmd : { (u_boot_cmd) }
__u_boot_cmd_end = ;
= ALIGN(4);
_end_of_copy = ;
__bss_start = ; //bss段 就是内存数据段
bss : { (bss) }
_end = ;
}
从上面的代码可以看出我们编译生成的二进制应用程序组成是:代码段->rodata段->uboot命令列表->bss段。我们启动这个应用程序时候是从,0地址开始的,因此我们来看
board/freescale/mx6q_sabresd/flash_headers这个文件。
这个文件中除了分配内存和宏定义的伪汇编指令以外,真正执行的命令有一条
[cpp] view plaincopy
section "textflasheader", "x"
b _start
org CONFIG_FLASH_HEADER_OFFSET
也就是说,这个文件一执行就直接跳到_start 位置处。_start 在android\bootable\bootloader\uboot-imx\cpu\arm_cortexa8\ startS中,因此我们来看这个文件代码
[cpp] view plaincopy
globl _start
_start: b reset
这里直接跳转的reset中接下来看
[csharp] view plaincopy
reset:
/
set the cpu to SVC32 mode cpu设置成32位管理模式
/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
#if (CONFIG_OMAP34XX) //因为我们的cpu不是ompa的 所以这段不会编译
#endif
/ the mask ROM code should have PLL and others stable /
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
这里接下来执行cpu_init_crit
[csharp] view plaincopy
/
CPU_init_critical registers
setup important registers
setup memory timing
/
cpu_init_crit:
/
Invalidate L1 I/D
/
mov r0, #0 @ set up for MCR
mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
/
disable MMU stuff and caches //关闭mmu
/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB
mcr p15, 0, r0, c1, c0, 0
/
Jump to board specific initialization
The Mask ROM will have already initialized
basic memory Go here to bump up clock rate and handle
wake up conditions
/
mov ip, lr @ persevere link reg across call
bl lowlevel_init @ go setup pll,mux,memory//执行lowlevel_init这个函数代码在
@\bootloader\uboot-imx\board\freescale\mx6q_sabresd\lowlevel_initS中
@主要对时钟,外部ram,rom等进行了初始化代码不贴了。
mov lr, ip @ restore link
mov pc, lr @ back to my caller
初始化完成后,接下来执行
[csharp] view plaincopy
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: @ relocate U-Boot to RAM 将uboot重新定位到内存中
adr r0, _start @ r0 <- current position of code
ldr r1, _TEXT_BASE @ test if we run from flash or RAM
cmp r0, r1 @ don't reloc during debug测试当前代码是否已经在内存中
beq stack_setup @如果在的话就直接跳转到stack_setup
ldr r2, _armboot_start @如果不在的话,加载_armboot_start地址到r2中。_armboot_start是uboot执行的主体c函数。
ldr r3, _bss_start
sub r2, r3, r2 @ r2 <- size of armboot计算bss_start-armboot_start 保存到R2中,也就是uboot的总大小
add r2, r0, r2 @ r2 <- source end address 计算出uboot代码和rodata地址
copy_loop: @ copy 32 bytes at a time //开始拷贝
ldmia r0!, {r3 - r10} @ copy from source address [r0]
stmia r1!, {r3 - r10} @ copy to target address [r1]
cmp r0, r2 @ until source end addreee [r2]
ble copy_loop
#endif / CONFIG_SKIP_RELOCATE_UBOOT /请问你是想问u-boot中怎么配置64位物理地址吗?u-boot中配置64位物理地址,需要进行以下步骤:
1、u-boot中启用64位支持,这可以通过在u-boot的配置文件中设置CONFIG_SYS_SUPPORT_64BIT_DATA为1来实现。
2、在u-boot的配置文件中定义64位物理地址的宏,例如:#definePHYS_64BIT。
3、在u-boot中使用64位物理地址的设备驱动程序,需要将64位物理地址转换为32位虚拟地址进行 *** 作。这可以通过使用u-boot提供的函数phys_to_virt()和virt_to_phys()来实现。
4、在u-boot中使用64位物理地址的应用程序中,需要使用无符号长整型(unsignedlonglong)类型来表示64位物理地址。直接下载最新安装包bin档使用“路由器手动升级”完成刷机。
首先——你要有一只U盘(最少128MB)。
其次——请确保呢个U盘的档案系统格式为 FAT或FAT32格式。
最后—— *** 作流程阅读特别提示并确认备份已经完成后,请按照以下步骤 *** 作:
1、请将下载的安装包bin文件复制到U盘的目录。
2、将U盘里的bin档重命名为miwifi_r1cm_firmwarebin。
3、断开小米路由器mini的电源,将U盘插入USB介面。
4、按下reset按钮后重新接入电源,指示灯变为闪烁状态后松开reset键。
5、整个u盘刷机的时间相比正常OTA升级更长一些,因为呢种刷机方式会将小米路由器mini的系统重新刷一遍。
6、刷机完成之后系统会自己重启并进入正常的启动状态(黄灯常亮—蓝灯常亮)。
7、如果出现异常/失败/U盘无法读取状态,会进入红灯状态,建议重试或更换U盘再试。
8、正常启动显示蓝灯,完成刷机。
升级开发版完成,就可以体验增加功能了。Printenv 打印环境变量。
uboot> printenv
baudrate=115200
ipaddr=1921680111
ethaddr=32:34:46:78:9A:DC
serverip=1921680100
Environment size: 80/8188 bytes
2 Setenv 设置新的变量
如:
uboot> setenv myboard AT91RM9200DK
uboot> saveenv
uboot> printenv
baudrate=115200
ipaddr=1921680111
ethaddr=32:34:46:78:9A:DC
serverip=1921680100
myboard=AT91RM9200DK
Environment size: 102/8188 bytes
又如想重置启动参数bootargs:
uboot> setenv bootargs 'noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0'
uboot> saveenv
3 saveenv 保存变量 命令将当前定义的所有的变量及其值存入 flash 中。 用来存储变量及其值的空间只有 8k 字节,应不要超过。 (如上例,每次与setenv配合使用)
4 loadb 通过串口 Kermit 协议下载二进制数据。
5 tftp 通过网络下载程序,需要先设置好网络配置
简单配置:
uboot> setenv ethaddr 32:34:46:78:9A:DC
uboot> setenv ipaddr 1921680111
uboot> setenv serverip 1921680100
//下载 bin 文件到地址 0x20000000 处。
uboot> tftp 20000000 applicationbin (applicationbin 应位于 tftp 服务程序的目录)
uboot> tftp 32000000 zImagebin
把 server (IP=环境变量中设置的 serverip) 中 FTP配置的默认目录下的 zImagebin通过 TFTP 读入到物 理内存 32000000 处。
6 md 显示内存区的内容。
7 mm 修改内存,地址自动递增。
8 nm 修改内存,地址不自动递增。
9 mw 用模型填充内存
uboot>mw 32000000 ff 10000(把内存 0x32000000 开始的 0x10000 字节设为 0xFF)
10 cp 拷贝一块内存到另一块
11 cmp 比较两块内存区
这些内存 *** 作命令后都可加一个后缀表示 *** 作数据的大小, 比如 cpb 表示按字节拷贝。 Protect 写保护 *** 作 protect on 1:0-3(就是对第一块 FLASH 的 0-3 扇区进行保护) protect off 1:0-3 取消写保护 Erase 擦除扇区。
12 nfs
uboot>nfs 32000000 19216802:zImagebin 把 19216802(LINUX 的 NFS 文件系统)中的 NFS 文件系统中的 aatxt 读入内存 0x32000000 处 (19216802是配置的NFS服务器地址,且要复制的文件必须在NFS配置的服务目录下)
uboot 命令使用教程(uboot参数设置)的更多相关文章
U-Boot命令大全(功能参数及用法)
U-Boot上电启动后,按任意键可以退出自动启动状态,进入命令行 U-Boot 201003 (Sep 25 2011 - 16:18:50) DRAM: 64 MB Flash:
uboot命令及内核启动参数
修改:mw [内存地址] [值] [长度] 例如:mw 0x02000000 0 128 表示修改地址为0x02000000~0x02000000+128的内存值为0 显示:md [内存地址
PM2用法简介命令行启动 --env 参数设置使用问题
环境切换 正式开发中分为不同的环境(开发环境测试环境生产环境),我们需要根据不同的情景来切换各种环境 pm2通过在配置文件中通过env_xx来声明不同环境的配置,然后在启动应用时,通过--env参
u-boot 环境变量参数设置
今天本来是烧写内核,结果一不小心把uboot也整不能用了,无奈之下只好重新烧个uboot,等都弄好以后,发现系统还是启动不了,原来是启动参数设置不对,于是找到了这篇文章,//是我添加的内容 原文地址
Uboot 命令行 介绍
背景 基本上,本文转载自:<ARM板移植Linux系统启动(五)Uboot命令行> 上次说到uboot的启动方式,最后会使用autoboot(自主模式)尝试引导kernel,如果失败或者被
uboot命令简介
uboot下的命令行 1典型嵌入式linux系统启动过程: 嵌入式系统上电后先执行uboot然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(
烧写ARM开发板系统教程----->uboot 、内核以及文件系统
一sd启动 将u-boot镜像写入SD卡,将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是
1ok6410移植bootloader,移植u-boot,学习u-boot命令
ok6410移植u-boot 既然是移植u-boot当然首先需要u-boot源码,这里的u-boot代码是由国嵌提供的 一配置编译u-boot A 解压 u-boot 压缩文件 B 进入解压生
转载 uboot 命令
1bootm bootm [addr [arg ]] - boot application image stored in memory passing arguments 'arg ' 直接文件系统列举吧烧写uboot、内核及文件系统 :1、uboot烧写
载Uboot两步骤第步uboot载系统扩展RAM并运行第二步通内存运行uboot整uboot载内存再烧写nandflash
第步 载uboot扩展RAM
首先使用短路块选择系统内部启复位或者电串口软件(115200 8 n 1)看打印信息LPC31xx READY FOR PLAIN IMAGE>使用串口软件发送文件选择发送u-boot-initbin再发送u-bootbinRAM启uboot打印输启信息并进行倒计发送任意字符给系统停止计关闭串口软件使用超级终端连接系统
第二步 烧写ubootnandflash
超级终端输入loady命令再使用传送/发送文件选择Ymodem协议发送u-bootbin接收完先擦除nand erase全擦掉(用给参数)使用使用参数指定区域般第要全擦使用nand_paramsflash信息写入其使用nand write 0x30001000 0x4000 0x100000
其0x30001000 uboot内存址;
0x4000 ubootflash存放起始址需要根据实际区情况定;
0x100000 uboot于实际;
至uboot写入nandflash短路跳线掉使其nandflash启
2、内核烧写
uboot启倒计击任意键停止输入loady与uboot烧写相似使用命令主要:nand erase 0x200000(址) 0x200000()
nand write 0x30001000 0x200000 0x200000
3、文件系统烧写
文件系统烧写通与内核相似使用串口烧写通挂载nfs使用mtd_debug 工具烧写由于文件系统较使用第种式慢些
串口烧写使用命令
loady
nand erase 0x600000 0x3a00000(目前区情况)
nand write 0x30001000 0x600000 0x800000(实际)
使用nfs烧写用命令
mtd_debug erase /dev/mtd2 0 0x3a00000
mtd_debug write /dev/mtd2 0 0x800000 ubiimg
各项含义参考mtd_debug 帮助直接mtd_debug 即获取说明其len使用十进制数uboot加0x认十六进制
4、启挂载文件系统选项
uboot通环境变量设置启选项般需要配置挂载文件系统nfsubi及内核启选项
挂载nanflashubifs:
setenv bootargs console=ttyS0,115200n8 ubimtd=2 root=ubi0:rootfs rootfstype=ubifs;
挂载12914199/rfs/rootfs并且本机ip设12913133等:
setenv bootargs noinitrd root=/dev/nfs console=ttyS0,115200n8 nfsroot=12914199:/rfs/rootfs,proto=tcp,nfsvers=3,nolock ip=12913133:12914199:1291881:25525500::eth0:off
启内核选项:
setenv bootcmd nand read 0x30001000 0x200000 0x200000\; bootm 0x30001000\;
修改uboot环境变量都需要saveenv命令保存修改miwifi固件下分区情况:Bootloader就是ubootcat /proc/mtddev: size erasesize namemtd0: 01000000 00010000 “ALL”mtd1: 00030000 00010000 “Bootloader”mtd2: 00010000 00010000 “Config”mtd3: 00010000 00010000 “Factory”mtd4: 00c80000 00010000 “OS1”mtd5: 00b2717e 00010000 “rootfs”mtd6: 00200000 00010000 “OS2”mtd7: 00100000 00010000 “overlay”mtd8: 00010000 00010000 “crash”mtd9: 00010000 00010000 “reserved”mtd10: 00010000 00010000 “Bdata”mtd11: 00fa0000 00010000 “firmware”可以看到如同当初小米宣传的那个样子OS1、OS2,呵呵 备份(u盘挂载点是/extdisks/sda1)dd if=/dev/mtd1 of=/tmp/Bootloaderbindd if=/dev/mtd2 of=/tmp/Configbindd if=/dev/mtd10 of=/tmp/Bdatabin还原mtd -r write /tmp/Bdatabin Bdatamtd -r write /tmp/Configbin Config
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)