一个嵌入式系统从软件角度分为三个层次
1,引导加载程序 包含固化在固件中的boot程序(如BIOS),和Bootloader(如grub或lilo)两个部分。
2,linux内核
3,文件系统:包含应用程序和系统命令
BIOS在完成硬件检测和资源分配后,Bootloader将硬盘中的引导程序读到系统内存中,然后跳转到内存运行。
嵌入式系统一般没有boot,只需要bootloader,一种bootloader重新上电会跳到内存Flash 0x00000000开始执行。另一种bootloader 会进行一些硬件设备初始化,然后,跳转到bootloader指定的flash位置启动os内核。
编译bootloader 常用的指令
一般用 arm-linux-gcc hello.c -o hello 编译文件
反汇编命令 arm-linux-objdump -D -S hello >hello.txt (>hello.txt 把结果重定向到 hello.txt)
ELF文件查看 arm-linux-readelf -a hello (可以查看大段小段模式,及运行平台)
arm-linux-readeld -d hello (查看hello使用的动态链接库)
编译uboot的源文件boot中的主要目录
board 和开发板相关的文件 如board/samsung/smdk6410
common uboot命令
cpu 处理器对应的文件
uboot常用命令
help查看所有命令
printfenv: 查看当前环境变量
setenv : 添加环境变量 如setenv test 123 (添加环境变量 值123) setenv test (删除环境变量)
saveenv:保存当前环境变量 这样重启自己添加的环境变量就不消失了
tftp 下载文件
tftp c0000000 zImage (zImage 存在与宿主机tftp服务器的目录下)
nand
nand info 查看nandflash 大小
nand erase 100000 700000 擦除 100000 到700000数据
go addr 运行addr(地址)的应用
make menuconfig
打开之后会出现选项,y 为* n为空 m为M
(*) a.c --- a.o ----- zImage 既编译又连接
(*) b.c --- b.o ----- zImage 既编译又连接
(M) d.c --- d.o 只编译不连接
( ) e.c 不编译
至于内核选项该如何配置,可以Google下Linux内核配置详解。由于太多不列举。
平时配置时,可以到/arch/arm/configs找到和开发板相近的config进行修改配置
cp /arch/arm/xxx_config /forlinux/linux3.0.1 也就是.config所在的目录(ls -a查看)
make zImage V = 1会列出详细的编译信息,便于查找出错
生成的文件在 arch/arm/boot/ 下zImage