uboot编译、根文件系统制作、系统移植

时间:2021-03-29 09:05:41
uboot学习
uboot是DENX开发的BootLoader程序
支持linux、VxWorks、qnx
下载地址:ftp:ftp.denx.de/pub/u-boot/
目录架构
board:支持的开发板
common
cpu:处理器核
disk:
doc:
drivers:驱动
dtt:
examples:
fs:
include:开发板的配置文件
lib
net:网络协议的支持
post
test 
tools 
arch
cmd
configs
fs
uboot编译
配置再编译:
配置:$make EmbedSky_config//选择要使用的board,根据makefile里面所需要的板子名字,修改make 后面的目标
make cross_compile = arm-linux-//设置使用交叉编译环境

得到uboot。bin 烧写到零地址

使用JTAG少些BOOTLOADER

/移植配置文件没有讲




uboot 命令
环境变量相关
printenv 显示所有的环境变量;
print 环境变量的名字
setenv 环境变量名字 值//没有值就会删除这个环境 
saveenv  将上一步添加的环境变量 保存到flash中
文件下载相关
setenv ethaddr // ip //
tftp 3080000 zimageinit  //tftp 保存地址   下载的文件名字
ping ip //
内存相关
md.b 30000000 // 按二进制显示地址里的内容 
mm.b 30000000 // 修改 一个字节一个字节的根据提示敲 


flash 相关
nor flash 速度快,放代码,成本高,
nandflash 速度慢,擦除快,放数据,自己变地址
nand info //nandflash信息
nand erase start length//擦除 
nand write 内存地址 flash地址 长度


norflash
flinfo //信息
protect off all//关闭扇区写保护
protect on all//打开扇区写保护
protect off start end//关闭从start到end的写保护
cp.b ..


开始执行程序
go addr [arg……]//执行地址处的程序


bd_info 显示开发板信息archnumber env_t boot_params …………


嵌入式linux内核制作
BootLoader linux内核  根文件系统
编译内核
make distclean//清除所有配置
make menuconfig  ARCH = arm  //不加arm的话 选项里面都是X86的cpu,使用交叉编译工具
make zImage ARCH = arm CROSS_COMPILE = arm-linux-//编译内核,zimage 和uimage的差别首先产生zimage 再产生uimage 。在zimage前面加上一个48字节的头,压缩方式等。使用zimage
利用tftp下载到开发板的310000000地址上 flash,讲内核在写到nandflash 中
boot_zimage命令启动内核
////////////////////////////////////
根文件系统制作
文件系统类型、
看得见的目录和文件
看不见的管理目录和文件需要的数据
1.创建目录和文件
makdir rootfs
cd rootfs
makdir bin dev etc lib proc sbin sys usr mnt tmp var 
makedir  usr/bin usr/lib usr/sbin lib/modules 
创建设备文件
cd dev/
mknod -m 666 console c 5 1 //配置的参数 去查一下
mknod -m 666 null c 1 3 
...
安装/etc
tar etc.tar.gz -C ./rootfs/  //其实就是系统需要的一些文件直接放到这个etc目录下,顺便建立目录
编译内核模块
进入linux 内核目录 
make modules ARCH = arm CROSS_COMPILE = arm-linux-//可以修改内核配置,把需要的模块加上,.ko文件
把模块安装到文件系统中
安装内核模块
make modules_install ARCH = arm INSTALL_MOD_PATH = /home/rootfs  //???把内核拷到新建的文件系统中
结果是什么?
其实就是拷贝到了根文件系统中
看一下根文件系统目录有什么变化
modules 下面会出现内核模块//内核模块 可以动态加载,不需要的时候可以去掉,释放内存


配置busybox//嵌入式的瑞士军刀
进入busybox目录执行//配置bin目录的下的脚本,和一些工具
make menuconfig//选择自己需要的东西
1.配置build为静态链接
2.配置交叉编译的前缀
3.在installation option中指定 不要安装到开发机上了,配置成根文件系统的目录下的bin
4.其他功能根据自己的需要配置
make ARCH= arm CROSS_COMPILE = arm-linux-//编译 OK;
执行 file busybox 查看详细信息
make install //安装
进入到根文件系统中查看,bin目录下就有了这些配置,这些文件都会连接到busybox中开始执行


//新建目录、安装模块、busybox生成脚本和工具软连接


2.为创建好的目录和文件建立管理数据
选择文件系统:产品需求 硬件
flash:
nor:容量小速度快
nand:容量大,速度慢一点

jffs/jffs2:用于norflash。可读写,支持数据压缩,
yaffs/yaffs2:用于nandflash。不支持数据压缩 可选择ubifs性能优于yaffs2
cramfs:只读,压缩方式存储,速度快,效率高。
ramdisk:将内存划成磁盘墨迹技术;基于此模拟技术运行ext2。不支持动态内存划分。
initramfs:相对于ramdisk,动态分配内存。




//网络文件系统
NFS:网络共享文件的技术
可以挂在到嵌入式设备中。
演示如何把之前配置好的系统组织成initramfs根文件系统
1.配置内核使用
进入到linux内核中 
make menuconfig ARCH= arm
配置initramfs:general setup/initramfs/ 需要配置建的根文件目录所在的地址,告诉内核编译时需要的东西放在那里。配置保存在,.config文件里
2.进入制作好的根文件系统中,执行
ln -s ./bin/busybox init //添加一个软连接在init上
3.编译内核
make zimage arch = arm cross_compile = arm-linux-


将生成的镜像 拷到flash中 。
会将根文件系统直接编译到镜像中 完美。
搭建NFS
**清除之前的initfile配置**这是两种不同的文件系统,调试使用NFS 实际使用init。。。
配置内核为使用NFS的内核
配置选中networkfilesystem 选中NFSclient support /root file system on nfs
保存退出
将开发机配置成NFS服务器
vi /etc/export
目录 IP  权限同步。。
重启nfs /etc/init.d/nfs restart


将编译好的内核,下载开发板中,配置开发板
设置NFS参数  服务器和客户端ip,掩码,目录
改完了作为系统启动的输入参数,启动系统。
这些目录实际不在开发板上,在虚拟机上。