第一部分 uboot模式下的烧写命令(开发板)
1.Ubuntu模式防火墙关闭指令:/etc/init.d/iptables stop
setenforce 0
2.在uboot模式下,查看所有uboot命令为 help 或者 ?
设置环境变量的几个命令:
打印环境变量:printenv 或者print 打印所有环境变量
printenv xxx(环境变量名) 查看具体环境变量
设置环境变量值:setenv xxx(环境变量名) yyy(环境变量值)
当环境变量名不存在就创造并赋值,存在就将其值更改,当后面的值为空时,将环境变量删除
保存环境变量值:saveenv 将内存的值写入flash中,永久保存相当于 Linux中的sync命令。
3.tftp是开发板uboot支持的命令,相当于预设的客户端,只要配置好服务器的tftp并且设置开发板的环境变量ethaddr(开发板mac地址) ipaddr(开发板IP地址) serverip(服务器IP地址)就可以使用tftp命令(在uboot和正常模式下都能使用tftp,不过配置和使用的方式不一样) 在uboot的使用格式为 tftp 555555(获取到本地的内存地址) xxxx(服务器ip):yyy(文件名)
tftp在正常模式下配置环境变量与使用:
开发板配置:vi /etc/init.d/rcS
#TL-WN321G+
ifconfig lo 127.0.0.1
ifconfig eth0 down
ifconfig hw ether 00:25:11:62:68:XX
ifconfig eth0 192.168.15.1XX netmask 255.255.255.0 up
route add default gw 192.168.15.1
服务器Ubuntu的搭建:(pc端)
安装:sudo apt-get install tftp-hpa tftpd-hpa
配置:sudo gedit /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="xxx(共享目录:绝对路径)"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
开启:①sudo service tftpd-hpa restart //开启tftp服务
②确保虚拟机和开发板网络互通
使用:tftp -g -r hello_arm 192.168.15.3
把hello_arm从远程主机192.168.15.3下载到开发板中
-g:get获取
-r:远程获取
hello_arm:你要获取文件
192.168.15.3 :从哪里获取
tftp -p -l libcall.so 192.168.15.3
把本地的文件 libcall.so上传到192.168.15.3的机器上的共享目录下 -p 上传 -l 本地
4.在uboot模式下,可以使用bootm执行固定格式的二进制文件(由工具mkimage在已生成文件上加载特殊格式文件头)
执行命令为 bootm {addr}(内存地址) {arg}(参数)
5.内存查看与更改命令 md与mm 执行格式
md[.b .w .l] {addr} md.d 0x400000 以一个字节一个字节间隔显 示内存0x400000的内容
Mm[.b .w .l] {addr} 命令输入后在打印后面写入你要修改的值回 车 当你不想在修改了 空格加回车
6.uboot模式下flash擦除,读取与烧写。
nand erase {flash_addr}(擦除的起始地址) {lenth}(擦除的长度)
nand erase 600000 500000 从flash中600000擦除50000个字节
nand write {内存地址} {flash地址} {长度lenth}
将内存地址中长度lenth的数据写入到flash地址中去
nand write 40000000 600000 500000
nand read {内存地址} {flash地址} {长度lenth}
将flash地址中长度lenth的数据读出来到内存地址中去
第二部分 Linux内核
内核下载地址:www.kernel.org Linux内核官网包含所有内核版本
1.内核组成:分为内核空间和用户空间:
内核空间:系统API函数接口,体系结构设置和代码
用户空间:APP应用,用户配置文件
划分原因:在CPU中有七个工作模式,每一种模式访问的寄存器 不同,将操作系统运行在更高级别的模式中保护起 来,防止APP应用来干扰操作系统造成当机
两种空间的交互:系统调用和硬件中断
2.内核空间:由七个子系统构成:
SCI:系统调用函数接口 VFC:虚拟文件系统
PM:进程管理系统 NS:网络协议栈
MM:内存管理系统 DD:设备驱动
ARCH:体系结构相关代码(狭义内核与CPU相关,系统移植需要修改的部分)
3.内核配置:内核配置命令:在内核文件最顶层使用
make menuconfig(菜单栏形式)
make config(交互式询问式)
内核配置说明:* 表示编译加载到内核镜像中加载呆内存 中去执行
M表示编译成动态模块,但是不直接挂在内 核中运行,将编译好的模块文件放到相 应的文件夹保存在硬盘中,有需要的时 候挂载进来。
空 表示不编译,放弃这个功能。
内核配置原因:
网上下载的内核文件包含了很多功能和不同系统架构,进行菜单栏式模块选定的作用是对内核文件进行相应的宏设置,编译裁剪出适合当前工作需要的功能生成相应的二进制文件。减少内核二进制文件的大小
内核配置原则:使用已经配置好的配置文件 不清楚的保持默认
配置内核的方法:
①获取已经好的配置文件:看配置需求,可以获取项目组他人设置好配置文件config,也可以拷贝已有的再细微修改,Linux系统下/boot/config(可能全名不是这个)到你需要编译的内核顶层目录下,ARM平台的内核配置文件在 /arch/arm/configs
②加载配置文件:执行 make menuconfig ,将光标移动到末尾, 进入加载一个配置文件选项,将需要的配置文件名以./配置文件 名 的形式输入。
4.内核的编译:编译分三步:内核镜像的编译(选择为*),内核模块的编译(选 择为M),以及内核模块的打包
(1)内核镜像(x86平台):make zImage V=1(内核镜像小于512k, 新一点版本不支持)
make bzImage V=1
命令在顶层使用
生成的镜像文件在arch/
内核模块编译:make modules 命令在顶层使用,编译好的模块 是散落在/drivers文件下
内核模块的打包:移动内核模块:make modules_install 命令 在顶层执行,执行命令后,模块集中到 /lib/modules目录下,生成一个新目录,目 录名与内核版本一致
打包:mkinitrd initrd-version version
(生成文件名)(源文件夹)
源文件的路径 mkinitrd会自动到 /lib/modules下得到,生成的文件在当前路 径,命令的执行路径没关系
5.内核的安装:拷贝内核与驱动模块包去相应的目录:(安装x86的内核)
cp arch/x86(CPU类型)/boot/bzImage(编译好的内核版本)
/boot/vmlinuz-$version(内核版本号)
cp initrd-$version(版本号)(打包好的内核模块包) /boot/
修改 /etc/grub.conf (uboot启动时,需要加载的内核相关信息) 修改内核版本信息,修改内核路径(vmlinuz-$version),和内核驱动模块包名字(initrd-$version)
6.ARM平台内核编译:
清除所有配置和中间文件:make distclean
配置内核:make menuconfig (ARCH=arm) 拷贝一份已好的配置文件去工 程目录
编译内核:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
编译过程会出错:原因:uboot识别具有特殊的文件头的文件,所以编译过程中需要将编译出来的文件加上文件头,而这个文件头的加载工具为mkimage
解决方法:将mkimage工具拷贝到 /bin/ 重新编译
安装:将其TFTP到内存后,可以选择 bootm 执行(如果未写入文件系统到内存里面,则在最后会报错),也可以选择烧写入flash中。
第三部分:根文件系统的制作与挂载
一.制作文件系统(符合将要移植的平台)
cp xxx/linux; make modules ARCH=arm CROSS_COMPILE=arm-linux-;
make modules_install ARCH=arm INSTALL_MOD_PATH=/(将要制作成的根目录),命令会自动将编译好的散落驱动模块集中到将要生成的根目录系统/lib/modules中。
5.安装busybox:Linux命令和小工具。先拷贝源码,然后make menuconfig配置相应参数:busybox Settings->build Option->XXX static binary(静态链接), cross compiler prefix(交叉编译链前缀)填写arm-linux-
Installation options->选中”dont use/usr”防止生成在Linux系统目录中,破坏宿主机
Busybox installation prefix(/xxxx/xxx/需要制作的文件系统的根目录) busybox最后需要安装到那个新文件系统的根目录的bin目录中。
编译,安装:
直接 make 编译,然后make install (拷贝移植的过程)拷贝新文件系统的/bin中去
二.挂载文件系统(以不同文件系统格式挂载)
1.制作busybox的软连接:切换到制作的的文件系统根目录中,执行 ln -s ./bin/busybox init 被制作成软连接的是新文件系统中的busybox
2.1(Initramfs文件系统)配置内核:
切换到内核源码目录,执行 make menuconfig ARCH=arm选中将要挂载的文件格式,然后将制作好的文件系统根目录路径输入
选中 general setup->initial ram filesystem xxx(initramfs/xxx) suppor
在后面那一项 Initramfs sourse file输入制作的新文件系统根目录的路径
2.2(NFS网络文件系统)配置内核
作用:开发板通过网络访问服务器上的文件系统,那么当服务器上文件系统更改了目录以后,开发板上的目录也会进行改变,可以不用总是编译烧写内核。
切换到内核源码目录,执行 make menuconfig ARCH=arm
取消掉general setup中其他的文件系统格式(如上面选中的文件系统格式)
在最外层目录中进入file systems中选中network file systems 然后进入选中root file systems on nfs
设置文件系统的根目录的路径:在后面的uboot的环境变量中进行设置
3.重新编译内核:文件系统和内核关系为:①内核可以不配置内核中文件系统相关参数,单独编译烧写内核,但是将烧写的内核写入内存进行启动会出错,因为无法加载文件系统,烧写入flash覆盖原来的内核没有关系,因为flash中有文件系统。②内核配置文件系统相关参数,文件系统是被压缩在内核后面的,uimage分为内核和文件系统两个部分,在移植内核的时候,文件系统也会被移植过去,在系统启动的时候,文件系统会被解压到内存中去。③当然内核和文件系统都可以单独烧写入flash中去。上面介绍的是第二种。
重新编译内核:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
4.1配置uboot的环境变量:(Initramfs文件系统)
setenv bootargs nointrd console=ttySACO.115200
下载编译好的内核uImage到内存或者flash中去
4.2配置uboot的环境变量:(NFS网络文件系统)
setenv bootargs(uboot通过这个参数来告诉内核需要启动文件系统的方式) noinitrd console=ttySAC0(打印从串口0打印),115200(波特率) init=/init
root=/dev/nfs(将虚拟文件文件系统的nfs作为文件系统) rw(可读可写)
nfsroot=192.168.1.3:/home/S5-driver/lesson9/rootfs,proto=tcp,nfsvers=3(设置实际的文件系统在服务器上的位置)
ip=192.168.1.6:192.168.1.3:192.168.1.1:25
5.255.255.0::eth0(哪一个网卡):off(关闭动态IP)