bootloader原理和开发——>kernel构建——>文件系统/根文件系统(filesystem/rootfs)
APP
一、配置交叉编译环境(可参考嵌入式Linux移植与驱动开发cortexa8中交叉工具链的安装)
1、准备文件arm-cortex_a8-linux-gnueabi.tar.bz2
2、解压以上文件到当前用户目录下,如/home/linux/gcc
3、进入超级用户模式sudo -s
4、用vi打开/etc/bash.bashrc文件配置环境变量,在文件最后添加下面一句话
export PATH=$PATH:/home/linux/gcc/arm-cortex_a8-linux/bin/
5、使用source /etc/bash.bashrc更新下,以便虚拟机重启后该配置仍生效
6、修改Makefile文件,用于arm架构下编译源文件
二、开发板下载程序三种方法
1、RS232
2、Net Ethernet网线
3、USB
三、头文件、初始化文件、驱动等等,文件最好分门别类存放
四、GCC过程&头文件及库的使用方法
编译器环境arm-cortex_a8-linux-gnueabi-
1、GCC
gcc -E预处理 生成 .i
gcc -c编译 生成 .s
gcc -S汇编 生成 .o
gcc -ld链接 ld可不写 生成可执行文件
2、头文件用法
自定义头文件在使用gcc时用参数 -I头文件路径
3、静态库
arm-cortex_a8-linux-gnueabi-gcc -I$(INCLUDE) -c hello/hello.c -o hello/hello.o
arm-cortex_a8-linux-gnueabi-ar -rcs hello/libhello.a hello/hello.o
静态库,运行可执行文件不再需要
4、动态库
arm-cortex_a8-linux-gnueabi-gcc -I$(INCLUDE) -c good/good.c -o good/good.o
arm-cortex_a8-linux-gnueabi-gcc -shared -fpic -o good/libgood.so good/good.o
动态库,运行可执行文件也需要指定库文件名以及库文件路径
5、反汇编命令
arm-cortex_a8-linux-gnueabi-objdump -d test>test.dis
6、生成bin文件
arm-cortex_a8-linux-gnueabi-objcopy -o binary test test.bin
7、缩减test文件大小,丢弃一些不要的东西
arm-cortex_a8-linux-gnueabi-strip test
8、打印出文件中的字符串,用法同7,strip改为string
五、搭建下载环境(TFTP与NFS的配置可参考嵌入式linux操作系统的使用中网络配置一文)
1. 开发板tftp使用
1.1 开发板跟tftp服务器通过网线相连
1.2 在开发板串口终端ping tftpserver (ping 192.168.3.3)
host 192.168.3.3 is alive
需要设置环境变量(printev setenv)
gatewayip=192.168.1.1
ipaddr=192.168.3.5
netmask=255.255.0.0
serverip=192.168.3.3
例:
setenv ipaddr 192.168.3.5
saveenv
1.3 设置tftp 服务器端服务(主机)
sudo /etc/init.d/tftpd-hpa restart
tftpd-hpa stop/waiting
tftpd-hpa start/running, process 11471
安装tftp --> 配置服务器 (sudo vim /etc/default/tftpd-hpa)
--> 本机测试(tftp localhost)-->开发板测试(tftp 20008000 zImage go 20008000)
1.4 设置nfs 服务 (主机)
sudo /etc/init.d/nfs-kernel-server restart
Exporting directories for NFS kernel daemon...
* Starting NFS kernel daemon
安装tftp服务--> 配置nfs (sudo vim /etc/exports)-->提供rootfs (tar xvf rootfs.tgz)
---> 本机测试(sudo mount -t nfs localhost:/source/rootfs ./temp)-->开发板测试
开发板终端:
setenv bootargs root=nfs nfsroot=192.168.3.3:/source/rootfs ip=192.168.3.5 init=/linuxrc console=ttySAC0,115200
saveenv
1.5再次tftp 20008000 zImage---->go 20008000
注:setenv bootcmd tftp 20008000 zImage;go 20008000一键执行 run bootcmd
六、将编译好的zImage及制作好的文件系统固化在nand flash中,zImage使用地址 100000-400000 nfs使用地址400000-800000
1、使用命令nand erase 100000 300000 //插除nand flash中100000~400000地址的数据 300000为数据块size(大小)
2、tftp 20008000 zImage //zImage为编译好的bootleader程序
3、使用命令nand write 20008000 100000 300000 //将
zImage写入nand flash中100000~400000地址范围内
4、使用命令nand erase 400000 400000
5、tftp 20008000 rootfs.cramfs //rootfs.cramfs为制作好的文件系统
6、使用命令nand write 20008000 400000 400000
7、改bootcmd——>setenv bootcmd nand read 20008000 100000 300000;go 20008000
8、改bootargs——>setenv bootargs root=/dev/mtdblock2 ip=192.168.1.111 init=/linuxrc console=ttySAC0,115200
注:此外u-boot也是通过这个方法写入Nand Flash中。
Nand Flash中内容的构成一般为:
七、将写好的裸机代码xxx.bin烧写到nand中
1、nand erase a00000 4000 !!!要注意文件大小 4000的size 最多只能放16K的文件
2、nand write 20008000 a00000 4000
3、setenv bootcmd nand read 20008000 a00000 4000;go 20008000 //将nand flash中a00000中4000size的数据读取到内存20008000的地址处,然后执行内存20008000地址开始的代码程序