SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem

SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem,第1张

SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem

Ubuntu18.04下对SD卡分区,并烧写uboot,kernel,DTB及filesystem

一、对于U-Boot启动内核的小知识

1、对于启动文件的理解2、对于存储介质的理解3、对于启动的理解4、对于文件类型的理解 二、Ubuntu18.04下对SD卡分区

1、将读卡器挂接到虚拟机,使用如下指令之一找到自己盘符2、对SD卡进行分区[^3]3、格式化分区 三、烧写uboot,kernel,DTB及filesystem

1、烧写uboot2、复制kernel和DTB3、复制fs 四、启动exynos4412

一、对于U-Boot启动内核的小知识 1、对于启动文件的理解

有了设备树之后(Kernel-3.x加入设备树),嵌入式Linux开发一般需要四个文件:Bootloader(Uboot)、Kernel(uImage)、设备树(DTB)、根文件系统(rootfs)。

2、对于存储介质的理解

一般开发板上有多个存储介质,如:内存(NorFlash、SDRAM),大容量Flash(Nand Flash、SD卡等),网络也算特殊的一种。
Bootloader(Uboot)、Kernel(uImage)、设备树(DTB)、根文件系统(rootfs)这四个文件,理论上可以放在板上的任一存储介质里面。但由于一些特殊原因,往往有所限制。比如,Nor Flash比较小,一般只放Uboot,放不下rootfs。
因此,一般常见的方式是把Uboot放在Nor Flash或者SDRAM,其它的放在Nand Flash,就像JZ2440;或者全都放在SD卡,就像Ti的AM437X;又或者都放在emmc,像Tiny4412;总之就是以上的存储介质组合,根据实际情况而定。1

3、对于启动的理解

开发板上电后,先执行内部ROM中的固化代码,初始化时钟、总线等一些必要的东西。然后根据启动引脚的电平,读取相应的存储介质上的Uboot到RAM。接着,启动Uboot。U-Boot再根据用户传的参数加载内核、设备树、根文件系统。

4、对于文件类型的理解

Linux支持的文件系统以不同的介质来分类,如下所示2:

? 磁盘
FAT16、 FAT16、FAT32、NTFS、ext、ext2 、ext3、ext4
? 光盘
ISO9660、
? Flash
jffs2, yaffs, yaffs2、cramfs, romfs
? 内存
Ramdisk、tmpfs & ramfs
? 虚拟
rootfs、proc、sysfs、usbfs、devpts、NFS
所以,在移植跟文件系统的时候要考虑存储介质的类型。

二、Ubuntu18.04下对SD卡分区 1、将读卡器挂接到虚拟机,使用如下指令之一找到自己盘符
ls /dev/sd*
sudo fdisk -l |grep sd
cat /proc/partitions
df -h

我的盘符是/dev/sdb

2、对SD卡进行分区3

sudo fdisk /dev/sdb,回车输入n,p,1。其中,p是指主分区,1是指第一个分区。输入起始扇区2048和结束扇区22528,完成了添加第一个分区,该分区占用的空间为SD卡第2048~22528扇区共10M,用来存放kernel image和DTB。这里要说明一下,实际当中我是采用u-boot的TFTP命令下载kernel image和DTB,然后挂载SD卡上的根文件系统。从原理上分析,应该是可以用u-boot的mmc或者fatload命令下载kernel image和DTB,但是我用SD卡启动Linux内核没有成功。可能是u-boot命令使用方法不正确,也可能是内核烧写不正确。如果有看客留言提供思路或者资料链接,不胜感激!
继续按照上述步骤,回车输入n,p,2。输入起始扇区24576和结束扇区1253376,添加第二个分区。该分区占用的空间为SD卡第24576~1253376扇区共600M,用来存放rootfs。
继续按照上述步骤,回车输入n,p,3。把剩下的存储空间分为一个区。
添加完成后执行w保存退出fdisk。

分区结束后,输入命令cat /proc/partitions,可以看到三个sdb,分别是/dev/sdb,/dev/sdb1,/dev/sdb2,/dev/sdb3

3、格式化分区

输入mkfs.vfat /dev/sdb1将第1个分区格式化成fat。
输入mkfs -t ext4 /dev/sdb2将第二个分区格式化成ext2,ext3或者ext4。

sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo mkfs.ext4 /dev/sdb3
三、烧写uboot,kernel,DTB及filesystem 1、烧写uboot

本质上用dd命令烧写。我是用Samsung提供的烧写脚本,自动烧写的。不会影响其他分区里的文件。原理请参考以下博文:
Ubuntu18.04烧录U-Boot时格式化SD卡的文件类型(RAW 格式)
这里要说明的是,u-boot是烧写在SD卡第一个分区之前的0~1047扇区的位置。

2、复制kernel和DTB

思路是在/mnt目录下新建2个文件夹/mnt/sd1和/mnt/sd2,然后挂载分别挂载/dev/sdb1和/dev/sdb2。再分别把uImage、DTB和rootfs分别复制到/mnt/sd1和/mnt/sd2中。最后解挂。
这里只是说明复制kernel和DTB的方法,实际中是用TFTP命令下载的。各位看官勿喷。

sudo mkdir /mnt/sd1 /mnt/sd2
sudo chmod 776 /mnt/sd1 /mnt/sd2
sudo mount /dev/sdb1 /mnt/sd1
sudo mount /dev/sdb2 /mnt/sd2
sudo cp arch/arm/boot/uImage /mnt/sd1
sudo cp arch/arm/boot/dts/exynos4412-cbt4412.dtb /mnt/sd1
sudo cp ~/rootfs/rootfs.img /mnt/sd2
sudo umount /mnt/sd1 /mnt/sd2
3、复制fs

思路是利用在/mnt目录下的文件夹/mnt/sd1,然后挂载SD卡设备。
先查看SD卡分区的设备名称,然后挂载,再复制,最后解挂。
我对SD卡做了3个分区,用cat /proc/partitions,可以看到三个sdb,分别是/dev/sdb,/dev/sdb1,/dev/sdb2,/dev/sdb3。看官根据自己的实际情况,也可能是/dev/sdc、/dev/sdd等。

sudo mount -t /dev/sdb3 /mnt/sd1
sudo cp ~/rootfs/rootfs/* -a /mnt/sd1
ls /mnt/sd1
cd 
sudo umount /mnt/sd1

用ls /mnt/sd1就可以看到根文件系统中的目录了。

四、启动exynos4412

把SD卡插入exyno4412开发板,设置启动引脚为SD卡启动。上电以后,就可以启动u-boot。通过cuteCom串口助手,输入u-boot命令,设置u-boot的环境变量从SD卡挂载根文件系统,然后tftp下载Linux内核和设备树,最后bootm命令启动内核。

setenv bootargs root=/dev/mmcblk0p3  rootfstype=ext4 init=/linuxrc console=ttySAC0,115200n8 earlyprintk
tftp 50000000 uImage;tftp 52000000 exynos4412-cbt4412.dtb;bootm 50000000 - 52000000

各位看官根据自己的实际情况修改bootargs参数中的root=/dev/mmcblk0p3。


  1. Exynos4412——SD卡启动 ↩︎

  2. 嵌入式Linux系统移植的四大步骤 ↩︎

  3. 在Exynos4412上使用SD卡烧写Linux ↩︎

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5714704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存