参考:https://blog.csdn.net/qq_23922117/article/details/78312908
1.编译uboot
a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好
环境变量PATH,保证可以正常使用。
sudo tar -xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz –C /
sudo vim /etc/environment修改PATH为:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/FriendlyARM/toolschain/4.5.1/bin"
问题:
了解几种保存环境变量的方式有什么不同?
b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录
tar xzf uboot_tiny4412-20130729.tgz
c) 配置 uboot 并编译
cd uboot_tiny4412
make tiny4412_config
make
d) 编译 用于生成bl2 的工具
make -C sd_fuse
2.制作SD卡启动
假设sd卡在linux中被识别为/dev/sdb。
cd sd_fuse/tiny4412
./sd_fusing.sh /dev/sdb
3.启动uboot
将sd卡插入开发板,选择SD卡启动,开启后就能看到uboot的启动信息。如果开发板是1506的,那么用光盘中的uboot只有打印ok,因为光盘中的uboot是针对1306,1506相对于1306少了两块ddr。要使用最新的uboot,在友善论坛可以找到最新的uboot。
4.编译内核
1.cp tiny4412_linux_defconfig .config
2.make menuconfig
然后将CONFIG_ARM_TRUSTZONE选项去掉,可以在.config中直接去掉。原版的内核配置是和superboot配套的,但是uboot里面暂不支持改功能,如果不去掉,在启动内核的时候,就会提示Uncompressing linux.....done,booting the kernel。
3.关电取出SD卡,并将PC机上的内核zImage拷到SD卡上的第一个分区 fat32。
4.fatls mmc 0:1 / //查看第0个MMC设备 第一个分区 的分区目录
5.fatload mmc 0:1 0x40008000 zImage //将SD卡里面的zImage加载到内存地址0x40008000
6.bootm 0x40008000
问题:
正常bootm是引导uImage的,这里如果使用go 0x40008000还是启动不了。了解bootm和go的不同之处?
7.如果可以正常启动内核,那么再次进入uboot:
set bootcmd "fatload mmc 0:1 0x40008000 zImage ;bootm 0x40008000 ”
save
5.虚拟机安装nfs
1.在ubuntu12.04上安装NFS Server
sudo apt-get install portmap
sudo apt-get install nfs-kernel-server
sudo apt-get install nfs-common
2.修改/etc/exports文件
sudo vi /etc/exports
在文件的末尾添加这一句:
/home/george/1702/exynos/filesystem *(rw,async,no_root_squash,no_subtree_check)
格式说明:
*:允许所有的网段访问,也可以使用具体的IP
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限。
no_subtree_check:不检查父目录的权限。
目录和*之间要有个空格,不然mount的时候会提示permission denied。
注意,*和后面的括号不能出现空格。
然后保存退出。
3.重启NFS服务
sudo exportfs –a
sudo /etc/init.d/nfs-kernel-server restart
6.配置编译busybox
1.安装编译busybox
安装busybox,下载链接https://busybox.net/
mkdir filesystem
tar -xzvf busybox-1.22.1.tar.bz2
cd busybox-1.22.1/
make defconfig
make menuconfig
2.配置busybox
选择完,我们退出保存,然后make -j4,进行编译,编译完成之后,我们再make install,这样会在当前目录下生成_install文件夹,检测有没有成功:
file bin/busybox
如果出现一下信息,说明成功了:
bin/busybox: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
3.制作根文件系统
cd filesystem
cp ../busybox-1.22.1/_install/* . -r
mkdir etc dev opt sys tmp mnt lib proc
mkdir etc/init.d
vim etc/init.d/rcS
在rcS里添加如下内容:
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel /bin/mount -a #挂载fstab文件中所有指定的文件系统 echo /sbin/mdev>/proc/sys/kernel/hotplug mdev -s #在/dev目录下建立必须的设备节点 /bin/hostname -F /etc/sysconfig/HOSTNAME #设置主机的名字
vim etc/inittab
在inittab里添加如下内容:
::sysinit:/etc/init.d/rcS #设置内核的热插拔,有mdev接收来自内核的消息并做出响应 ::askfirst:-/bin/sh #在串口启动一个登陆会话 ::ctrlaltdel:/sbin/reboot #作为init重启执行程序 ::restart:/sbin/init ::showdown:/bin/mount #告诉init在关机时运行umount命令卸载所有文件系统,如果卸载失败,以只读方式重新挂载
vim etc/fstab
在fstab里添加如下内容(按tab键隔开):
proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0
注意:
第一列是挂载设备
第二列是挂载目录
第三列是挂载文件系统类型
第四列是挂载选项(裁掉了,哈哈)
vim etc/profile
在profile里添加如下内容:
#/etc/profile:system-wide .profile file for the Bourne shells #!/bin/sh #vim:syntax=sh #No core file by defaults #ulimit -S -c 0>/dev/null 2>&1 USER="id -un" LOGNAME=$USER PS1='[root@tiny4412]#' PATH=$PATH HOSTNAME='/bin/hostname' export USER LOGNAME PS1 PATH
sudo chmod 777 filesystem
创建设备文件:sudo mknod dev/console c 5 1
4.完善动态链接库
(1)我们在busybox设置的是动态链接库,而且编译器是arm-linux-gcc,找到安装arm-linux-gcc的安装路径
which arm-linux-gcc
/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc上面是我的路径,/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib,这个就是要复制出来的动态库的路径,把里面的动态链接文件复制到filesystem文件夹下
(2)复制动态链接文件
cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* ./lib -r
简单小结一下:
1.inittab,rcS,fstab关系
系统启动挂载文件系统--->
--->读取/etc/inittab文件,解析其中定义的动作
--->根据sysinit定义的process执行/etc/init.d/rcS
--->/etc/init.d/rcS中第一条命令 mount -a
--->读取/etc/fstab文件
--->根据文件列表内容逐个挂载其中的设备到指定地
2.profile文件
设置环境变量,根据这里设置命令提示符号相关的环境变量
用户可以根据自己需要添加环境变量
3./etc/init.d/rcS
执行系统初始化时候,想开机启动的程序都可以写在这个文件中.
7.挂载nfs网络文件系统
1.首先内核要支持挂载nfs文件系统
如果内核没有配置支持挂载nfs文件系统,就会出现VFS: Cannot open root device “nfs” or unknown-block(0,255): error -6
2.确保开发板和虚拟机能ping通
虚拟机要设置为vmnet0为桥接模式。虚拟机和开发板在同一个网段,就可以了。
3.本地挂载nfs
mount -t nfs -o nolock 192.168.66.66:/nfs/filesys /nfsroot
其中192.168.66.66是虚拟机的ip地址
4.在uboot中挂载
setenv bootargs root=/dev/nfs nfsroot=192.168.66.66:/nfs/fs/filesystem ip=192.168.66.88 init=/linuxrc console=ttySAC0,115200
ip=192.168.66.88为开发板的ip地址
saveenv
出现的问题:
1.挂载得时候提示permission denied
可以ping得通,说明网络没有问题,但是挂载得时候提示没有权限。应该就是nfs设置得时候出现问题,打开/etc/exports,发现目录和*中间没有空格。
2.启动内核提示“INFO: task xxxxxx: 634 blocked for more than 120 seconds.
解决方法:
修改系统信息配置文件sysctl.conf,此配置文件在/etc目录下。打开配置文件在最后添加如下两行代码:
vm.dirty_background_ratio=5
vm.dirty_ratio=10
参考博客:https://blog.csdn.net/electrocrazy/article/details/79377214
3.uboot启动不了内核
可能原因:1.uboot和内核得机器码不对应 2.bootarg设置
先查找uboot中tiny4412.h中的机器码,然后查找对应的头文件
接下来查找kernel里面的机器码是多少
https://www.cnblogs.com/linfeng-learning/p/9285546.html
https://www.cnblogs.com/linfeng-learning/p/9285546.html
所以uboot和kernel的机器ID是不一样的。首先修改机器ID
注意:
1.通过fdisk -p查看不同得存储
可以看出0是SD卡 ,1是emmc