資料介紹
本文所述的ARM的指的是Cortex A系列以及ARM9,ARM11,跑Linux操作系統(tǒng)。對于CortexM系列并不一定完全適用;
談到ARM以及啟動和燒寫等方面,首先我們要明確一下幾個關(guān)鍵詞:Uboot,Cmdline,啟動方式選擇,文件系統(tǒng)格式,存儲介質(zhì),如NAND,EMMC,SD卡等
下面一個一個做相關(guān)介紹:
啟動方式:
① 一般CPU都可以配置為從多種介質(zhì)啟動,比如SPI Nor Flash,NAND,EMMC,SD卡,U盤等
② 大致原理是CPU內(nèi)部ROM有一段固化的啟動代碼,根據(jù)CPU配置引腳,判斷啟動位置,然后從外部介質(zhì)讀取數(shù)據(jù)啟動
③ 一般啟動介質(zhì)的前一部分代碼的作用必須是:初始化硬件參數(shù),自身拷貝
④ 關(guān)于自拷貝:因為CPU內(nèi)部RAM很小,因此只能讀取一部分啟動介質(zhì)的數(shù)據(jù)即Uboot到內(nèi)部RAM運行,所以Uboot前一部分的工作需要將自身剩余部分拷貝到外部RAM中,然后加載運行
Uboot:
① 主要作用:引導Linux系統(tǒng)(主要是從存儲介質(zhì)的哪個地方讀取Kernel,傳遞什么樣的啟動參數(shù))
② 其他功能:支持很多命令,主要是存儲控制和網(wǎng)絡(luò)命令,最終目的還是引導和升級系統(tǒng)用
③ 常用操作:TFTP,NAS,F(xiàn)lash操作,UBI操作,Setenv,boot等
④ 一般升級系統(tǒng)流程:使用tftp方式從主機下載kernel及文件系統(tǒng)等文件,然后使用flash等命令燒寫到存儲介質(zhì)如NAND,最后設(shè)定啟動參數(shù),然后引導系統(tǒng)啟動;
⑤ 一般調(diào)試流程,介紹2種:
- 使用NAS從主機直接加載文件系統(tǒng),直接在線調(diào)試,快捷方便
- 設(shè)定從SD卡啟動,從SD卡加載kernel和文件系統(tǒng)調(diào)試
CMDLINE:
① 一般由Uboot傳遞給Kernel,或者Kernel中配置寫死不過一般很少見
② 主要2個參數(shù):
第一,指定console設(shè)備,用于打印輸出及做控制臺用
第二,指定rootfs掛載分區(qū)和類型
③ 看2個例子:
從NAND啟動,/proc/cmdline,加載的是UBI文件系統(tǒng),位置在mtd3
console=ttymxc0,115200 ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs mtdparts=gpmi-nand:5m(boot),10m(kernel),1m(dtb),-(rootfs)
從SD卡啟動,/proc/cmdline,加載的是ext4文件系統(tǒng),位置在sd卡第二分區(qū)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)
存儲介質(zhì):
主要介紹Raw Flash 及 FTL devices區(qū)別
Flash特點:寫入前需要先擦除,有壽命且不長,而且容易產(chǎn)生壞塊
RAW Flash:即裸芯片,沒有控制器,針對其主要操作有擦除,讀和寫
Device: 在裸芯片上加了控制器,比如SD卡,U盤等;加了控制器后,只需要讀和寫就行了,不需要擦除??刂破髯隽艘幌盗械墓ぷ鳎翰脸p平衡,磨損算法等等,一個控制器算法的好壞直接決定了設(shè)備的使用壽命。
文件系統(tǒng):
① FAT:windows常用文件系統(tǒng),一般U盤,sd卡即為fat格式
② ext2/3/4,Linux常用文件系統(tǒng),一般用于FTL Device,即只有讀和寫
③ JFFS2,Linux常用,一般用于容量較小的Flash,且是Raw Flash,MTD設(shè)備
④ UBIFS,Linux常用文件系統(tǒng),只能用于Raw Flash,因為kernel ubi子系統(tǒng),有相關(guān)的磨損平衡算法,可以保證效率
⑤ SD卡啟動,文件系統(tǒng)掛載情況:
# 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啟動,文件系統(tǒng)掛載情況:
# 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到對應(yīng)的分區(qū)即可
② 第二使用芯片廠家的燒寫工具,如nxp的 mfgtoos,在pc上通過usb燒寫文件
③ 如已有uboot,在uboot中從sd卡,U盤等讀取文件燒寫;或tftp從pc下載文件燒寫
升級過程:
① 此升級指的是Uboot OK的前提下做Uboot,kernel,rootfs等升級
② 通過SD卡升級,一般是首先在PC上制作SD卡啟動分區(qū),通過官方的工具燒寫升級文件到SD卡即可;此處的升級文件分兩個方面:
- 最小升級內(nèi)核,并且包含升級腳本,此腳本會將目標文件燒寫到存儲介質(zhì)中
- 目標升級文件,即要燒寫到比如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 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 ..
最小系統(tǒng)加載啟動完畢后,運行升級腳本
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=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到對應(yīng)分區(qū) 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到對應(yīng)分區(qū) 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到對應(yīng)分區(qū) 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上建立好文件系統(tǒng)格式 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壓縮包解壓到對應(yīng)分區(qū)即可; 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"
版權(quán)聲明:本文為博主 WindLOR 原創(chuàng)文章,
遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/wind0419/article/details/77973144
- 認識linux文件系統(tǒng)——文件系統(tǒng)啟動過程介紹 1次下載
- ROC RK3399 PC Pro文件系統(tǒng)Linux根文件系統(tǒng)鏡像(arm64/arm32)
- Core 3399 JD4 V2文件系統(tǒng)Linux根文件系統(tǒng)鏡像(arm64/arm32)
- Core 3399Pro JD4文件系統(tǒng)Linux根文件系統(tǒng)鏡像(arm64&arm32)
- Core 3399 JD4文件系統(tǒng)Linux根文件系統(tǒng)鏡像(arm64&arm32)
- FATFS文件系統(tǒng)詳解
- DCS和PLC控制系統(tǒng)升級改造分析
- 通過minicom和kermit利用串口下載內(nèi)核映象和文件系統(tǒng) 4次下載
- ARM的啟動過程start.S匯編文件的指令的詳細分析 46次下載
- 嵌入式系統(tǒng)文件系統(tǒng)比較 1次下載
- 《Linux設(shè)備驅(qū)動開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng) 0次下載
- 單片機C51程序燒寫過程 0次下載
- Linux源碼分析系列之文件系統(tǒng) 51次下載
- 基于ARM的SD卡文件系統(tǒng)設(shè)計
- Linux文件系統(tǒng)課程 0次下載
- 如何修改buildroot和debian文件系統(tǒng) 254次閱讀
- Linux 文件系統(tǒng)層的主要結(jié)構(gòu) 872次閱讀
- 分析ARM Cortex-M內(nèi)核復(fù)位啟動過程 2047次閱讀
- 如何制作ubuntu20.04的文件系統(tǒng) 3488次閱讀
- 深入剖析Linux內(nèi)核虛擬文件系統(tǒng) 2952次閱讀
- 什么是分布式文件系統(tǒng) 3990次閱讀
- 汽車電子系統(tǒng)中閃存文件系統(tǒng)的應(yīng)用設(shè)計與研究 1768次閱讀
- 基于FPGA和Nios II處理器IP軟核實現(xiàn)實現(xiàn)SD卡接口和文件系統(tǒng)的設(shè)計 2117次閱讀
- 在QEMU上用Busybox模擬ARM文件系統(tǒng)的步驟 3101次閱讀
- 基于Buildroot的Linux系統(tǒng)構(gòu)建之根文件系統(tǒng) 2478次閱讀
- 使用RT-Thread文件系統(tǒng) 8484次閱讀
- 文件系統(tǒng)是什么?淺談EXT文件系統(tǒng)歷史 5548次閱讀
- debian安裝zfs文件系統(tǒng) 1w次閱讀
- 詳解bootloader的執(zhí)行流程與ARM Linux啟動過程分析 1w次閱讀
- 玩轉(zhuǎn)Linux,先把文件系統(tǒng)搞懂 2009次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關(guān)電源基礎(chǔ)知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計與實現(xiàn)
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發(fā)板設(shè)計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多