1. ZYNQ的啟動(dòng)流程
Zynq7000就如同他的名字一樣,Zynq-7000 Extensible Processing Platform,是一個(gè)可擴(kuò)展處理平臺(tái),簡(jiǎn)單說就是有個(gè)FPGA做外設(shè)的A9雙核處理器。
所以,它的啟動(dòng)流程自然也和FPGA完全不同,而與傳統(tǒng)的ARM處理器類似。
Zynq7000支持從多種設(shè)備啟動(dòng),包括JTAG,NAND,parallel NOR,Serial NOR (Quad-SPI),以及SD卡。按手冊(cè)說明除了JTAG之外的啟動(dòng)方式均支持安全啟動(dòng),使用AES、SHA256加密后的啟動(dòng)代碼,(不過在勘誤里說到,當(dāng)前硅片版本的無法正常使用secure configuration功能,所以俺就不介紹它鳥)。
還是按照時(shí)間順序來介紹下具體流程吧
1. 在器件上電運(yùn)行后,處理器自動(dòng)開始Stage-0 Boot,也就是執(zhí)行片內(nèi)BootROM中的代碼
2. BootROM會(huì)初始化CPU和一些外設(shè),以便讀取下一個(gè)啟動(dòng)階段所需的程序代碼,F(xiàn)SBL(First Stage Bootloader)。
不過這又有一個(gè)問題了----之前說到,Zynq支持多種啟動(dòng)設(shè)備,BootROM怎么知道從哪個(gè)啟動(dòng)設(shè)備里去加載FSBL?這就得靠幾個(gè)特殊的MIO引腳來選擇了,
BootROM會(huì)去讀取MIO[2..8],從而確定啟動(dòng)設(shè)備,將選定設(shè)備的頭192Kbyte內(nèi)容,也就是FSBL,復(fù)制到OCM(On Chip Memory)中,并將控制器交給FSBL。
3. FSBL啟動(dòng)時(shí)可以使用整塊256Kb的OCM,當(dāng)FSBL開始運(yùn)行后,器件就正式由咱自己控制了。Xilinx提供了一份FSBL代碼,如果沒什么特殊要求,可以直接使用。
按照手冊(cè)說明,F(xiàn)SBL應(yīng)該完成以下幾件事。
1). 使用XPS提供的代碼,繼續(xù)初始化PS
2). 將bitstream寫入PL(配置FPGA),不過這一步也可以以后再做
3). 將接下來啟動(dòng)用的Second Stage Bootloader(SSBL,一般就是U-Boot一類的東西),或者裸奔程序,復(fù)制到內(nèi)存中
4). 跳到SSBL運(yùn)行去
4. 接下來的步驟就沒啥特別了,Uboot開始運(yùn)行,初始化好Linux啟動(dòng)環(huán)境,然后開始運(yùn)行Linux系統(tǒng)。
2. 啟動(dòng)時(shí)SD卡文件內(nèi)容
1. zImage、BOOT.BIN、devicetree_ramdisk.dtb、ramdisk8M.image.gz
2. zynq芯片上電初始化,進(jìn)入u-boot,會(huì)自動(dòng)加載devicetree、zImage和rootfs,然后啟動(dòng)Linux
3. BOOT、Devicetree和zImage,放到SD卡的第一個(gè)分區(qū)里(分區(qū)方式在,第一個(gè)區(qū)BOOT 50MB fat32格式,第二個(gè)區(qū)rootfs ext4格式)。
Linaro的rootfs在這里下載:
下載后,通過下面的命令解壓到SD卡的第二個(gè)分區(qū)里即可:
sudo tar --strip-components=3 -C /media/rootfs -xzpf linaro-precise-ubuntu-desktop-20120626-247.tar.gz binary/boot/filesystem.dir
3. SD卡文件內(nèi)容一(zImage)
詳細(xì)步驟:以下操作均在root用戶下進(jìn)行,官方參考網(wǎng)址的東西僅是“參考”的
1. 下載交叉編譯器
在ubuntu里下載arm-2010.09-62-arm-xilinxa9-linux-gnueabi.bin安裝文件,在網(wǎng)站https://code.google.com/p/zedboard-book-source/downloads/list上的
download里下載,放到/tools/中
2. 同步xilinx的linux kernel
mkdir /kernel
cd /kernel
git clone git://git.xilinx.com/(project name)
(project name) has 3:
linux-xlnx.gitLinux sources
u-boot-xlnx.gitU-boot sources
qemu-xarm.gitZynq-7000 AP SoC QEMU system model
然后就等著吧,總共1.3G的代碼,下載完畢后,
cd /kernel/
ls
有個(gè)新的文件夾linux-xlnx,這個(gè)就是zynq的linux kernel代碼了。。
如果你的網(wǎng)絡(luò)不支持git,可以用http代理服務(wù),先建立一個(gè) git-proxy.sh文件,在里面寫上:
#!/bin/sh
exec corkscrew $*
然后export一下,
bash> export GIT_PROXY_COMMAND="http://git-proxy.sh"
上面 上的方法,我的實(shí)際情況比較特殊,網(wǎng)絡(luò)服務(wù)器還要用戶名和密碼,怎么辦呢,稍微麻煩一點(diǎn):
將git-proxy.sh中的內(nèi)容修改成這樣滴:
#!/bin/sh
exec corkscrew 172.16.0.252 8080 $* /disk2data/authfile
然后再在git-proxy.sh同目錄下建立一個(gè)authfile文件,內(nèi)容為
用戶名:密碼
最后export GIT_PROXY_COMMAND="http://git-proxy.sh"
至此我的電腦也可以無憂無慮的git啦
3. 安裝交叉編譯器
cd //tools/
chmod 755 arm-2010.09-62-arm-xilinxa9-linux-gnueabi.bin
./ arm-2010.09-62-arm-xilinxa9-linux-gnueabi.bin
然后出現(xiàn)了安裝界面,選擇安裝的文件夾等等,可以自己設(shè),嫌麻煩就一路回車或者“yes”就行了。不過要記住安裝的目錄,這個(gè)一會(huì)兒編譯的時(shí)候要用到….
4. 設(shè)置交叉編譯環(huán)境
官網(wǎng) 上說下載ia32-libs的庫,
apt-get install ia32-libs
但是我的電腦因?yàn)橹芭渲眠^android的編譯環(huán)境,已經(jīng)安裝了,直接修改設(shè)置/etc/bash.bashrc文件就可以了:
在命令行上輸入gedit /etc/bash.bashrc,添加以下內(nèi)容:
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export PATH=/home/(…)/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH
5. 編譯zynq的內(nèi)核
由于zedboard內(nèi)核還沒有被加入到zynq的內(nèi)核中,我們就先用zc702/770的板卡配置來測(cè)試一下環(huán)境吧:
cd //kernel/linux-2.6-xlnx
make ARCH=arm xilinx_zynq_defconfig -- 配置內(nèi)核
make ARCH=arm -- 編譯
大概需要幾分鐘吧,編譯就完成了,查看
cd /myPath/kernel/linux-xlnx/arch/arm/boot
里面的zImage就是剛剛生成的內(nèi)核
============ 如果git沒安裝且用apt-get install git時(shí)找不到服務(wù)器 ===============
修改 /etc/apt/source.list 來增加源的服務(wù)器來獲得軟件的列表
deb natty main restricted universe multiverse
deb natty-security main restricted universe multiverse
deb natty-updates main restricted universe multiverse
deb natty-backports main restricted universe multiverse
deb natty-proposed main restricted universe multiverse
deb-src natty main restricted universe multiverse
deb-src natty-security main restricted universe multiverse
deb-src natty-updates main restricted universe multiverse
deb-src natty-backports main restricted universe multiverse
deb-src natty-proposed main restricted universe multiverse
deb karmic main multiverse restricted universe
deb karmic-backports main multiverse restricted universe
deb karmic-proposed main multiverse restricted universe
deb karmic-security main multiverse restricted universe
deb karmic-updates main multiverse restricted universe
deb-src karmic main multiverse restricted universe
deb-src karmic-backports main multiverse restricted universe
deb-src karmic-proposed main multiverse restricted universe
deb-src karmic-security main multiverse restricted universe
deb-src karmic-updates main multiverse restricted universe
在修改完源列表后, 切記要 sudo apt-get update一下, 否則修改后的源是不生效的。
4. SD卡文件內(nèi)容二(BOOT.bin)
SDK會(huì)生成FSBL的elf文件,另外加上從XPS導(dǎo)出的System.bit,以及我們?cè)诘谝黄恼轮芯幾g生成的u-boot.elf,就可以生成用來實(shí)現(xiàn)SD卡啟動(dòng)系統(tǒng)的完整Bootloader。
集齊u-boot.elf、system.bit和fsbl.elf就可以生成Image文件了,在SDK軟件中點(diǎn)擊Xilinx Tools→CreateBoot Image,然后選擇3個(gè)文件,點(diǎn)擊Create Image,生成文件,其中
u-boot.bin文件就是需要的u-boot image文件,將其重命名為BOOT.BIN后拷貝到SD卡中。
4.1. Elf文件(FSBL)
fsbl.elf文件需要在SDK軟件中生成,首先新建工程,選擇Xilinx C Project,然后選擇Zynq FSBL,編譯工程即可生成zynq_fsbl_0.elf文件。
4.2. System.bit文件
system.bit是PL部分的BIT文件,首先在ISE軟件中新建工程,加入zynq系統(tǒng),在EDK中配置ARM核及其外設(shè),返回ISE生成TOP HDL Source,點(diǎn)擊generate Programming File即可生
成Bit文件,然后點(diǎn)擊Export Hardware Design To SDK with Bitstream進(jìn)入下一步。
4.3. U-boot.elf文件(SSBL)
1. 首先Git下載Xilinx U-Boot代碼
git clone git://git.xilinx.com/u-boot-xlnx.git
2. 配置u-boot,在上一篇博客中介紹了交叉編譯環(huán)境的建立,此處可直接進(jìn)行配置
cd u-boot-xlnx
make zynq_zed_config
3. 編譯u-boot
Make
以上步驟完成之后會(huì)生成一個(gè)u-boot文件,將其另存為u-boot.elf文件,此文件在生成Bootimage文件時(shí)會(huì)使用到。
5. SD卡文件內(nèi)容三(Device Tree Blob)
5.1. Xilinx官網(wǎng)方法
This how-to describes the process of compiling a device tree blob.
Build Device Tree Blob is a part of the Xilinx design flow described in Getting Started.
Task Dependencies (Pre-requisites)
· Fetch Sources(Device Tree Generator sources and Linux sources)
· Hardware Project
Input Files Required
· Hardware Project directory
· Linux source directory
Output Files Produced
· *.dts, *.dtb
Task Description
Creating a Device Tree Source (.dts) file
1 Open the hardware project in XPS.
Export the hardware system to SDK:
XPS Menu: Project > Export Hardware Design to SDK... > Export & Launch SDK
2 The Device Tree Generator Git repository needs to be downloaded as specified on the Fetch Sources page. In order for SDK to be able to import the Device
Tree Generator correctly, the downloaded Git repository device-tree/ will need to be placed under /bsp/ (create this directory hierarchy, if needed). The file hierarchy needs to look like:
/bsp/device-tree/data/device-tree_v2_1_0.mld
/bsp/device-tree/data/device-tree_v2_1_0.tcl
Add the BSP repository in SDK:
SDK Menu: Xilinx Tools > Repositories > New... () > OK
Create a Device Tree Board Support Package (BSP):
SDK Menu: File > New > Board Support Package > Board Support Package OS: device-tree > Finish
3 A BSP settings window will appear. This window can also be accessed by opening the Device Tree BSP's system.mss file and clicking 'Modify this BSP's Settings'.
Fill in the values as appropriate:
o The 'bootargs' parameter specifies the arguments passed to the kernel at boot time (kernel command line). ***
o The 'console device' parameter specifies which serial output device will be used. Select a value from the drop-down.
The .dts file is now located in //
/libsrc/device-tree_v*/xilinx.dts.
*** e.g. console=, root=/dev/ram rw ip=:::::eth0:dhcp earlyprintk
*** Some example values for are ttyPS0 when using Zynq, ttyUL0 when using the UART Lite soft ip, or ttyS0 when using the UART16550 soft ip.
In the Linux source directory, there are also some DTS files available for use in linux-xlnx/arch//boot/dts/.
Compiling a Device Tree Blob (.dtb) file from the DTS
A utility called DTC is used to compile the DTS file into a DTB file. DTC is part of the Linux source directory. linux-xlnx/scripts/dtc/ contains the source code for DTC and needs to be compiled in order to be used. One way to compile the DTC is to build the Linux tree.
Once the DTC is available, the tool may be invoked to generate the DTB:
./scripts/dtc/dtc -I dts -O dtb -o .dtb .dts
DTC may also be used to convert a DTB back into a DTS:
./scripts/dtc/dtc -I dtb -O dts -o .dts .dtb
Alternative: For ARM only
In the Linux source directory, making the target 'dtbs' will compile all DTS files from linux-xlnx/arch/arm/boot/dts/ into DTB files.
make ARCH=arm dtbs
The compiled DTB files will be located in linux-xlnx/arch/arm/boot/dts/.
A single linux-xlnx/arch/arm/boot/dts/.dts may be compiled into linux-xlnx/arch/arm/boot/dts/.dtb:
make ARCH=arm .dtb
5.2. 懶兔子博客方法
在上一篇博文中,我已經(jīng)介紹了建立AXI總線自定義外設(shè)的全過程,包括Verilog邏輯部分,和裸機(jī)軟件部分。裸機(jī)控制外設(shè)是非常簡(jiǎn)單的,與普通的單片機(jī)并無二異,但僅僅有裸奔代碼還遠(yuǎn)遠(yuǎn)
無法發(fā)揮Cortex-A9硬核的作用,畢竟Zynq芯片集成了一顆最高能跑到1GHz的雙核CPU(ZedBoard上的XC7Z020只能到800MHz)。并且ZedBoard上配備了Gigabit Ethernet、HDMI
和USB OTG接口,不運(yùn)行操作系統(tǒng)豈不浪費(fèi)。
有朋友想要在ZedBoard上做WinCE,但這方面的資料極為稀缺,而WinCE又是體積龐大、版權(quán)成本很高的操作系統(tǒng),于是開源有小巧的嵌入式Linux就成了首選。之前兔子為了做出圖形界
面,還致力于移植桌面型的Linaro Ubuntu系統(tǒng),不過ADI給出的參考例子未經(jīng)優(yōu)化奇卡無比,Xillinux正式版遲遲未現(xiàn)又只支持色彩度很低的簡(jiǎn)易VGA接口(ZedBoard上的VGA甚至到不了
16位色),于是兔子不得不放棄之前的工作,重新啟用ZedBoard出廠默認(rèn)的輕量級(jí)Linux上。這個(gè)系統(tǒng)沒有圖形桌面,但已包含了網(wǎng)卡、HDMI驅(qū)動(dòng)和其他基本功能,足夠使用了。
想要在Linux下控制外設(shè),最重要的一環(huán)就是驅(qū)動(dòng)了,但在動(dòng)手寫驅(qū)動(dòng)之前,先要做些準(zhǔn)備工作。為了減少工作量,我們就直接修改ZedBoard的出廠Demo,加入之前完成的my_gpio外設(shè),
并通過U-Boot實(shí)現(xiàn)Bootloader功能。這個(gè)Demo的源工程可以在Digilent網(wǎng)站的ZedBoard頁面找到:
?NavPath=2,400,1028&Prod=ZEDBOARD
點(diǎn)擊下面的Download,可以下載到ZedBoard_OOB_Design.zip文件,這個(gè)壓縮包里包含了XPS工程、U-Boot文件、Linux內(nèi)核配置文件、DeviceTree源文件、rootfs等。README.txt
中有相近的操作說明,建議通讀一遍。
ZedBoard上默認(rèn)的XPS系統(tǒng)工程位于hw\xps_proj文件夾下,雙擊system.xmp打開工程,按照之前所說的方法,將my_gpio外設(shè)IP核導(dǎo)入到工程中。
傳送門:ZedBoard學(xué)習(xí)手記(二) 開發(fā)自定義AXI總線外設(shè)IP核——以LED和開關(guān)為例
之后,查看一下XPS是否為我們的外設(shè)分配了地址空間,如果沒有,就需要手動(dòng)設(shè)置一個(gè)地址,這里我們?cè)O(shè)成0x75C80000,空間大小為AXI設(shè)備統(tǒng)一的64K。
按照ZedBoard學(xué)習(xí)手記(二)中的方法設(shè)置總線連接,結(jié)果如下圖:
修改xps_proj\data\system.ucf文件,為my_gpio外設(shè)分配外部引腳(ucf約束文件中的引腳名稱和Ports中的一定要相同,已經(jīng)有不少網(wǎng)友在這里出過問題了)。另外我們分配的引腳占用
了原來ARM的GPIO 引腳位置,應(yīng)在XPS的Port列表里將processing_system7_0_GPIO數(shù)量設(shè)為[0:6]或干禁用,以除后患。
完成后先單擊Generate BitStream生成配置數(shù)據(jù),再點(diǎn)擊Export Design,選Export & Launch SDK將硬件信息導(dǎo)出到SDK中。
在SDK里,新建一個(gè)C工程,不同于裸機(jī)的HelloWorld,這次要建立的是Bootloader,因此選擇FSBL工程,即First Stage Bootloader,用實(shí)現(xiàn)U-Boot之前的初始化和啟動(dòng)工作。其他
選項(xiàng)默認(rèn)即可。
編譯一下工程,完成后SDK會(huì)生成FSBL的elf文件,另外加上從XPS導(dǎo)出的System.bit,以及我們?cè)诘谝黄恼轮芯幾g生成的u-boot.elf,就可以生成用來實(shí)現(xiàn)SD卡啟動(dòng)系統(tǒng)的完整Bootloader文件了。
u-boot.elf在ZedBoard_OOB_Design中包含,不過這個(gè)兔子沒試過,通過Xilinx U-Boot編譯生成u-boot.elf的方法請(qǐng)見:ZedBoard學(xué)習(xí)手記(一) First Step——建立Xilinx交叉編譯環(huán)境
集齊這三個(gè)文件之后,點(diǎn)擊Xilinx Tools→Create Boot Image,添加到列表中,選擇一個(gè)輸出路徑,就可以創(chuàng)建Bootloader了。
SDK會(huì)在輸出路勁生成u-boot.bin文件,將其改為BOOT.bin,拷貝到SD卡中,為ZedBoard板配置合適的跳線。這時(shí)再打開ZedBoard電源,Bootloader會(huì)初始化PS,用BitStream配
置PL(包含了我們創(chuàng)建的my_gpio外設(shè)),并將操作權(quán)移交給U-Boot。U-Boot會(huì)自動(dòng)加載Device Tree、Linux內(nèi)核鏡像和RootFS,最終啟動(dòng)Linux。
ZedBoard出場(chǎng)時(shí)SD中還帶有zImage、devicetree和rootfs文件,這些文件都可以采用原有的,直接用Xilinx交叉編譯工具編譯寫好的C語言驅(qū)動(dòng)就可以在這個(gè)系統(tǒng)上運(yùn)行并控制外設(shè)了。
當(dāng)然,如果你想自己編譯內(nèi)核,或者不想采用靜態(tài)物理地址的方式調(diào)用外設(shè),就需要再往下進(jìn)行一步,注意這一步對(duì)于Linux下控制AXI總線自定義外設(shè)并非必要。
為了給有興趣的朋友繼續(xù)深入研究做個(gè)鋪墊,這里兔子就講一下編譯ZedBoard上運(yùn)行的Linux內(nèi)核和設(shè)備樹吧。當(dāng)然這個(gè)方法也詳細(xì)記錄在ZedBoard_OOB_Design的README文件中。
在PC的Linux環(huán)境下(兔子這里是Ubuntu)通過Git指令下載Digilent Linux內(nèi)核源碼:
git clone git://github.com/Digilent/linux-3.3-digilent.git
切換到ZedBoard Branch:
cd linux-3.3-digilent
git checkout -b zedboard_oob v3.3.0-digilent-12.07-zed-beta
將ZedBoard_OOB_Design中的.config文件拷貝到源碼目錄下,然后編譯內(nèi)核(指的是ZedBoard_OOB_Design所在目錄):
cp /linux/.config ./.config
make
生成的內(nèi)核鏡像zImage 位于/arch/arm/boot/文件夾下。
之后修改devicetree_ramdisk.dts文件,加入my_gpio外設(shè)信息。
/******* LED & Swtich Controller ******/
my_gpio@75c80000 {
compatible = "xlnx,my_gpio-1.00.a";
reg = <0x75c80000 0x10000>;
xlnx,dphase-timeout = <0x8>;
xlnx,family = "virtex6";
xlnx,c_num_reg = <0x1>;
xlnx,c_num_mem = <0x1>;
xlnx,s-axi-min-size = <0x1ff>;
xlnx,c_slv_awidth = <0x20>;
xlnx,c_slv_dwidth = <0x20>;
xlnx,use-wstrb = <0x0>;
};
通過下面指令生成設(shè)備樹,同樣Copy到SD卡中:
./scripts/dtc/dtc -O dtb –I dts –o ./devicetree_ramdisk.dtb \ /linux/devicetree_ramdisk.dts
這個(gè)設(shè)備樹文件有網(wǎng)友說是將驅(qū)動(dòng)加入到內(nèi)核中用的,但兔子以為不然。如果不想通過靜態(tài)設(shè)備物理地址(上面的0x75c80000)來加載驅(qū)動(dòng),就可以根據(jù)這個(gè)設(shè)備樹信息(具體是通過
xlnx,my_gpio-1.00.a字串)來動(dòng)態(tài)識(shí)別設(shè)備。
6. SD卡文件內(nèi)容四(ramdisk8M.image.gz)
Digilent的OOB設(shè)計(jì)給出了一個(gè)ZedBoard上完整的運(yùn)行的linux系統(tǒng)所需要的所有文件,包括配置FPGA的bit文件、 配置ARM PS系統(tǒng)的First-Stage boot loader(FSBL)和引導(dǎo)linux需要的
Second-Stage boot loader(SSBL)、Linux內(nèi)核zImage、設(shè)備樹文件devicetree_ramdisk.dtb 以及根文件系統(tǒng)ramdisk8M.image.gz。linux在運(yùn)行時(shí),加載這個(gè)ramdisk8M.image.gz
鏡像文件到DDR3中來執(zhí)行實(shí)現(xiàn)根文件系統(tǒng)的建立,很多并不像在ubuntu中對(duì)文件系統(tǒng)操作那樣簡(jiǎn)單。本小節(jié)介紹如何制作ZedBoard可運(yùn)行的根文件系統(tǒng)ramdisk8M.image.gz鏡像文件,
參照xilinx wiki 。
通過本小節(jié)的學(xué)習(xí),在以后的開發(fā)中,可以更加順利的修改文件系統(tǒng),給設(shè)計(jì)帶來方便。
更多更新請(qǐng)關(guān)注我的博客:@超群天晴
硬件平臺(tái):Digilent ZedBoard
開發(fā)環(huán)境:Windows XP 32 bit + Wmare 8.0 + Ubuntu 10.04 + arm-linux-xilinx-gnueabi交叉編譯環(huán)境
Zedboard linux: Digilent OOB Design
1、FHS(Filesystem Hierarchy Standard)標(biāo)準(zhǔn)介紹
當(dāng)我們?cè)趌inux下輸入ls / 的時(shí)候,見到的目錄結(jié)構(gòu)以及這些目錄下的內(nèi)容都大同小異,這是因?yàn)樗械膌inux發(fā)行版在對(duì)根文件系統(tǒng)布局上都遵循FHS標(biāo)準(zhǔn)的建議規(guī)定。該標(biāo)準(zhǔn)規(guī)定了根目錄
下各個(gè)子目錄的名稱及其存放的內(nèi)容:
目錄名
存放的內(nèi)容
/bin
必備的用戶命令,例如ls、cp等
/sbin
必備的系統(tǒng)管理員命令,例如ifconfig、reboot等
/dev
設(shè)備文件,例如mtdblock0、tty1等
/etc
系統(tǒng)配置文件,包括啟動(dòng)文件,例如inittab等
/lib
必要的鏈接庫,例如C鏈接庫、內(nèi)核模塊
/home
普通用戶主目錄
/root
root用戶主目錄
/usr/bin
非必備的用戶程序,例如find、du等
/usr/sbin
非必備的管理員程序,例如chroot、inetd等
/usr/lib
庫文件
/var
守護(hù)程序和工具程序所存放的可變,例如日志文件
/proc
用來提供內(nèi)核與進(jìn)程信息的虛擬文件系統(tǒng),由內(nèi)核自動(dòng)生成目錄下的內(nèi)容
/sys
用來提供內(nèi)核與設(shè)備信息的虛擬文件系統(tǒng),由內(nèi)核自動(dòng)生成目錄下的內(nèi)容
/mnt
文件系統(tǒng)掛接點(diǎn),用于臨時(shí)安裝文件系統(tǒng)
/tmp
臨時(shí)性的文件,重啟后將自動(dòng)清除
制作根文件系統(tǒng)就是要建立以上的目錄,并在其中建立完整目錄內(nèi)容。其過程大體包括:
· 編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄
· 利用交叉編譯工具鏈,構(gòu)建/lib目錄
· 手工構(gòu)建/etc目錄
· 制作根文件系統(tǒng)的鏡像文件
下面就來詳細(xì)介紹這個(gè)過程。
1、編譯安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄
首先下載BusyBox源碼,使用命令
git clone git://git.busybox.net/busybox
當(dāng)然,和往常一樣,為了給上不了國(guó)外網(wǎng)站的同學(xué)們提供便利,這里提供一個(gè)國(guó)內(nèi)的下載鏈接:
busybox下載
下載后,切換到busybox目錄,并進(jìn)行默認(rèn)配置
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- defconfig
使用命令
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig
打開可視化界面配置,逐一進(jìn)入
BusyBox Settings->Installation Options->BusyBox installation prefix
將目錄設(shè)置為
/home/devel/_rootfs
保存后退出,并安裝busybox
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- install
安裝好后,我們能夠在/home/devel/_rootfs目錄下看到生成了的bin sbin usr/bin usr/sbin 目錄,其下包含了我們常用的命令,這些命令都是指向bin/busybox的軟鏈接。
3、安裝Dropbear
我對(duì)dropbear的功能不是很明白,從百度上獲取到的信息是“dropbear實(shí)現(xiàn)完整的SSH客戶端和服務(wù)器版本2協(xié)議。它不支持SSH版本1 的向后兼容性,以節(jié)省空間和資源,并避免在SSH
版本1的固有的安全漏洞。還實(shí)施了SCP的。SFTP支持依賴于一個(gè)二進(jìn)制文件,可以通過提供的OpenSSH或類似的計(jì)劃。”由于xilinx wiki上有這樣的步驟,還是老老實(shí)實(shí)的做吧。
下載dropbear,并解壓
wget
tar xfvz dropbear-0.53.1.tar.gz
配置dropbear
./configure --prefix=/home/devel/_rootfs --host=arm-xilinx-linux-gnueabi --disable-zlib CC=arm-xilinx-linux-gnueabi-gcc LDFLAGS="-Wl,--gc-sections" CFLAGS=
"-ffunction-sections -fdata-sections -Os"
編譯
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" MULTI=1 strip
安裝dropbear并創(chuàng)建符號(hào)鏈接
make install
ln -s /home/devel/_rootfs/usr/bin/scp
4、利用交叉編譯工具鏈,構(gòu)建/lib目錄
進(jìn)入/home/devel/_rootfs,創(chuàng)建lib目錄
cd /home/devel/_rootfs
bash> mkdir lib
將交叉編譯環(huán)境庫拷貝到這個(gè)目錄下
cp /opt/14.2/ISE_DS/EDK/gnu/arm/lin64/arm-xilinx-linux-gnueabi/libc/lib/* lib -r
同樣,將工具鏈拷貝到sbin/和usr/bin/下
cp /opt/14.2/ISE_DS/EDK/gnu/arm/lin64/arm-xilinx-linux-gnueabi/libc/sbin/* sbin/ -r
cp /opt/14.2/ISE_DS/EDK/gnu/arm/lin64/arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/bin/ -r
注意:很多網(wǎng)友說,自己的電腦上沒有l(wèi)in64文件夾,只有nt文件夾。這個(gè)問題是由于在安裝ISE版本是,操作系統(tǒng)32位/64位決定的。我在XP(32位)下安裝時(shí)也只有nt文件夾,因而我選擇
一個(gè)“懶”的方法:把OOB中的lib/、sbin/bin、 usr/bin文件夾直接拷貝出來,相應(yīng)替換掉。
usr/bin目錄文件下載
sbin目錄文件下載
lib目錄文件下載
5、創(chuàng)建其他目錄和相應(yīng)配置
至此,幾個(gè)重要的目錄和文件都已經(jīng)創(chuàng)建完畢,需要安裝FHS要求把其他目錄和文件創(chuàng)建。切換到_rootfs目錄下,使用命令
mkdir dev etc etc/dropbear etc/init.d mnt opt proc root sys tmp var var/log var/www
創(chuàng)建"etc/fstab"文件,內(nèi)容如下
LABEL=/ / tmpfs defaults 0 0none /dev/pts devpts gid=5,mode=620 0 0none /proc proc defaults 0 0none /sys
sysfs defaults 0 0none /tmp tmpfs defaults 0 0
創(chuàng)建"etc/inittab"文件,內(nèi)容如下
::sysinit:/etc/init.d/rcS
# /bin/ash
#
# Start an askfirst shell on the serial ports
ttyPS0::respawn:-/bin/ash
# What to do when restarting the init process
::restart:/sbin/init
# What to do before rebooting
::shutdown:/bin/umount -a -r
創(chuàng)建"etc/passwd"文件,內(nèi)容如下
root:$1$qC.CEbjC$SVJyqm.IG.gkElhaeM.FD0:0:0:root:/root:/bin/sh
創(chuàng)建文件"etc/init.d/rcS" ,內(nèi)容如下
#!/bin/sh
echo "Starting rcS..."
echo "++ Mounting filesystem"mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
echo "++ Setting up mdev"
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /dev/pts
mkdir -p /dev/i2c
mount -t devpts devpts /dev/pts
echo "++ Starting telnet daemon"telnetd -l /bin/sh
echo "++ Starting http daemon"httpd -h /var/www
echo "++ Starting ftp daemon"tcpsvd 0:21 ftpd ftpd -w /&
echo "++ Starting dropbear (ssh) daemon"dropbear
echo "rcS Complete"
并設(shè)置其權(quán)限
chmod 755 etc/init.d/rcS
sudo chown root:root etc/init.d/rcS
BTW,我們的后續(xù)設(shè)計(jì)中,為了實(shí)現(xiàn)應(yīng)用程序上電后自動(dòng)啟動(dòng)運(yùn)行,可以修改rcS文件內(nèi)容,將應(yīng)用程序執(zhí)行命令寫入到rcS文件中。
6、生成ramdisk鏡像文件
至此,根文件系統(tǒng)所有需要的目錄和文件已經(jīng)準(zhǔn)備完畢。查看_rootfs下的內(nèi)容
這個(gè)根文件系統(tǒng)能夠被執(zhí)行,還需要將其制作成image鏡像文件,并壓縮。
接下來的操作如果和xilinx wiki上操作一致,最終的文件系統(tǒng)并不能被識(shí)別,所以這里介紹的和xilinx wiki有少許不同。
創(chuàng)建鏡像文件ramdisk8M.image,并設(shè)置大小為8M,文件系統(tǒng)格式為ext2:
cd ~dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0tune2fs ramdisk8M.image -i 0
chmod 777 ramdisk8M.image
大小可以按照需要自己調(diào)整,但是最好不要超過32M。
創(chuàng)建ramdisk目錄,將ramdisk8M.image 掛載到該目錄下,
mkdir ramdisk
mount -o loop ramdisk8M.image ramdisk/
接下來,只需要將_rootfs目錄下的內(nèi)容全部拷貝到ramdisk下即可
cp -R /home/devel/_rootfs/* ramdisk
注意,這里cp的參數(shù)一定是R而非r。
這樣,這個(gè)鏡像文件的內(nèi)容就是_rootfs目錄下的內(nèi)容了。將其卸載就可
umount ramdisk/
到此,根文件系統(tǒng)鏡像文件ramdisk8M.image 制作完成,將其壓縮
gzip -9 ramdisk8M.image
生成ramdisk8M.image.gz文件,拷貝到SD上就可以了。
==========================
7. SD卡文件內(nèi)容五(rootfs)
Linux中Root Filesystem(根文件系統(tǒng))是必不可少的,常用的是BusyBox,本節(jié)就介紹一下使用BusyBox制作Linux根文件系統(tǒng)rootfs,主要參考xilinx wiki上Zynq Root FileSystem Creation方法:
1. 準(zhǔn)備工作:
首先在Ubuntu中建立ARM GNU交叉編譯環(huán)境,筆者使用的是Ubuntu11.04平臺(tái)。
通過Git下載BusyBox:
git clone git://git.busybox.net/busybox
復(fù)制代碼
2. 編譯安裝BusyBox
在Ubuntu平臺(tái)中進(jìn)入BusyBox,進(jìn)行初始化默認(rèn)配置:
cd busybox
make defconfig
自定義配置BusyBox,會(huì)彈出圖形界面設(shè)置窗口:
make menuconfig
進(jìn)入BusyBox Settings->Installation Options->BusyBox installationprefix設(shè)置BusyBox的安裝目錄,將其設(shè)置為/home/devel/_rootfs。
完成配置后,輸入以下腳本安裝BusyBox:
sudo make install
在設(shè)置的目錄中會(huì)生成rootfs,其中包含了bin、sbin、usr/bin和usr/sbin 目錄,其下包含了我們常用的命令,這些命令都是指向bin/busybox的軟鏈接。
3. 編譯安裝Dropbear
Dropbear提供支持SSH客戶端/服務(wù)器功能。
從Dropbear網(wǎng)站上下載Dropbear,并解壓:
wget
tar xfvz dropbear-0.53.1.tar.gz
cd dropbear-0.53.1
配置Dropbear:
./configure --prefix=/home/devel/_rootfs --host=arm-xilinx-linux-gnueabi --disable-zlib CC=arm-xilinx-linux-gnueabi-gcc LDFLAGS="-Wl,--gc-sections" CFLAGS
="-ffunction-sections -fdata-sections -Os"
編譯Dropbear:
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" MULTI=1 strip
安裝Dropbear,并且在rootfs中建立鏈接,生成scp
sudo make install
ln -s ../../sbin/dropbear /home/devel/_rootfs/usr/bin/scp
4. 工具鏈和應(yīng)用程序配置
需要將Xilinx ARM工具鏈的庫拷貝到rootfs中的lib文件夾下,由于筆者沒有在Ubuntu平臺(tái)上安裝ISE套件,因此從Windows平臺(tái)上拷貝,在Windows平臺(tái)上的位置:*:\Xilinx\14.2\ISE_DS\EDK\gnu\arm\nt\arm-xilinx-linux-gnueabi\libc\lib
然后將libc/sbin和libc/usr/bin中的文件也拷貝進(jìn)去。
5. 其它目錄生成和配置
rootfs中還需要?jiǎng)?chuàng)建其它目錄,如下腳本:
mkdir dev etc etc/dropbear etc/init.d mnt opt proc root sys tmp var var/log var/www
創(chuàng)建etc/fstab文件:sudo gedit etc/fstab,文件內(nèi)容如下:
LABEL=/ / tmpfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
none /tmp tmpfs defaults 0 0
創(chuàng)建etc/inittab文件:sudo gedit etc/inittab,文件內(nèi)容如下:
::sysinit:/etc/init.d/rcS
# /bin/ash
#
# Start an askfirst shell on the serial ports
ttyPS0::respawn:-/bin/ash
# What to do when restarting the init process
::restart:/sbin/init
# What to do before rebooting
::shutdown:/bin/umount -a –r
創(chuàng)建etc/ passwd文件:sudo gedit etc/passwd,文件內(nèi)容如下:
root:$1$qC.CEbjC$SVJyqm.IG.gkElhaeM.FD0:0:0:root:/root:/bin/sh
創(chuàng)建etc/init.d/rcS文件:sudo gedit etc/init.d/rcS,文件內(nèi)容如下:
#!/bin/sh
echo "Starting rcS..."
echo "++ Mounting filesystem"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
echo "++ Setting up mdev"
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /dev/pts
mkdir -p /dev/i2c
mount -t devpts devpts /dev/pts
echo "++ Starting telnet daemon"
telnetd -l /bin/sh
echo "++ Starting http daemon"
httpd -h /var/www
echo "++ Starting ftp daemon"
tcpsvd 0:21 ftpd ftpd -w /&
echo "++ Starting dropbear (ssh)daemon"
dropbear
echo "rcS Complete"
設(shè)置etc/init.d/rcS的權(quán)限:
chmod 755 etc/init.d/rcS
sudo chown root:root etc/init.d/rcS
到這一步,rootfs目錄算是創(chuàng)建完成了
6. 生成ramdisk鏡像文件
rootfs想要被識(shí)別,需要將其制作成鏡像image文件,并且壓縮。如下腳本為創(chuàng)建image文件:
cd ~
dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192
mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0
tune2fs ramdisk8M.image -i 0
chmod 777 ramdisk8M.image
新建一個(gè)ramdisk目錄,然后將ramdisk8M.image加載到該目錄下:
mkdir ramdisk
mount -o loop ramdisk8M.image ramdisk/
將_rootfs/目錄下的文件拷貝到ramdisk中:
cp -R /home/devel/_rootfs/* ramdisk
拷貝完成后卸載ramdisk
umount ramdisk/
最后壓縮ramdisk8M.image文件:
gzip -9 ramdisk8M.image
ramdisk8M.image.gz鏡像文件生成完畢。
附錄A SD卡分區(qū)方法
可以在windows系統(tǒng)和linux中分別進(jìn)行分區(qū)操作,在linux下使用gparted分區(qū)工具,
在windows推薦使用sd 卡分區(qū)軟件PM9.0 漢化版工具。我是在xp下裝的ubuntu的虛擬機(jī),
因此是在xp下對(duì)SD 卡進(jìn)行分區(qū)的,使用的是PM工具。
使用VMware 虛擬機(jī)+gparted對(duì)SD卡分區(qū)參考:
安裝過程大同小異,選擇安裝目錄就可以了。
分區(qū)過程如下:
1) 插入SD 卡,容量不小于4GB
2) 將SD 卡格式化為FAT32 格式,注意不要選擇快速格式化
3) 打開PM 軟件,在SD 卡上右鍵打擊,選擇“移動(dòng)/調(diào)整分區(qū)大小”
4) 將下圖的紅線框的數(shù)值改為FAT32 的大小,確保大于50MB,我這邊給的是100MB,
然后點(diǎn)擊線面的兩個(gè)框,就會(huì)自動(dòng)更新數(shù)值,然后點(diǎn)擊“是”
5) 鼠標(biāo)放在上圖藍(lán)色區(qū)域,點(diǎn)擊右鍵,選擇“更改卷標(biāo)”,將其改為BOOT,然后點(diǎn)擊“是”
6) 接下來創(chuàng)建linux 分區(qū):點(diǎn)擊“創(chuàng)建分區(qū)”,然后創(chuàng)建新分區(qū)為“主分區(qū)”,卷標(biāo)為“rootfs”,文件系統(tǒng)為“Linux
Ext3”,由于只分兩個(gè)區(qū),因此新分區(qū)大小就為剩下的區(qū)域的最大值,然后點(diǎn)擊“是”
7) 回到主界面,點(diǎn)擊“應(yīng)用改變”,一路選擇“yes”。時(shí)間比較長(zhǎng),耐心等待
8) 分區(qū)完成后,點(diǎn)擊“close”,退出軟件
9) 要想重新將SD 弄成一個(gè)區(qū),只用刪除掉分區(qū),再創(chuàng)建分區(qū),指定大小和格式便可
評(píng)論