1. 程式人生 > >對於ARM的啟動,系統升級,燒寫過程和檔案系統等方面的總結分析

對於ARM的啟動,系統升級,燒寫過程和檔案系統等方面的總結分析

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

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

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

啟動方式:

  1. 一般CPU都可以配置為從多種介質啟動,比如SPI Nor Flash,NAND,EMMC,SD卡,U盤等
  2. 大致原理是CPU內部ROM有一段固化的啟動程式碼,根據CPU配置引腳,判斷啟動位置,然後從外部介質讀取資料啟動
  3. 一般啟動介質的前一部分程式碼的作用必須是:初始化硬體引數,自身拷貝
  4. 關於自拷貝:因為CPU內部RAM很小,因此只能讀取一部分啟動介質的資料即Uboot到內部RAM執行,所以Uboot前一部分的工作需要將自身剩餘部分拷貝到外部RAM中,然後載入執行

Uboot:

  1. 主要作用:引導Linux系統(主要是從儲存介質的哪個地方讀取Kernel,傳遞什麼樣的啟動引數)
  2. 其他功能:支援很多命令,主要是儲存控制和網路命令,最終目的還是引導和升級系統用
  3. 常用操作:TFTP,NAS,Flash操作,UBI操作,Setenv,boot等
  4. 一般升級系統流程:使用tftp方式從主機下載kernel及檔案系統等檔案,然後使用flash等命令燒寫到儲存介質如NAND,最後設定啟動引數,然後引導系統啟動;
  5. 一般除錯流程,介紹2種:
    1. 使用NAS從主機直接載入檔案系統,直接線上除錯,快捷方便
    2. 設定從SD卡啟動,從SD卡載入kernel和檔案系統除錯

CMDLINE:

  1. 一般由Uboot傳遞給Kernel,或者Kernel中配置寫死不過一般很少見
  2. 主要2個引數:
    1. 第一,指定console裝置,用於列印輸出及做控制檯用
    2. 第二,指定rootfs掛載分割槽和型別
  3. 看2個例子:
    1. 從NAND啟動,/proc/cmdline,載入的是UBI檔案系統,位置在mtd3
      console=ttymxc0,115200 ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs mtdparts=gpmi-nand:5m(boot),10m(kernel),1m(dtb),-(rootfs)
    2. 從SD卡啟動,/proc/cmdline,載入的是ext4檔案系統,位置在sd卡第二分割槽mmcblk0p2
      console=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盤等;加了控制器後,只需要讀和寫就行了,不需要擦除。控制器做了一系列的工作:擦除,磨損平衡,磨損演算法等等,一個控制器演算法的好壞直接決定了裝置的使用壽命。

檔案系統:

  1. FAT:windows常用檔案系統,一般U盤,sd卡即為fat格式
  2. ext2/3/4,Linux常用檔案系統,一般用於FTL Device,即只有讀和寫
  3. JFFS2,Linux常用,一般用於容量較小的Flash,且是Raw Flash,MTD裝置
  4. UBIFS,Linux常用檔案系統,只能用於Raw Flash,因為kernel ubi子系統,有相關的磨損平衡演算法,可以保證效率
  5. 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"
    
    
  6. 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"
    


燒寫過程:

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

升級過程:

  1. 此升級指的是Uboot OK的前提下做Uboot,kernel,rootfs等升級
  2. 通過SD卡升級,一般是首先在PC上製作SD卡啟動分割槽,通過官方的工具燒寫升級檔案到SD卡即可;此處的升級檔案分兩個方面:
    1. 最小升級核心,並且包含升級指令碼,此指令碼會將目標檔案燒寫到儲存介質中
    2. 目標升級檔案,即要燒寫到比如NAND中的檔案
  3. 以NXP SD卡升級為例說明此過程:
    1. 首先是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 environment
      
      Display: 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 84000000
         Booting using the fdt blob at 0x84000000
         Using Device Tree in place at 84000000, end 8400c056
      
      Starting kernel ..
    2. 最小系統載入啟動完畢後,執行升級指令碼
    3. 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


    4. 升級指令碼分析:
    5. [email protected]:/run/media/mmcblk0p2# cat usr/bin/flash_nand.sh
      #!/bin/sh
      part_uboot=0
      part_kernel=1
      part_dtb=2
      part_rootfs=3
      
      echo heartbeat > /sys/class/leds/user/trigger
      
      mfg_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.xz
      
      if [ -d $mfg_path ] && [ -s $uboot ] && [ -s $kernel ] && [ -s $dtb ] && [ -s $rootfs ]
      then
          echo "prepare files are okay"
      else
          echo 0 > /sys/class/leds/user/brightness
          echo "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 ]
      then
          echo "Flash uboot okay"
      else
          echo "Flash uboot failed"
          echo 0 > /sys/class/leds/user/brightness
          exit
      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 ]
      then
          echo "Flash kernel okay"
      else
          echo "Flash kernel failed"
          echo 0 > /sys/class/leds/user/brightness
          exit
      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 ]
      then
          echo "Flash dtb file okay"
      else
          echo "Flash dtb file failed"
          echo 0 > /sys/class/leds/user/brightness
          exit
      fi
      
      燒寫rootfs比較特別,此處是使用ubifs,因此需要先使用ubi命令在NAND上建立好檔案系統格式
      
      echo "Flashing rootfs"
      flash_erase /dev/mtd${part_rootfs} 0 0
      if [ $? -ne 0 ]
      then
          echo "erase /dev/mtd${part_rootfs} fail"
          echo 0 > /sys/class/leds/user/brightness
          exit
      fi
      
      ubiformat /dev/mtd${part_rootfs}
      if [ $? -ne 0 ]
      then
          echo "format /dev/mtd${part_rootfs} fail"
          echo 0 > /sys/class/leds/user/brightness
          exit
      fi
      
      ubiattach /dev/ubi_ctrl -m ${part_rootfs}
      if [ $? -ne 0 ]
      then
          echo "attach /dev/mtd${part_rootfs} fail"
          echo 0 > /sys/class/leds/user/brightness
          exit
      fi
      
      ubimkvol /dev/ubi0 -Nrootfs -m
      if [ $? -ne 0 ]
      then
          echo "make volume /dev/mtd${part_rootfs} fail"
          echo 0 > /sys/class/leds/user/brightness
          exit
      fi
      
      mkdir -p /run/media/mtd${part_rootfs} \
       && mount -t ubifs ubi0:rootfs /run/media/mtd${part_rootfs}
      if [ $? -ne 0 ]
      then
          echo "mount /dev/mtd${part_rootfs} fail"
          echo 0 > /sys/class/leds/user/brightness
          exit
      fi
      
      建立好ubi格式之後,直接將rootfs壓縮包解壓到對應分割槽即可;
      
      tar xvf ${rootfs} -C /run/media/mtd${part_rootfs}
      if [ $? -eq 0 ]
      then
          echo "Flash filesystem okay"
          sync && sync && sync
          echo none > /sys/class/leds/user/trigger
          echo 1 > /sys/class/leds/user/brightness
      else
          echo "Flash filesystem failed"
          echo 0 > /sys/class/leds/user/brightness
          umount /run/media/mtd${part_rootfs}
          exit
      fi
      umount /run/media/mtd${part_rootfs}
      echo "Programming success"
      echo "You need reboot the board"


相關推薦

對於ARM啟動系統升級過程檔案系統方面總結分析

本文所述的ARM的指的是Cortex A系列以及ARM9,ARM11,跑Linux作業系統。對於CortexM系列並不一定完全適用; 談到ARM以及啟動和燒寫等方面,首先我們要明確一下幾個關鍵詞:Uboot,Cmdline,啟動方式選擇,檔案系統格式,儲存介質,如NAND,

向nandflash中核心檔案系統的方法

在RAM開發板上往nandflash燒寫核心和檔案系統的方法: 一、           在u-boot中燒寫檔案系統:(其中這裡的地址參考具體開發板使用手冊中的地址,SBC6345) a)       在系統啟動的時候,u-boot會提示有三秒中停留,敲擊回車中斷u-bo

uboot從SD卡核心檔案系統

環境:ubuntu 13.04 一、首先製作sd啟動盤:  插入SD卡     sudo dd iflag=dsync oflag=dsync if=tiny210v2-uboot.binof=/dev/mmcblk0 seek=1  tiny210v2-uboot.bin來自:   http://www.a

如何用nfs命令核心檔案系統(網路下載檔案到nandflash)(未完)

 使用tftp下載燒寫 a、設uboot裡的ip地址 set ipaddr 192.168.1.17(uboot的ip設定成同網段) set serverip 192.168.1.5(電腦本機作為服務ip) 然後儲存設定 save b、將u-boot下載到nor flas

製作嵌入式Linux檔案系統過程

1.解壓tar xvf createSdcard.qt4.tar.bz2檔案,在Ubuntu下插入SD卡。 2.執行./createSdCard.sh,即可在SD卡生成 bin 和 system 目錄,bin 裡面的內容不要更改; system 目錄裡的內容將來被 燒寫到

升級macOS10.13.4之後cocoapods不能正常使用了這是蘋果一貫的問題遇到大版本系統升級之前的一些軟體就不能正常使用了。

升級macOS10.13.4之後,cocoapods不能正常使用了,這是蘋果一貫的問題,遇到大版本系統升級,之前的一些軟體就不能正常使用了。  終端輸入  sudo gem update –system  顯示如下錯誤  ERROR: While execut

繼上節之後根文件系統

ima top .com 大小 命令 ipad console 啟動不了 filesize 1、準備根文件系統.jffs2文件 2、打開tftp下載文件(目錄為根文件所在處) 3、設置ip地址 #set ipaddr 192.168.1.103

ECS主動運維2.0體驗升級事半功倍

存儲摘要: 阿裏雲致力於提供更好用的運維體驗,讓您使用ECS的過程更透明、高效,並實現更加標準化、自動化的運維方式。基於主動運維2.0,您使用ECS雲服務器的體驗更加流暢,而且利用系統事件,不再依賴於工單聯系客服,可以通過自助處理的方式響應主動運維實例重啟,減少對系統可靠性和業務連續性的影響。 雲服

MySQL資料庫線上安裝更新升級使用

安裝時需要連線網路,關閉防火牆以及selinux mysql線上安裝 方法一:下載mysql的yum 庫檔案 [root@localhost ~]# wget https://repo.mysql.com//mysql80-community-

11g R2 節點系統重建後刪除節點及新增節點 過程問題解決

故障現象: http://www.santongit.com/thread-12327-1-1.html    一個RAC資料庫,兩個節點,RedHat 6.3_X64的系統,因為業務問題,節點2的伺服器的系統進行了重灌。   現需要重建節點2

使用 MongoDB 的兄弟有沒有采用 GridFS 做分散式檔案系統的?

修改 寫補充說明 舉報 新增評論 分享 • 邀請回答 按投票排序按時間排序 6 個回答 贊同8 反對,不會顯示你的姓名 鄧濤、Kenny、李波 等

訊為iTOP4412最小Linux系統

燒寫最小linux系統,需要四個檔案: 1、u-boot-iTOP-4412.bin       系統引導 2、zImage                  &n

一 在應用中升級u-boot、核心以及檔案系統

近期在做在Linux系統中做在應用中升級功能,網路傳輸資料,實現的目標是:通過網路可以對u-boot、核心、檔案系統的檔案進行修改升級。 這裡記錄一下簡單思路: 首先從全域性考慮,要實現的功能網路通訊部分和嵌入式系統對emmc的操作。 網路通訊: 該部分考慮的問題主要是使用

php curl 請求下載檔案以及同時向介面傳送引數檔案

最近在弄抓取資料,自然而然用到curl,結合其中遇到的一些問題,google了很久,加上自己嘗試,最後都解決了。 首先是php curl 從url 下載檔案 function getImage($url, $fileName) { $ch = curl

在Tiny6410linux核心檔案檔案系統

1配置編譯支援NAND啟動的U-boot 在Linux下安裝MiniTools 要啟動MiniTools,進入MiniTools目錄,在root使用者命令列下執行./start.sh MiniTools開啟,如此時MiniTools最底一行顯示“未連線開發板.

磁碟儲存檔案系統

裝置檔案 磁碟裝置的裝置檔案命名:/dev/DEV_FILE SCSI, SATA, SAS, IDE,USB: /dev/sd 虛擬磁碟:/dev/vd 不同磁碟標識:a-z,aa,ab…/dev/sda, /dev/sdb, ... 同一裝置上的不同分割槽:1,2, .../dev

Atitit 分散式檔案系統 hdfs nfs fastfs 目錄 1. 分散式檔案系統 1 2. 什麼是FastDFS 1 2.1. FastDFS特性: 1 2.1.1. fastdfs是否可在

Atitit 分散式檔案系統 hdfs nfs fastfs   目錄 1. 分散式檔案系統 1 2. 什麼是FastDFS 1 2.1. FastDFS特性: 1 2.1.1. fastdfs是否可在windows系統下安裝?可以的話,哪位可以..._百度知道 2

linux基礎3-磁碟檔案系統相關 LINUX支援哪些檔案系統 linux下磁碟分割槽詳解 圖文(fdisk;mkfs)

一 dumpe2fs :    在Linux使用過程中,我們如果要了解檔案系統的配置情況,可以使用dumpe2fs檢視ext2/ext3/ext4格式的檔案系統資訊。 命令格式: dumpe2fs [選項] 裝置 常用選項: -h  僅列出超級塊中的資訊

Linux入門到放棄之六《磁碟檔案系統管理三》

設定磁碟配額 對之前建立的邏輯卷設定磁碟配額,要求使用者student對該邏輯卷 容量的軟限制是:5G,硬限制是7G,檔案個數軟限制為:25個,硬限制為30個。 (1)首先對/etc/fstab檔案進行編輯 命令:vi /etc/fstab 編輯內容如下截圖中紅框部分 (2)因fstab檔案修

第七章 檔案管理(一)——檔案檔案系統

**資料項:**描述物件某種屬性的字符集;是資料組織中可以命名的最小邏輯資料單位。 **記錄:**一組相關資料項集合,描述物件某方面的屬性; **關鍵字:**一個記錄中的一個或幾個資料項的集合,用於唯一的標識一個記錄。 檔案:由建立者定義的、具有檔名的一組相關元素的集合。 有結構:由相關記錄