arm-linux嵌入式 系统直接从SD卡启动运行
这种一般是在工厂测试,为了提高效率 使用的
之前有写过一个,把SD卡制作好,然后通过另外分区, 加载到SD卡也能启动系统,但是这个有一个缺点,就是文件系统不能使用镜像直接烧了,要使用Linux拷贝文件到exit4中,
这样比较麻烦,今天记录一下在之前的基础上 实现 镜像的统一
首先,参考 https://www.cnblogs.com/ChenChangXiong/p/11347044.html
参照这里把除了文件系统以外的uboot zImage相关的文件制作好,文件系统镜像留着
完成以上的步骤,得到
zImag MLO **.dtb u-boot.img
uboot修改
需要修改参数,修改bootargs启动参数,把自动烧录模式的AUTO_UPDATESYS变量取消定义 ,因为在bord.c中会判断如果这个变量定义了,就进去烧录模式,所以需要取消定义
取消以后,就直接进入MMC启动,也就是sd卡,而不是烧录模式
uEnv.txt中需要注意的是 console是否对的上,要写串口使用的节点 ,一般是ttyO0 ,我使用的是ttyAP0,就因为这里忽略,有一次总是卡在kernel就找不到原因了,因为节点不对,不现实打印kernel,修改后解决问题,还需要注意的就是设备树需要修改
接下来就是分区合并了,把uEnv.txt zImag MLO **.dtb u-boot.img,以及文件系统合并, kernel和文件系统不需修改,所有系统文件如下,文件系统不做修改,直接复制到p2分区
命令操作如下:
sudo dd if=/dev/zero of=my.img bs=1M count=200
sudo losetup -f --show my.img
通过 fdisk
命令对磁盘文件进行分区,就跟普通磁盘文件一样。
sudo fdisk /dev/loop0
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x2e7df78e. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n # 新建一个分区 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p # 主分区 Partition number (1-4, default 1): 1 # 分区号 First sector (2048-409599, default 2048): # 默认2048 Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-409599, default 409599): +30M # 给30M空间第一个分区 Command (m for help): n # 新建一个分区 Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p # 主分区 Partition number (1-4, default 2): # 使用默认的2 Using default value 2 First sector (63488-409599, default 63488): # 使用默认值 Using default value 63488 Last sector, +sectors or +size{K,M,G} (63488-409599, default 409599): # 直接到结束 Using default value 409599 Command (m for help): t # 改变分区 Partition number (1-4): 1 # 改变第几个分区 Hex code (type L to list codes): e # 改为FAT16分区 Changed system type of partition 1 to e (W95 FAT16 (LBA)) Command (m for help): a # 增加boot 属性 Partition number (1-4): 1 # 指定第一个分区增加boot 属性 ommand (m for help): w # 保存相关信息 The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 22: Invalid argument. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) WARNING: If you have created or modified any DOS 6.x partitions, please see the fdisk manual page for additional information. Syncing disks.
sudo kpartx -av /dev/loop0
sudo mkfs.vfat -n "boot" -F 16 /dev/mapper/loop0p1
sudo mkfs.ext3 -L "rootfs" /dev/mapper/loop0p2
接着挂载在p1 p2 上,首先新建两个文件夹 p1 p2
sudo mount /dev/mapper/loop0p1 p1
sudo mount /dev/mapper/loop0p2 p2
sync
就是复制你的镜像文件到对应的分区,把除了文件系统的文件,复制到p1 ,文件系统下的文件 复制到p2
然后解除挂载
sudo umount p1 p2
sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0
就可以把第一步制作的my.img 拷贝出去,正常烧录
上面的步骤可以做成脚本,一键生成
#!/bin/sh sudo dd if=/dev/zero of=my.img bs=1M count=200 sudo losetup -f --show my.img sudo fdisk /dev/loop0 <<EOF n p 1 2048 +30M n p 2 63488 409599 t 1 e a 1 w EOF sleep 1 echo ==finish== sudo kpartx -av /dev/loop0 sudo mkfs.vfat -n "boot" -F 16 /dev/mapper/loop0p1 sudo mkfs.ext3 -L "rootfs" /dev/mapper/loop0p2 sleep 1 sudo mount /dev/mapper/loop0p1 p1 sudo mount /dev/mapper/loop0p2 p2 sync echo ==start copy== sudo cp image/am335x-qt243n.dtb image/MLO image/u-boot.img image/uEnv.txt image/zImage p1/ sudo cp PDK3_ROOTFS/rootfs/* p2 -rf sudo umount p1 p2 sudo kpartx -d /dev/loop0 sudo losetup -d /dev/loop0 cp my.img ~/ sync echo ==done==