odroidc2中可執行的fuchsia(zircon) kernel編譯過程(基於2018年3月版本)
zircon的啟動
zircon核心由uboot載入,本次試驗使用的uboot是odroid專門為fuchsia作業系統開發的,並沒有原始碼,zircon核心的啟動目錄內容為:
XXXXXXXX:~/work/zircon-topic-odroidc2/odroidc2-boot-files$ ls -l 總用量 8340 -rwxr-xr-x 1 suog suog 1098 8月 9 11:15 boot.scr drwxr-xr-x 3 suog suog 4096 8月 9 11:15 dtbs -rwxr-xr-x 1 suog suog 7402128 8月 9 11:15 odroidc2-bootdata.bin -rwxr-xr-x 1 suog suog 1122376 8月 9 11:15 odroidc2-zircon.bin XXXXXXXX:~/work/zircon-topic-odroidc2/odroidc2-boot-files$ find . . ./odroidc2-zircon.bin ./dtbs ./dtbs/current ./dtbs/current/amlogic ./dtbs/current/amlogic/meson-gxbb-odroidc2.dtb ./boot.scr ./odroidc2-bootdata.bin
啟動過程中依賴於無關檔案
(2)boot.scr。boot.scr由boot.cmd生成,命令為:
mkimage -A arm64 -T script -C none -d ./kernel/target/arm64/odroidc2/boot.cmd boot.scr
在本次試驗中,boot.cmd內容如下:
XXXXXXXX:~/work/zircon-topic-odroidc2$ cat ./kernel/target/arm64/odroidc2/boot.cmd setenv bootcmd '' setenv fk_kvers current setenv fdtpath /dtbs/${fk_kvers}/${fdtfile} setenv fdt_addr_r 0x10200000 setenv kernel_addr_r 0x10280000 setenv ramdisk_addr_r 0x18000000 setenv bootargs 'TERM=uart' # We don't have a great way to calculate the ramdisk_end # on the odroidc2 since the default u-boot build did not # enable the setexpr command. In order to avoid requiring # users to build/update the u-boot from the prebuilt available # from hardkernel we will just declare a really large ramdisk. # the arm generic platform will get the base address from the # fdt, but will then pull the size from the ramdisk itself, so # this will work around bootloader limitations without breaking # compatibility on other targets. setenv ramdisk_end 0x70000000 load mmc 0:1 ${fdt_addr_r} ${fdtpath} fdt addr ${fdt_addr_r} fdt resize load mmc 0:1 ${ramdisk_addr_r} odroidc2-bootdata.bin fdt chosen ${ramdisk_addr_r} ${ramdisk_end} load mmc 0:1 ${kernel_addr_r} odroidc2-zircon.bin booti ${kernel_addr_r} - ${fdt_addr_r}
(3)dtb檔案。./dtbs/current/amlogic/meson-gxbb-odroidc2.dtb,裝置樹檔案,Linux核心啟動必須的,zircon在2018年3月份,也是需要有裝置樹檔案的,2018年7月後從boot_shim啟動,就不需要了。zircon改動很大,日新月異,跟不上步伐啊。。。。。。。。
(4)./odroidc2-zircon.bin。zircon的核心檔案。
(5)./odroidc2-bootdata.bin。zircon的檔案系統,相當於ramdisk。
odroidc2-zircon.bin的生成過程(倒敘)
1、odroidc2-zircon.bin
kernel/target/arm64/odroidc2/prepend-header.py --kernel ./build-arm64/zircon.bin --load_offset 0x10280000 --output ./build-arm64/odroidc2-zircon.bin
odroidc2-zircon.bin依賴於zircon.bin,在zircon.bin前面加上了64KB的檔案頭,新增檔案頭的指令碼是kernel/target/arm64/odroidc2/prepend-header.py。檔案頭的前64位元組內容如下:
4D 5A 00 91 FF 3F 00 14
//指令:0x91005a4d 含義# mrs x19, mpidr_el1 ('MZ' magic)
//指令:0x14003fff 含義跳轉到當前指令地址+4*0x3fff處執行,就是zircon核心的首地址
00 00 28 10 00 00 00 00
//0x0000000010280000, 核心的載入地址load_offset
48 20 10 00 00 00 00 00
//0x0000000000102048,核心的大小kernel_size
00 00 00 00 00 00 00 00 //unused
00 00 00 00 00 00 00 00 //unused
00 00 00 00 00 00 00 00 //unused
00 00 00 00 00 00 00 00 //unused
41 52 4D 64 00 00 00 00 //41524D:ARM 64尾標誌
2、zircon.bin
./prebuilt/downloads/gcc/bin/aarch64-elf-objcopy -O binary build-arm64/zircon.elf build-arm64/zircon.bin
3、zircon.elf。所有obj檔案連結生成
./prebuilt/downloads/gcc/bin/aarch64-elf-ld -nostdlib --build-id -z max-page-size=4096 --gc-sections -T kernel/kernel.ld build-arm64/kernel-vars.ld build-arm64/kernel/platform/generic-arm/generic-arm.mod.o build-arm64/kernel/arch/arm64/arm64.mod.o build-arm64/kernel/top/top.mod.o build-arm64/kernel/dev/hdcp/amlogic_s912/amlogic_s912.mod.o build-arm64/kernel/dev/interrupt/arm_gic/common/common.mod.o build-arm64/kernel/dev/interrupt/arm_gic/v2/v2.mod.o build-arm64/kernel/dev/interrupt/arm_gic/v3/v3.mod.o build-arm64/kernel/dev/iommu/dummy/dummy.mod.o build-arm64/kernel/dev/pcie/pcie.mod.o build-arm64/kernel/dev/pdev/pdev.mod.o build-arm64/kernel/dev/pdev/power/power.mod.o build-arm64/kernel/dev/power/hisi/hisi.mod.o build-arm64/kernel/dev/psci/psci.mod.o build-arm64/kernel/dev/timer/arm_generic/arm_generic.mod.o build-arm64/kernel/dev/uart/amlogic_s905/amlogic_s905.mod.o build-arm64/kernel/dev/uart/pl011/pl011.mod.o build-arm64/kernel/kernel/kernel.mod.o build-arm64/kernel/lib/bitmap/bitmap.mod.o build-arm64/kernel/lib/cbuf/cbuf.mod.o build-arm64/kernel/lib/debugcommands/debugcommands.mod.o build-arm64/kernel/lib/debuglog/debuglog.mod.o build-arm64/kernel/lib/ktrace/ktrace.mod.o build-arm64/kernel/lib/mdi/mdi.mod.o build-arm64/kernel/lib/memory_limit/memory_limit.mod.o build-arm64/kernel/lib/mtrace/mtrace.mod.o build-arm64/kernel/lib/userboot/userboot.mod.o build-arm64/kernel/lib/version/version.mod.o build-arm64/kernel/object/object.mod.o build-arm64/kernel/platform/platform.mod.o build-arm64/kernel/syscalls/syscalls.mod.o build-arm64/kernel/target/target.mod.o build-arm64/kernel/tests/tests.mod.o build-arm64/third_party/lib/fdt/fdt.mod.o build-arm64/kernel/dev/interrupt/interrupt.mod.o build-arm64/kernel/dev/pdev/interrupt/interrupt.mod.o build-arm64/kernel/dev/pdev/uart/uart.mod.o build-arm64/kernel/dev/udisplay/udisplay.mod.o build-arm64/kernel/lib/console/console.mod.o build-arm64/kernel/lib/counters/counters.mod.o build-arm64/kernel/lib/crypto/crypto.mod.o build-arm64/kernel/lib/debug/debug.mod.o build-arm64/kernel/lib/explicit-memory/explicit-memory.mod.o build-arm64/kernel/lib/fbl/fbl.mod.o build-arm64/kernel/lib/fixed_point/fixed_point.mod.o build-arm64/kernel/lib/header_tests/header_tests.mod.o build-arm64/kernel/lib/heap/heap.mod.o build-arm64/kernel/lib/hypervisor/hypervisor.mod.o build-arm64/kernel/lib/libc/libc.mod.o build-arm64/kernel/lib/oom/oom.mod.o build-arm64/kernel/lib/pci/pci.mod.o build-arm64/kernel/lib/pow2_range_allocator/pow2_range_allocator.mod.o build-arm64/kernel/lib/region-alloc/region-alloc.mod.o build-arm64/kernel/lib/unittest/unittest.mod.o build-arm64/kernel/lib/user_copy/user_copy.mod.o build-arm64/kernel/lib/vdso/vdso.mod.o build-arm64/kernel/lib/zxcpp/zxcpp.mod.o build-arm64/kernel/vm/vm.mod.o build-arm64/third_party/lib/safeint/safeint.mod.o build-arm64/kernel/arch/arm64/hypervisor/hypervisor.mod.o build-arm64/kernel/dev/hw_rng/hw_rng.mod.o build-arm64/kernel/lib/gfx/gfx.mod.o build-arm64/kernel/lib/gfxconsole/gfxconsole.mod.o build-arm64/kernel/lib/heap/cmpctmalloc/cmpctmalloc.mod.o build-arm64/kernel/lib/io/io.mod.o build-arm64/kernel/lib/pretty/pretty.mod.o build-arm64/third_party/lib/cryptolib/cryptolib.mod.o build-arm64/third_party/lib/jitterentropy/jitterentropy.mod.o build-arm64/third_party/lib/qrcodegen/qrcodegen.mod.o build-arm64/third_party/lib/uboringssl/uboringssl.mod.o -o build-arm64/zircon.elf