目录
一、tftp加载Linux内核和roootfs
二、 EMMC加载Linux内核和rootfs
三、tftp加载Linux内核nfs挂在根文件系统
四、EMMC加载uboot
一、tftp加载Linux内核和roootfs
这个就是Linux内核,它很轻量级只有2.949MB所以在嵌入式领域很受欢迎。
上面那个就是设备树文件
把这两个文件放进来然后chmod 777 ,这个和版本有关老版本16以前只要这个文件夹是777拖进来就变成777了。我这个18.04就不行,需要在赋予权限,但是不需要sudo。有的还要加sudo。
然后拖入这个,这是根文件系统。
如果虚拟机重启了需要将tftp服务重启不然是不好使的,我因为以前搞了一段时间大数据所以我习惯挂起,嘎嘎好用。
连接开发板与电脑,在 uboot 交互模式下,设置 uboot 的启动参数
# setenv ipaddr ***.***.***.***
# setenv serverip xxx.xxx.xxx.xxx
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;tftp 0x43000000 ramdisk.img\;bootm 0x41000000 0x43000000 0x42000000
# setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs/ rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
由于内存条只安了一个G所以最好在40000000~80000000
所以这一块是16MB每块放一样绰绰有余。
启动指定内存地址上的Linux内核并为内核传递参数
bootm kernel-addr ramdisk-addr dtb-addr
注:
kernel-addr: 内核的下载地址
ramdisk-addr: 根文件系统的下载地址
dtb-addr: 设备树的下载地址
若不使用相应的地址,对应的位置写“-”
eg:
bootm 0x41000000 - 0x42000000
eg:
setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs
rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
注:
root 根文件系统类型(nfs)
nfsroot 网络文件系统路径(xxx.xxx.xxx.xxx:/opt/4412/rootfs)
rw 操作网络文件系统的权限(rw)
console 控制台(使用串口2,波特率115200)
init init进程的位置(/linuxrc)
ip linux启动后自身的IP(***.***.***.***)
现在重新启动开发板
额经过我的检查原来是敲错了,尴尬
,希望这次没错。
我好像发现了盲点,我用emmc启动的。十分之尴尬啊,现在切换成SD卡重新配置一下
GG致命错误多敲一个0下载到1000 0000了
终于成功了,看这亲切的ls
纯白色看着不舒服
这里可以切换主题,我用Linux这个大黑屏挺好用的
据我观察干咱们这行的基本都喜欢黑色背景,主要熬夜敲代码还是黑色能舒服点,习惯以后白天也想用。
注意:如果ping不通记得关闭防火墙。
二、 EMMC加载Linux内核和rootfs
emmc是分块的
上面算了一下:
uImage是2.9M
我的计算器太垃圾了算不了小数点。我看下这个uImage是2949K
5940块切换成16进制,因为之前我们说过默认是16进制的。
设备树是36k,乘以1024在除以512,就是72块。所以现在emmc就是这个情况,最前面的800块用来放u-boot。我懒下面这个图复制老师的哈哈。
emmc有4个G后面可以存一些APP什么的随便玩
然后我们开始敲命令
先用tftp把内核下载到内存,在把内核放到emmc里
下载设备树然后放到emmc。由于不是直接用内存所以下载到一个地址也没事覆盖了就覆盖了。
最后是根文件系统
---------------------------------------------------------------------------------------------------------------------------------
我刚刚写错地址的时候下载到1000 0000了找了一下exynos4412的地址映射表这块是SFR寄存器,希望没事,不过应该没事,寄存器有的能写有的只读应该是写到只读的寄存器卡住了,那些可写的到时候用之前都要设置,所以应该问题不大那就继续。
---------------------------------------------------------------------------------------------------------------------------------
设置u-boot启动参数,好像太长了
把后面的参数用单引号引起来试试
好像还是不行捏。
我刚刚是在emmc启动下配置的这个长度限制好像破除不了,现在有改成SD卡启动加上单引号就可以了。
这次貌似可以了
现在可以用SD卡不借助tftp启动了。然后我把启动模式换成emmc
看来这个saveenv保存的地方是根据使用的uboot位置定的emmc里的uboot没改良过不接受单引号也许。算了等往后学一学看看能不能解决这个问题。
三、tftp加载Linux内核nfs挂在根文件系统
这种方式适合开发,因为要经常修改系统,所以改一次刷一次emmc太浪费时间了。
解压根文件系统
由于这次跟文件系统是通过nfs挂载的所以就不需要写内存地址了,同样也没有内存地址。所以写个-
重启一下nfs服务
卡在挂在根文件系统了,大概是nfs的问题
路径有点问题之前的路径是到book这次具体到nfs_rootfs试试。
给文件夹777了这次在试试
还是卡在挂载根文件系统
这次全部文件777
还是不行
VFS: Cannot open root device 解决思路___pop_的博客-CSDN博客
感觉这个兄台写的思路很对
查了半天老师出马我敲错一个字母顺便又学了N遍nfs补一下nfs配置文件里这个参数说明
下面这段引自外站侵权我就删了。
---------------------------------------------------------------------------------------------------------------------------------
https://www.ngui.cc/zz/188328.html?action=onClick
---------------------------------------------------------------------------------------------------------------------------------
在虚拟机中写一个这样的程序:
呕吼不行为什么呢,因为机器码不行啊。
gcc编译出来的X86的机器码
我测试了一下很多东西开发板都用不了,因为我们之前配置的东西都在我们的虚拟机中,我们开发板有的只是根文件系统里这些东西。我们之前安过ARM-gcc在虚拟机中编译在开发板中运行试试
好吧file命令开发板就是用不了,但是这个arm架构的hello可执行文件可以。以后就可以在虚拟机写程序和编译开发板执行就行了。
bootargs刚刚就是这个敲错了,这个虽然是uboot的环境变量,但是它是uboot传给内核的参数。
四、EMMC加载uboot
这次就是要彻底脱离SD卡,希望不会敲错。
先把uboot镜像放到tftp文件夹里并给他权限。
uboot要刷到emmc的引导分区所以我们要运行一个命令打开分区
用SD卡启动默认从第一块开始搬移uboot
用emmc启动默认从第零块开始搬移uboot
516*1024/512=1032块
一块512字节
转成16进制是408块所以大于408就行
之后我们重新设置一下uboot重启就行
一个root命令