《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 模擬設(shè)計(jì) > 業(yè)界動(dòng)態(tài) > ARM嵌入式設(shè)備Linux系統(tǒng)啟動(dòng)步驟和方式

ARM嵌入式設(shè)備Linux系統(tǒng)啟動(dòng)步驟和方式

2017-03-23
關(guān)鍵詞: ARM嵌入式

1). 簡(jiǎn)介

本文簡(jiǎn)單介紹ARM嵌入式設(shè)備基于嵌入式Linux操作系統(tǒng)時(shí)候的啟動(dòng)步驟和啟動(dòng)方式, 區(qū)別與X86平臺(tái),ARM平臺(tái)下并沒(méi)有一個(gè)標(biāo)準(zhǔn)的啟動(dòng)步驟,不同ARM SoC都會(huì)使用各自定義的boot ROM來(lái)實(shí)現(xiàn)啟動(dòng)過(guò)程,不過(guò)大體上面都包含有一些基本步驟。本文就基于Toradex ARM計(jì)算機(jī)模塊和配套載板來(lái)介紹基于Freescale i.MX6 ARM嵌入式設(shè)備的啟動(dòng)步驟和方式。


2). 啟動(dòng)步驟

a). 電源上電,系統(tǒng)Reset。

b). CPU內(nèi)部boot ROM讀取, strappingGPIO數(shù)值鎖定。

c). 根據(jù)strapping GPIO值和SoC 內(nèi)部fuse設(shè)置確定用于啟動(dòng)的設(shè)備。

d). 從啟動(dòng)設(shè)備起始位置讀取用于配置DDRRAM和定位boot loader的配置信息。對(duì)于i.MX6平臺(tái),則使用'image vector table (IVT)' 和 'deviceconfiguration data (DCD)' ,如果從NAND設(shè)備啟動(dòng),則還包括 'boot control blocks (BCB)'。

e). DDR RAM被boot ROM初始化。

f). boot loader從啟動(dòng)設(shè)備復(fù)制到RAM執(zhí)行,至此系統(tǒng)控制交由bootloader.也是從這里,一些定制代碼才可以在boot loader里面開(kāi)始執(zhí)行。當(dāng)然也有一些SoC是先將boot loader復(fù)制到SDRAM執(zhí)行后再由boot loader來(lái)初始化DDR RAM。


Toradex ARM核心板使用定制化的U-boot作為boot loader,下面就基于此來(lái)繼續(xù)bootloader加載后的啟動(dòng)過(guò)程。


g). U-Boot從啟動(dòng)設(shè)備上面讀取環(huán)境變量,如果變量數(shù)據(jù)損壞或者不存在,則會(huì)提示'*** Warning - bad CRC, using default environment' ,然后加載默認(rèn)初始設(shè)置.

h). U-Boot通過(guò)分析環(huán)境變量獲得kernel和rootfs存儲(chǔ)位置,以及所需的kernelcommand line

i). U-Boot 自動(dòng)檢測(cè)系統(tǒng)RAM和eMMC/NandFlash容量和參數(shù)

j). U-Boot 設(shè)置以太網(wǎng)口MAC地址,并配置好硬件準(zhǔn)備加載Linuxkernel

k). U-Boot 加載Linux kernel到RAM,至此系統(tǒng)控制權(quán)則轉(zhuǎn)移到kernel來(lái)處理

l). 系統(tǒng)Kernel初始化Linux,加載rootfs,最后啟動(dòng)'init'來(lái)初始化Linuxuser space


3). 啟動(dòng)方式

a). 默認(rèn)方式, U-Boot, kernel和rootfs都位與模塊自帶的eMMC上,全部從eMMC啟動(dòng)。通常情況下的基本模式

b). U-Boot位于eMMC,從eMMC啟動(dòng);而kernel和rootfs位于SD卡,從SD卡啟動(dòng)。常用于切換不同的kernel和rootfs版本

c). U-Boot位于eMMC,從eMMC啟動(dòng);而kernel從TFTP加載,rootfs從NFS加載。常用于kernel和application開(kāi)發(fā)調(diào)試階段


4). 不同啟動(dòng)方式演示

這里使用ToradexApalis i.MX6Q計(jì)算機(jī)模塊配合ApalisEva 開(kāi)發(fā)載板來(lái)進(jìn)行測(cè)試,平臺(tái)基本的操作上手指南請(qǐng)見(jiàn)這里。

軟件使用Toradex官方發(fā)布的LinuxV2.5beta3版本,請(qǐng)從這里下載。

a). 全部從eMMC啟動(dòng)

模塊默認(rèn)的U-Boot設(shè)置即為全部從eMMC啟動(dòng),開(kāi)機(jī)上電即可

b). Kernel和rootfs從SD卡啟動(dòng)

./ 準(zhǔn)備SD卡:將SD卡(幾百M(fèi)B容量以上,這里使用8GB)分為2個(gè)分區(qū),第一個(gè)分區(qū)為FAT32格式,一般幾十MB即可,這里演示操作為1GB;另外一個(gè)分區(qū)為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 = 扇區(qū) of 1 * 512 = 512bytes

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

I/O size (minimum/optimal): 512 bytes / 512bytes

Disk identifier: 0x00000000


  設(shè)備啟動(dòng)      起點(diǎn)          終點(diǎn)     塊數(shù)   Id  系統(tǒng)

/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

----------------------------------


./ 制作啟動(dòng)SD卡

// 復(fù)制Linux image 壓縮包里面的kernel和device tree文件到FAT32分區(qū)

----------------------------------

$ 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

----------------------------------

// 復(fù)制Linux image 壓縮包里面的rootfs文件夾內(nèi)容到ext3分區(qū)

----------------------------------

$ cd .../Apalis_iMX6_LinuxImageV2.5

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

----------------------------------


./ 將SD卡插入Apalis Eva載板8-bit SD卡插槽, 開(kāi)機(jī)上電進(jìn)入uboot

----------------------------------

Apalis iMX6 # printenv

...

fdt_file=imx6q-apalis-eval.dtb //確保device tree文件和上面FAT32分區(qū)里面的命名一致

...


Apalis iMX6 # run sdboot

----------------------------------

./ 啟動(dòng)后就可以進(jìn)行正常的應(yīng)用開(kāi)發(fā)測(cè)試了.


c).TFTP/NFS加載kernel/filesystem啟動(dòng)

./ 默認(rèn)目標(biāo)版系統(tǒng)和開(kāi)發(fā)主機(jī)已經(jīng)在同一局域網(wǎng)內(nèi)并通過(guò)網(wǎng)內(nèi)DHCP服務(wù)器自動(dòng)取得IP地址,如果需要手動(dòng)搭建DHCP服務(wù)器,請(qǐng)參考這里。


./ 配置TFTP Server

// 在Ubuntu 開(kāi)發(fā)主機(jī)通過(guò)下面命令建立TFTPServer

----------------------------------

$ sudo apt-get install tftpd-hpa

$ sudo vi /etc/default/tftpd-hpa


//默認(rèn)tftp server配置,也可以更換目錄,不過(guò)需要修改目錄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

//如已經(jīng)啟動(dòng),重新加載配置,則可運(yùn)行

$ sudo service tftpd-hpa force-reload

----------------------------------

// 復(fù)制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 開(kāi)發(fā)主機(jī)通過(guò)下面命令建立NFSServer

----------------------------------

$ sudo apt-get install nfs-kernel-server

$ sudo vi /etc/exports

//增加下面NFS配置, ‘10.20.1.111/24’為開(kāi)發(fā)主機(jī)IP/Mask配置

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


$ sudo service nfs-kernel-server restart

----------------------------------

// 復(fù)制rootfs文件到NFS Server文件夾

----------------------------------

$ cd .../Apalis_iMX6_LinuxImageV2.5

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

----------------------------------


./ 配置Apalis i.MX6目標(biāo)系統(tǒng)

//開(kāi)機(jī)上電進(jìn)入U(xiǎn)boot,修改如下參數(shù)

----------------------------------

# 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:onroot=/dev/nfs nfsroot=10.20.1.111:/srv/nfs rw netdevwait’

// ip = 目標(biāo)板IP:NFS Server IP:網(wǎng)關(guān):Mask

// 啟動(dòng)NFS boot

# run nfsboot

----------------------------------


5). 總結(jié)

由上可見(jiàn),在ARM平臺(tái)使用和開(kāi)發(fā)的時(shí)候可以靈活利用各種啟動(dòng)方式,提供更為方便和高效的開(kāi)發(fā)或使用過(guò)程。


參考文檔

http://developer.toradex.com/knowledge-base/linux-booting


更多內(nèi)容請(qǐng)?jiān)L問(wèn) 韜睿(上海)計(jì)算機(jī)科技有限公司(http://c.gongkong.com/?cid=16879)


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。