編譯我們需要的 uImage 文件,記得要指定 config 為 xilinx_zynq_defconfig 以及設(shè)定 UIMAGE_LOADADDR為 0x8000 。
coldnew@gentoo ~/Linux-Digilent-Dev $ ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make xilinx_zynq_defconfig
coldnew@gentoo ~/Linux-Digilent-Dev $ ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make
coldnew@gentoo ~/Linux-Digilent-Dev $ ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make UIMAGE_LOADADDR=0x8000 uImage
coldnew@gentoo ~/Linux-Digilent-Dev $ ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make zynq-zybo.dtb
編譯完后,我們會(huì)需要 arch/arm/boot/uImage 以及 arch/arm/boot/dts/zynq-zybo.dtb 這兩個(gè)檔案,后者就是 device tree 編譯出來(lái)的數(shù)據(jù)文件。
由于放入到 SD 卡上的 device tree 文件名為 devicetree.dtb ,因此這邊將 zynq-zybo.dtb 改一下名。
coldnew@gentoo ~/Linux-Digilent-Dev $ cp arch/arm/boot/dts/zynq-zybo.dtb devicetree.dtb
如果你想手動(dòng)修改 Device Tree 并再重新編譯的話,也可以這樣去產(chǎn)生我們要的 devicetree.dtb 。
coldnew@gentoo ~/Linux-Digilent-Dev $ ./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb arch/arm/boot/dts/zynq-zybo.dts
編譯 BusyBox
Busybox 是一個(gè)非常有趣的程序,舉凡我們?cè)?Linux 下最常用的命令如 ls、cd 等到 sed、vi 他都具有相對(duì)應(yīng)的簡(jiǎn)單實(shí)現(xiàn),此外,這些命令實(shí)際上都只是一個(gè)軟連結(jié) (symlink) 連結(jié)到名為 busybox 的執(zhí)行檔,也就是說(shuō),如果我們將 busybox 進(jìn)行靜態(tài)編譯 (static link),則制作出來(lái)的系統(tǒng)整體大小大約為 2 MB (kernel) + 1.4 MB (busybox),而這個(gè)系統(tǒng)卻又可以具有許多 UN*X 下的常用命令,也因此 busybox 很常用于空間有限的系統(tǒng)。
我們?cè)谶@個(gè)開(kāi)發(fā)過(guò)程中,由于只是驗(yàn)證執(zhí)行 Linux 系統(tǒng)的功能,因此選用 Busybox 來(lái)作為我們的 rootfs。
首先先下載 Busybox 的原始碼,這里選用 1_25_stable 這個(gè)穩(wěn)定分支
git clone git://git.busybox.net/busybox -b 1_25_stable
進(jìn)行我們自己的設(shè)定
coldnew@gentoo ~/busybox $ ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make menuconfig
在進(jìn)行設(shè)定時(shí)有以下幾點(diǎn)要確實(shí)注意,我們要將 busybox 編譯為靜態(tài)鏈接,并且增加 init 功能,主要設(shè)定如下:
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
Init Utilities --->
[*] init
Login/Password Management Utilities --->
[*] getty
Shells --->
[*] ash
設(shè)定完成后開(kāi)始進(jìn)行編譯
coldnew@gentoo ~/busybox $ ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make
編譯完成后透過(guò) make install 命令,會(huì)將編譯出來(lái)的 busybox 與軟連結(jié)(symlink)產(chǎn)生在 _install 文件夾內(nèi)
coldnew@Rosia ~/busybox $ ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make install
建立一些缺少的文件夾 (/dev、/sys …etc)
coldnew@gentoo ~/busybox $ cd _install && mkdir -p proc sys dev etc/init.d root
建立 etc/init.d/rcS 作為啟動(dòng)腳本,并添加以下內(nèi)容
coldnew@gentoo ~/busybox/_install $
vim etc/init.d/rcS
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
將 etc/init.d/rcS 加入可執(zhí)行權(quán)限
coldnew@gentoo ~/busybox/_install $ chmod +x etc/init.d/rcS
建立 etc/inittab ,這會(huì)讓我們可以透過(guò) UART 登入 zybo board
coldnew@gentoo ~/busybox/_install $
vim etc/inittab
#!/bin/sh
#
Init script
::sysinit:/etc/init.d/rcS
#
Start shell on the serial ports
::respawn:/sbin/getty -L ttyPS0 115200 vt100
#
What to do when restarting the init process
::restart:/sbin/init
#
What to do before rebooting
::shutdown:/bin/umount -a -r
設(shè)定默認(rèn)的 /etc/passwd 檔案,我們要讓 root 用戶登入時(shí)不用輸入密碼
coldnew@gentoo ~/busybox/_install $
vim etc/passwd
root::0:0:root:/root:/bin/sh
建立 /init 并軟連結(jié)到 /sbin/init ,避免 Linux Kernel 開(kāi)機(jī)時(shí)找不到 rootfs 的 init。
coldnew@gentoo ~/busybox/_install $ ln -s /sbin/init init
接下來(lái),由于這次我們只是要開(kāi)機(jī)到 ramdisk 上的 rootfs, 因此將 busybox 做出的 rootfs 打包成 cpio 格式。
coldnew@gentoo ~/busybox/_install $ find . | cpio -H newc -o | gzip -9 > ../uramdisk.cpio.gz
再透過(guò) mkimage 將這個(gè) uramdisk.cpio.gz 檔案轉(zhuǎn)成 uboot 用的 uramdisk.image.gz
coldnew@gentoo ~/busybox/_install $ mkimage -A arm -T ramdisk -C gzip -d ../uramdisk.cpio.gz ../uramdisk.image.gz
Image Name:
Created:
Sun Jul 17 19:02:08 2016
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 1042106 Bytes = 1017.68 kB = 0.99 MB
Load Address: 00000000
Entry Point: 00000000
在這邊的這個(gè) uramdisk.image.gz 就是我們開(kāi)機(jī)會(huì)進(jìn)入到的 rootfs,也是我們等等要放到 SD 卡第一個(gè)扇區(qū)的檔案。
評(píng)論
查看更多