三大部分: bootloader(uboot) linux内核 文件系统
嵌入式系统:
以应用为中心, 计算机技术为基础, 软、硬件均可裁剪, 满足应用对 功能、稳定性、体积、功耗、成本等的要求
gcc -v --save-temps ---------- 查看编译过程
crosstool-ng 制作交叉编译工具链
下载源码包:
http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.xz
autoreconf
./configure --enable-local
make
make install
命令:
./ct-ng help
./ct-ng list-samples
./ct-ng menuconfig
./ct-ng build
linux下的几个命令: binutils
elf 格式: 可执行 可链接的格式
readelf -S a.out -------------- 查看都a.out 可执行程序的段的信息,
./a.out ------------ 执行a.out ,
vi a.out ---------- :%!xxd 以16进制的方式打开a.out
ar 打包命令:
gcc -c a.c
gcc -c b.c
ar cr libtest.a a.o b.o ------------ 打包a.o b.o生成静态库test
ar t libtest.a ---------------- 查看静态库test 包含的.o文件
ar x libtest.a ---------- 解压libtest.a
strip libtest.a ---------- 去除掉libtest.a 的调试信息
nm libtest.a ---------- 查看libtest.a 的符号信息 ( 包含全局变量, 函数名)
ldd a.out ----------- 查看a.out 依赖 的动态库
objdump -dl a.out 反汇编a.out 到汇编语言
bootloader 的操作模式:
自启动模式:
在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入
交互模式:
在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。
u-boot:
命令:
?---------- 查看支持的命令
boot ----------- 执行bootcmd 变量的内容
run var1 ---------- 执行变量var1 所描述的几条指令
pri -------- 查看支持的变量
setenv --------- 设置、修改、删除变量
save -------- 保存变量到emmc
tftp -------- u-boot的tftp客户端命令
tftp 41000000 uImage ------------- 从服务器的tftp文件夹下载uImage 到内存41000000
问题: 1, ip同一网段? 2, ping 通? 3, sudo service tftpd-hpa restart
电子硬盘的movi 命令:
movi write kenel 41000000
烧写内存41000000 开始的内容到电子硬盘的内核(kernel) 分区
movi write dtb 41000000
烧写内存41000000 开始的内容到电子硬盘的设备树(dtb) 分区
movi write u-boot 41000000
烧写内存41000000 开始的内容到电子硬盘的u-boot 分区
movi write rootfs 41000000 size
烧写内存41000000 开始的内容大小是size 到电子硬盘的文件系统分区
movi read kernel 41000000 从电子硬盘读kerenl分区的内容 到 41000000
movi read dtb 42000000 从电子硬盘读dtb分区的内容 到 42000000
movi read rootfs 43000000 size 从电子硬盘读文件系统分区的内容 到 43000000 大小限制为size
bootm ----------- 从内存启动命令, 后跟3个参数 , 依次是内核在内存的地址,文件系统在内存的地址(如果是nfs , - ) , 设备树在内存的地址
bootm 41000000 43000000 42000000
变量:
serverip ------------- 告诉u-boot 服务器的ip
ipaddr --------- 告诉u-boot 板子自身的ip,
bootcmd -------- 在启动时,默认执行该变量的内容, 该变量的内容是几条命令
自启动:
setenb bootcmd movi read kernel 41000000\; movi read dtb 42000000\;movi read rootfs 43000000 300000\;bootm 41000000 43000000 42000000
交互模式:
setenb bootcmd tftp xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
bootargs : 启动参数的变量
setenv bootargs root=/dev/nfs nfsroot=192.168.222.145:/home/farsight/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.222.146
root=/dev/nfs ---------- 内核使用的是nfs
init=/linuxrc -------- 内核启动后, 挂载文件系统之后,执行的1号进程