ARM嵌入式裝置Linux系統啟動步驟和方式

2021-07-14 22:20:12 字數 4897 閱讀 2283

by toradex秦海

1). 簡介

本文簡單介紹arm嵌入式裝置基於嵌入式linux作業系統時候的啟動步驟和啟動方式, 區別與x86平台,arm平台下並沒有乙個標準的啟動步驟,不同arm soc都會使用各自定義的boot rom來實現啟動過程,不過大體上面都包含有一些基本步驟。本文就基於toradex arm計算機模組和配套載板來介紹基於freescale i.mx6 arm嵌入式裝置的啟動步驟和方式。

2). 啟動步驟

a). 電源上電,系統reset。

d). 從啟動裝置起始位置讀取用於配置ddrram和定位boot loader的配置資訊。對於i.mx6平台,則使用'image vector table (ivt)' 和 'deviceconfiguration data (dcd)' ,如果從nand裝置啟動,則還包括 'boot control blocks (bcb)'。

e). ddr ram被boot rom初始化。

f). boot loader從啟動裝置複製到ram執行,至此系統控制交由bootloader.也是從這裡,一些定製**才可以在boot loader裡面開始執行。當然也有一些soc是先將boot loader複製到sdram執行後再由boot loader來初始化ddr ram。

toradex arm核心板使用定製化的u-boot作為boot loader,下面就基於此來繼續bootloader載入後的啟動過程。

g). u-boot從啟動裝置上面讀取環境變數,如果變數資料損壞或者不存在,則會提示'*** warning - bad crc, using default environment' ,然後載入預設初始設定.

h). u-boot通過分析環境變數獲得kernel和rootfs儲存位置,以及所需的kernelcommand line

i). u-boot 自動檢測系統ram和emmc/nandflash容量和引數

j). u-boot 設定乙太網口mac位址,並配置好硬體準備載入linuxkernel

k). u-boot 載入linux kernel到ram,至此系統控制權則轉移到kernel來處理

l). 系統kernel初始化linux,載入rootfs,最後啟動'init'來初始化linuxuser space

3). 啟動方式

a). 預設方式, u-boot, kernel和rootfs都位與模組自帶的emmc上,全部從emmc啟動。通常情況下的基本模式

b). u-boot位於emmc,從emmc啟動;而kernel和rootfs位於sd卡,從sd卡啟動。常用於切換不同的kernel和rootfs版本

4). 不同啟動方式演示

這裡使用toradexapalis i.mx6q 計算機模組配合apaliseva 開發載板來進行測試,平台基本的操作上手指南請見這裡。

a). 全部從emmc啟動

模組預設的u-boot設定即為全部從emmc啟動,開機上電即可

b). kernel和rootfs從sd卡啟動

./ 準備sd卡:將sd卡(幾百mb容量以上,這裡使用8gb)分為2個分割槽,第乙個分割槽為fat32格式,一般幾十mb即可,這裡演示操作為1gb;另外乙個分割槽為ext3格式,分配為剩下sd卡容量。

$ sudo fdisk /dev/sdc

命令(輸入 m 獲取幫助): p

disk /dev/sdc: 7744 mb, 7744782336 bytes

255 heads, 63 sectors/track, 941 cylinders,total 15126528 sectors

units = 扇區 of 1 * 512 = 512bytes

sector size (logical/physical): 512 bytes /512 bytes

i/o size (minimum/optimal): 512 bytes / 512bytes

disk identifier: 0x00000000

裝置 啟動      起點          終點     塊數   id  系統

/dev/sdc1            2048     2099199    1048576    c  w95 fat32 (lba)

/dev/sdc2         2099200    15126527    6513664   83  linux

$ sudo mkfs.vfat -f 32 -n boot /dev/sdc1

$ sudo mkfs.ext3 -l fs /dev/sdc2

./ 製作啟動sd卡

// 複製linux image 壓縮包裡面的kernel和device tree檔案到fat32分割槽

$ cd.../apalis_imx6_linuximagev2.5/apalis-imx6_bin

$ cpuimage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-v2.5b3-apalis-imx6-20151215145612.bin/media/username/boot/uimage

$ cpuimage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-v2.5b3-imx6q-apalis-eval-20151215145612.dtb/media/simon/boot/imx6q-apalis-eval.dtb

// 複製linux image 壓縮包裡面的rootfs資料夾內容到ext3分割槽

$ cd .../apalis_imx6_linuximagev2.5

$ sudo cp -ppr rootfs/* /media/simon/fs/

./ 將sd卡插入apalis eva載板8-bit sd卡插槽, 開機上電進入uboot

apalis imx6 # printenv

fdt_file=imx6q-apalis-eval.dtb //確保device tree檔案和上面fat32分割槽裡面的命名一致

apalis imx6 # run sdboot

./ 啟動後就可以進行正常的應用開發測試了.

c).tftp/nfs載入kernel/filesystem啟動

./ 配置tftp server

// 在ubuntu 開發主機通過下面命令建立tftpserver

$ sudo apt-get install tftpd-hpa

$ sudo vi /etc/default/tftpd-hpa

//預設tftp server配置,也可以更換目錄,不過需要修改目錄group為」nogroup」

$ sudo vi /etc/default/tftpd-hpa

tftp_username="tftp"

tftp_directory="/var/lib/tftpboot"

tftp_address="[::]:69"

tftp_options="--secure"

$ sudo service tftpd-hpa start

$ sudo service tftpd-hpa force-reload

// 複製kernel和device tree檔案到tftpserver資料夾

$ cd.../apalis_imx6_linuximagev2.5/apalis-imx6_bin

$ sudo cpuimage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-v2.5b3-apalis-imx6-20151215145612.bin/var/lib/tftpboot/uimage

$ sudo cpuimage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-v2.5b3-imx6q-apalis-eval-20151215145612.dtb/var/lib/tftpboot/imx6q-apalis-eval.dtb

./ 配置nfs server

// 在ubuntu 開發主機通過下面命令建立nfsserver

$ sudo apt-get install nfs-kernel-server

$ sudo vi /etc/exports

//增加下面nfs配置, 『10.20.1.111/24』為開發主機ip/mask配置

/srv/nfs10.20.1.111/24(no_root_squash,no_subtree_check,rw,fsid=root)

$ sudo service nfs-kernel-server restart

// 複製rootfs檔案到nfs server資料夾

$ cd .../apalis_imx6_linuximagev2.5

$ sudo cp -ppr rootfs/* /srv/nfs/

./ 配置apalis i.mx6目標系統

//開機上電進入uboot,修改如下引數

# setenv serverip 『10.20.1.111』  //tftp server ip

# setenv nfsargs『ip=10.20.1.115:10.20.1.111:10.20.1.1:255.255.255.0::eth0:on root=/dev/nfsnfsroot=10.20.1.111:/srv/nfs rw netdevwait』

// ip = 目標板ip:nfs server ip:閘道器:mask

// 啟動nfs boot

# run nfsboot

5). 總結

由上可見,在arm平台使用和開發的時候可以靈活利用各種啟動方式,提供更為方便和高效的開發或使用過程。

參考文件

ARM嵌入式裝置Linux系統啟動步驟和方式

1 簡介 本文簡單介紹arm嵌入式裝置基於嵌入式linux作業系統時候的啟動步驟和啟動方式,區別與x86平台,arm平台下並沒有乙個標準的啟動步驟,不同arm soc都會使用各自定義的boot rom來實現啟動過程,不過大體上面都包含有一些基本步驟。本文就基於toradex arm計算機模組和配套載...

外網訪問ARM嵌入式Linux系統

實驗室裡的arm嵌入式linux系統,只能在區域網內訪問,怎樣從外網也能訪問arm嵌入式linux系統?本文將介紹具體的實現步驟。arm嵌入式linux系統預設的sshd埠是22。holer軟體包 holer linux arm.tar.gz holer支援多種arm版本,請選擇跟自己arm版本匹配...

ARM嵌入式Linux移植體驗裝置驅動(續1)

裝置驅動程式是作業系統核心和機器硬體之間的介面,它為應用程式遮蔽硬體的細節,一般來說,linux的設 備驅動程式需要完成如下功能 裝置初始化 釋放 提供各類裝置服務 負責核心和裝置之間的資料交換 檢測和處理裝置工作過程中出現的錯誤。linux下的裝置驅動程式被組織為一組完成不同任務的函式的集合,通過...