日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

对于ARM的启动,系统升级,烧写过程和文件系统等方面的总结分析

發布時間:2024/10/12 99 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对于ARM的启动,系统升级,烧写过程和文件系统等方面的总结分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文所述的ARM的指的是Cortex A系列以及ARM9,ARM11,跑Linux操作系統。對于CortexM系列并不一定完全適用;

談到ARM以及啟動和燒寫等方面,首先我們要明確一下幾個關鍵詞:Uboot,Cmdline,啟動方式選擇,文件系統格式,存儲介質,如NAND,EMMC,SD卡等

下面一個一個做相關介紹:

啟動方式:

  • 一般CPU都可以配置為從多種介質啟動,比如SPI Nor Flash,NAND,EMMC,SD卡,U盤等
  • 大致原理是CPU內部ROM有一段固化的啟動代碼,根據CPU配置引腳,判斷啟動位置,然后從外部介質讀取數據啟動
  • 一般啟動介質的前一部分代碼的作用必須是:初始化硬件參數,自身拷貝
  • 關于自拷貝:因為CPU內部RAM很小,因此只能讀取一部分啟動介質的數據即Uboot到內部RAM運行,所以Uboot前一部分的工作需要將自身剩余部分拷貝到外部RAM中,然后加載運行

  • Uboot:

  • 主要作用:引導Linux系統(主要是從存儲介質的哪個地方讀取Kernel,傳遞什么樣的啟動參數)
  • 其他功能:支持很多命令,主要是存儲控制和網絡命令,最終目的還是引導和升級系統用
  • 常用操作:TFTP,NAS,Flash操作,UBI操作,Setenv,boot等
  • 一般升級系統流程:使用tftp方式從主機下載kernel及文件系統等文件,然后使用flash等命令燒寫到存儲介質如NAND,最后設定啟動參數,然后引導系統啟動;
  • 一般調試流程,介紹2種:
  • 使用NAS從主機直接加載文件系統,直接在線調試,快捷方便
  • 設定從SD卡啟動,從SD卡加載kernel和文件系統調試

  • CMDLINE:

  • 一般由Uboot傳遞給Kernel,或者Kernel中配置寫死不過一般很少見
  • 主要2個參數:
  • 第一,指定console設備,用于打印輸出及做控制臺用
  • 第二,指定rootfs掛載分區和類型
  • 看2個例子:
  • 從NAND啟動,/proc/cmdline,加載的是UBI文件系統,位置在mtd3console=ttymxc0,115200 ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs mtdparts=gpmi-nand:5m(boot),10m(kernel),1m(dtb),-(rootfs)
  • 從SD卡啟動,/proc/cmdline,加載的是ext4文件系統,位置在sd卡第二分區mmcblk0p2console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw rootdelay=5 mem=256M fstype=ext4 mtdparts=gpmi-nand:5m(boot),10m(kernel),1m(dtb),-(rootfs)
  • 存儲介質:

    主要介紹Raw? Flash 及 FTL devices區別

    Flash特點:寫入前需要先擦除,有壽命且不長,而且容易產生壞塊

    RAW Flash:即裸芯片,沒有控制器,針對其主要操作有擦除,讀和寫

    FTL Device: 在裸芯片上加了控制器,比如SD卡,U盤等;加了控制器后,只需要讀和寫就行了,不需要擦除。控制器做了一系列的工作:擦除,磨損平衡,磨損算法等等,一個控制器算法的好壞直接決定了設備的使用壽命。


    文件系統:

  • FAT:windows常用文件系統,一般U盤,sd卡即為fat格式
  • ext2/3/4,Linux常用文件系統,一般用于FTL Device,即只有讀和寫
  • JFFS2,Linux常用,一般用于容量較小的Flash,且是Raw Flash,MTD設備
  • UBIFS,Linux常用文件系統,只能用于Raw Flash,因為kernel ubi子系統,有相關的磨損平衡算法,可以保證效率
  • SD卡啟動,文件系統掛載情況:# mount /dev/root on / type ext4 (rw,noatime,data=ordered) proc on /proc type proc (rw,nosuid,nodev,noexec,noatime) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime) tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime) tmpfs on /dev type tmpfs (rw,nosuid,relatime,size=512k,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode=600) debugfs on /sys/kernel/debug type debugfs (rw,noatime) # # cat /proc/mtd dev: size erasesize name mtd0: 00500000 00020000 "boot" mtd1: 00a00000 00020000 "kernel" mtd2: 00100000 00020000 "dtb" mtd3: 0f000000 00020000 "rootfs"
  • NAND啟動,文件系統掛載情況:# mount ubi0:rootfs on / type ubifs (rw,relatime) devtmpfs on /dev type devtmpfs (rw,relatime,size=89164k,nr_inodes=22291,mode=755) proc on /proc type proc (rw,relatime) devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw,relatime,mode=777) tmpfs on /tmp type tmpfs (rw,relatime) tmpfs on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755) sysfs on /sys type sysfs (rw,relatime) # # cat /proc/mtd dev: size erasesize name mtd0: 00500000 00020000 "boot" mtd1: 00a00000 00020000 "kernel" mtd2: 00100000 00020000 "dtb" mtd3: 0f000000 00020000 "rootfs"

  • 燒寫過程:

  • 一般從SD卡等外部方式啟動,在Uboot中,使用flash命令及UBI命令分別燒寫uboot,dtb,kernel,rootfs到對應的分區即可
  • 第二使用芯片廠家的燒寫工具,如nxp的 mfgtoos,在pc上通過usb燒寫文件
  • 如已有uboot,在uboot中從sd卡,U盤等讀取文件燒寫;或tftp從pc下載文件燒寫

  • 升級過程:

  • 此升級指的是Uboot OK的前提下做Uboot,kernel,rootfs等升級
  • 通過SD卡升級,一般是首先在PC上制作SD卡啟動分區,通過官方的工具燒寫升級文件到SD卡即可;此處的升級文件分兩個方面:
  • 最小升級內核,并且包含升級腳本,此腳本會將目標文件燒寫到存儲介質中
  • 目標升級文件,即要燒寫到比如NAND中的文件
  • 以NXP SD卡升級為例說明此過程:
  • 首先是Uboot啟動過程:U-Boot 2016.03-mys-imx6ulx+gca7b81f (Apr 27 2017 - 07:55:51 +0800)CPU: Freescale i.MX6ULL rev1.0 528 MHz (running at 396 MHz) CPU: Commercial temperature grade (0C to 95C) at 39C Reset cause: POR Board: MX6ULL 14x14 EVK I2C: ready DRAM: 512 MiB MMC: FSL_SDHC: 0, FSL_SDHC: 1 *** Warning - bad CRC, using default environmentDisplay: TFT43AB (480x272) Video: 480x272x24 In: serial Out: serial Err: serial switch to partitions #0, OK mmc0 is current device Net: Board Net Initialization Failed No ethernet found. Normal Boot Hit any key to stop autoboot: 0 switch to partitions #0, OK mmc0 is current device switch to partitions #0, OK mmc0 is current device reading boot.scr 423 bytes read in 10 ms (41 KiB/s) Running bootscript from mmc ... ## Executing script at 80800000 reading zImage 6789824 bytes read in 302 ms (21.4 MiB/s) reading mys-imx6ull-14x14-evk-gpmi-weim.dtb 36951 bytes read in 20 ms (1.8 MiB/s) Kernel image @ 0x83000000 [ 0x000000 - 0x679ac0 ] ## Flattened Device Tree blob at 84000000Booting using the fdt blob at 0x84000000Using Device Tree in place at 84000000, end 8400c056 Starting kernel ..
  • 最小系統加載啟動完畢后,運行升級腳本
  • VFS: Mounted root (ext4 filesystem) on device 179:2. devtmpfs: mounted Freeing unused kernel memory: 432K (80b54000 - 80bc0000) INIT: version 2.88 booting Starting udev udevd[114]: starting version 3.1.5 random: udevd urandom read with 32 bits of entropy available EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered bootlogd: cannot allocate pseudo tty: No such file or directory FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck. ALSA: Restoring mixer settings... /usr/sbin/alsactl: load_state:1735: No soundcards found... INIT: Entering runlevel: 5 Starting system message bus: dbus.System update start ... prepare files are okay

  • 升級腳本分析:
  • root@mys6ull14x14:/run/media/mmcblk0p2# cat usr/bin/flash_nand.sh #!/bin/sh part_uboot=0 part_kernel=1 part_dtb=2 part_rootfs=3echo heartbeat > /sys/class/leds/user/triggermfg_path=/run/media/mmcblk0p1/mfg-images //升級目標文件uboot=${mfg_path}/u-boot.imx kernel=${mfg_path}/zImage dtb=${mfg_path}/gpmi-weim.dtb rootfs=${mfg_path}/core-image-base.rootfs.tar.xzif [ -d $mfg_path ] && [ -s $uboot ] && [ -s $kernel ] && [ -s $dtb ] && [ -s $rootfs ] thenecho "prepare files are okay" elseecho 0 > /sys/class/leds/user/brightnessecho "file or directory not exist" fi直接使用Flash命令燒寫Uboot到對應分區 echo "Flashing uboot" flash_erase /dev/mtd${part_uboot} 0 0 && kobs-ng init -x -v ${uboot} if [ $? -eq 0 ] thenecho "Flash uboot okay" elseecho "Flash uboot failed"echo 0 > /sys/class/leds/user/brightnessexit fi直接使用Flash命令燒寫kernel到對應分區echo "Flashing kernel" flash_erase /dev/mtd${part_kernel} 0 0 && nandwrite -p /dev/mtd${part_kernel} -p ${kernel} if [ $? -eq 0 ] thenecho "Flash kernel okay" elseecho "Flash kernel failed"echo 0 > /sys/class/leds/user/brightnessexit fi直接使用Flash命令燒寫dtb到對應分區echo "Flashing dtb" flash_erase /dev/mtd${part_dtb} 0 0 && nandwrite -p /dev/mtd${part_dtb} -p ${dtb} if [ $? -eq 0 ] thenecho "Flash dtb file okay" elseecho "Flash dtb file failed"echo 0 > /sys/class/leds/user/brightnessexit fi燒寫rootfs比較特別,此處是使用ubifs,因此需要先使用ubi命令在NAND上建立好文件系統格式echo "Flashing rootfs" flash_erase /dev/mtd${part_rootfs} 0 0 if [ $? -ne 0 ] thenecho "erase /dev/mtd${part_rootfs} fail"echo 0 > /sys/class/leds/user/brightnessexit fiubiformat /dev/mtd${part_rootfs} if [ $? -ne 0 ] thenecho "format /dev/mtd${part_rootfs} fail"echo 0 > /sys/class/leds/user/brightnessexit fiubiattach /dev/ubi_ctrl -m ${part_rootfs} if [ $? -ne 0 ] thenecho "attach /dev/mtd${part_rootfs} fail"echo 0 > /sys/class/leds/user/brightnessexit fiubimkvol /dev/ubi0 -Nrootfs -m if [ $? -ne 0 ] thenecho "make volume /dev/mtd${part_rootfs} fail"echo 0 > /sys/class/leds/user/brightnessexit fimkdir -p /run/media/mtd${part_rootfs} \&& mount -t ubifs ubi0:rootfs /run/media/mtd${part_rootfs} if [ $? -ne 0 ] thenecho "mount /dev/mtd${part_rootfs} fail"echo 0 > /sys/class/leds/user/brightnessexit fi建立好ubi格式之后,直接將rootfs壓縮包解壓到對應分區即可;tar xvf ${rootfs} -C /run/media/mtd${part_rootfs} if [ $? -eq 0 ] thenecho "Flash filesystem okay"sync && sync && syncecho none > /sys/class/leds/user/triggerecho 1 > /sys/class/leds/user/brightness elseecho "Flash filesystem failed"echo 0 > /sys/class/leds/user/brightnessumount /run/media/mtd${part_rootfs}exit fi umount /run/media/mtd${part_rootfs} echo "Programming success" echo "You need reboot the board"








  • 總結

    以上是生活随笔為你收集整理的对于ARM的启动,系统升级,烧写过程和文件系统等方面的总结分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。