---------------------------------------------------------0x5800_0000 - /* 最顶刚好是128M */
| Stack(512KB) | | /* 可以比较好的兼容 */
--------------------------------------------------------- | /* 128M和256M的系统 */
| Malloc pool(1MB) + env(128KB) | |
--------------------------------------------------------- |
| IRQ+FIQ Stack(未实现) | |
--------------------------------------------------------- |
| gd_info(bd_info) | |
--------------------------------------------------------- |
| ............................ | |
-------------------------------------------------------- |
| LCD/VFD Buffer | |
--------------------------------------------------------- - monitor_end |
| .bss | | 2MB
--------------------------------------------------------- | |
| .mmudata | | |
--------------------------------------------------------- | |
| .u_boot_cmd | | |
--------------------------------------------------------- monitor_flash |
| .got | | |
--------------------------------------------------------- | |
| .data+.rodata | | |
--------------------------------------------------------- | |
| .text | | |
---------------------------------------------------------0x57E0_0000 - monitor_base - /* copy_from_nand只拷贝240kb到 */
| linux_kernel | /* sdram,可根据实际修改uboot */
---------------------------------------------------------0x5000_8000(uImage的地址最好加载到
| linux_mmu_page_table | 0x5000_7FC0,省去再搬运)
---------------------------------------------------------0x5000_4000(1级页表,包含4096个项,每个
| ....................... | 32bit,共16KB)
--------------------------------------------------------- (Uboot包头重叠部分解压已无效)
| 通过gd->bd->bi_boot_params指向,启动参数 |
| 用于存放需要传递给linux的TAG列表 |
---------------------------------------------------------0x5000_0100
nandflash地址分配:
0x0-0x400000 UBOOT
0x400000-0xC00000 Linux_Kernel
(bootm默认加载8MB到0x5000_0000)
(可以通过bootcmd设定加载任意大小kernel镜像到任意位置,常加载$(file_size(uboot.bin))到0x5000_8000)
(bootargs规定roofs在mtdblock2,串口波特率为115200)
0xC00000-0x80000000 root_FS
内核分为五种:
1.vmlinux(73M,由顶层Makefile产生)
是一个elf格式的文件
2.arch/arm/boot/compressed/vmlinux(3.8M,由boot/compressed目录下.vmlinux.cmd产生)
是经过压缩的elf格式的文件
3.Image(7.6M,由boot目录下.Image.cmd产生)
是经过objcopy 处理了的只包含内核代码,数据的一个文件,已经不是elf格式的了,此时还没有经过压缩
4.arch/arm/boot/zImage (3.7M,由boot目录下.zImage.cmd产生)
是对Image进行压缩的镜像文件,用作启动的时候需要Linux进行自解压
5.arch/arm/boot/uImage(zImage+64Bytes,由boot目录下.uImage.cmd产生,友善提供的uboot自带mkimage(mkuboot.sh)),可以
通过uboot工具对镜像进行二次压缩(一般不会用到),启动时由uboot进行解压
启动时对于支持mmu的系统,第一个执行文件为head.S,否则为head-nommu.S
从bootm的源码看,Uboot应该是支持Image,zImage,uImage三种格式的
Image的具体内容可以是内核或者是独立的应用程序
bootp和tftpboot都是通过netboot_common()实现的,只是前者使用bootp协议,后者使用tftp协议,netboot_common最终还是调用的bootm
nand read.i=read.e=read.jffs2 write.i=write.e=write.jffs2
nand write.yaffs=write.yaffs1(uboot代码里面多了个“+”,不知道是不是bug)
由于uboot中使能了MMU,但是没有对0x5000_0000这段地址进行映射,因此仍然可以使用这一段物理地址
另外loadx貌似文件太大的时候会出错,最好还是用tftp或者nfs
执行mkubimage出错解决方法:
sudo apt-get install liblzo2-2
启动参数命令:
tftpboot:
tftpboot 50000000 Image
写入NAND:
nand write 50000000 400000 700000
NFS:
setenv bootcmd “tftpboot c0008000 Image;bootm c0008000”
setenv bootargs “console=ttySAC0,115200 kgdbwait kgdboc=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.10:/mnt/rootfs ip=192.168.1.30:192.168.1.10:192.168.1.1:255.255.255.0:linux.arm11.net:eth0:off”(使用串口作为终端)
setenv bootargs “console=tty1 kgdbwait kgdboc=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.10:/mnt/rootfs ip=192.168.1.30:192.168.1.10:192.168.1.1:255.255.255.0:linux.arm11.net:eth0:off”(使用LCD作为终端)
setenv bootargs “console=ttySAC0,115200 user_debug=0xff kgdbwait kgdboc=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.10:/mnt/rootfs ip=192.168.1.30:192.168.1.10:192.168.1.1:255.255.255.0:linux.arm11.net:eth0:off”(打开所有应用段错误提示)
NAND:
setenv bootcmd “nand read 50008000 400000 700000;bootm 50008000”
setenv bootargs “console=ttySAC0,115200 kgdbwait kgdboc=ttySAC0,115200 root=/dev/mtdblock2”(yaffs)
setenv bootargs “console=ttySAC0,115200 kgdbwait kgdboc=ttySAC0,115200 root=ubi0:FriendlyARM-root ubi.mtd=2 rootfstype=ubifs”(ubifs)
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv ipaddr 192.168.1.30
setenv serverip 192.168.1.10
LPC3250的启动过程:
(1)由于3250不支持从SDCARD等外存储介质启动,需要使用光盘中的bootloader.bin(连接地址为IRAM,0x0800_0000),通过串口将这个固件加载到IRAM中运行,随后配合上位机软件将boot(kickstart、stage1)固化到启动源:SPIFlash、NorFlash、Nand。
(2)启动时只会将启动源前56kb数据搬运到IRAM(0x00~0xE000,对于Nor不进行搬运),因此专门做了一个体积小的kickstart(从0地址开始运行之后,使用位置无关码,自搬运到IRAM最后32KB地址上,因此连接地址为0x38000),kickstart用于后续代码搬运,被引导的stage1(被加载到IRAM的0地址开始运行,因此连接地址为0x00)功能已经比较成熟,可以操作DRAM,可以对Nand进行读写、配置MMU、UART等等板上硬件,配置完成后将硬件参数保存到EEPROM,方便下次启动调用,如果将kernel引导操作添加其中就是一个完整的bootloader了
(3)通过stage1硬件初始化之后,跳转到Uboot,引导kernel,其实如果将stage1的底层操作集成到Uboot的第一阶段是完全可以只做一个boot固件的