1. 编译脚本执行
mkdir build_aarch64 cd build_aarch64 ../init-build.sh -DPLATFORM=qemu-arm-virt -DSIMULATION=true
1.0 -DPLATFORM=qemu-arm-virt
PLATFORM选择:进入如下目录,可以看到支持的一些平台信息
cd sel4/kernel/src/plat allwinnerA20 apq8064 bcm2711 exynos4 fvp hikey imx7 maaxboard odroidc4 pc99 qemu-arm-virt quartz64 rockpro64 tk1 tx1 zynq7000 am335x ariane bcm2837 exynos5 hifive imx6 imx8m-evk odroidc2 omap3 polarfire qemu-riscv-virt rocketchip spike tqma8xqp1gb tx2 zynqmp
我们选择qemu-arm-virt
1.1 -DCROSS_COMPILER_PREFIX=arm-linux-gnueabi-
定义交叉编译工具链是arm-linux-gnueabi-。
1.2 -DCMAKE_TOOLCHAIN_FILE=…/kernel/gcc.cmake
定义cmake通toolchain文件,设置编译工程的编译器,链接器。
1.3 -DRELEASE
设置true or false,编译出来的版本是否有debug信息。
1.4 -DSMP
设置true or flase, 默认配置中最大支持4核,如果支持更多核,需要设置-DKernelMaxNumNodes=<YOUR_PREFERENCE>
1.5 定义ARM体系架构
-DAARCH32=TRUE: Tells the build system that you are building for a 32-bit ARM target. This will cause the build system to assume that
you have a cross compiler installed which targets a system with the
triplet name arm-linux-gnueabi-.
-DAARCH32HF=TRUE: Tells the build system you’re building for a 32-bit ARM target which has hardware floating point support. Assumes you
have a cross- compiler installed which targets arm-linux-gnueabihf-.
-DAARCH64=TRUE: Tells the build system you’re building for a 64-bit ARM target. Assumes you have a cross-compiler installed which targets
aarch64-linux-gnu-.
2. 编译脚本解析
#!/bin/sh #设置编译遇到错误就停止,遇到未定义报错 set -eu #脚本执行路径/home/xxxx/data/source/opensource/sel4/ SCRIPT_PATH=${0%/*} #执行脚本名称/home/xxxx/data/source/opensource/sel4/ SCRIPT_NAME=${0##*/} #判断当前路径与脚本路径是否一致,可以看到不一致,所以下边if不生效 if [ "$PWD" = "$SCRIPT_PATH" ] then echo "\"$SCRIPT_NAME\" should not be invoked from top-level directory" >&2 exit 1 fi if [ -e CMakeLists.txt ] then echo "\"$SCRIPT_NAME\" should be invoked from a build directory and not" \ "source directories containing a CMakeLists.txt file" >&2 exit 1 fi if [ -d "$HOME/.sel4_cache" ] then CACHE_DIR="$HOME/.sel4_cache" else CACHE_DIR="$SCRIPT_PATH/.sel4_cache" fi #判断脚本文件路径是否存在CMakeLists.txt文件,可以看到不存在 if [ -e "$SCRIPT_PATH/CMakeLists.txt" ] then cmake -DCMAKE_TOOLCHAIN_FILE="$SCRIPT_PATH"/kernel/gcc.cmake -G Ninja "$@" \ -DSEL4_CACHE_DIR="$CACHE_DIR" -C "$SCRIPT_PATH/settings.cmake" "$SCRIPT_PATH" else # 进入else执行 # real_easy_settings是/home/xxxx/data/source/opensource/sel4/projects/sel4test/easy-settings.cmake # 注意:$SCRIPT_PATH/easy-settings.cmake是一个链接文件 real_easy_settings="$(realpath $SCRIPT_PATH/easy-settings.cmake)" # project_dir是/home/xxxx/data/source/opensource/sel4/projects/sel4test/ project_dir="$(dirname $real_easy_settings)" #cmake -G: 选择生成器是Ninja #cmake -C: **没太理解ccache有什么用处,带更新** cmake -G Ninja "$@" -DSEL4_CACHE_DIR="$CACHE_DIR" -C "$project_dir/settings.cmake" "$project_dir" fi
2.1 projects/sel4test/CMakeLists.txt解析(待注释)
# # Copyright 2019, Data61, CSIRO (ABN 41 687 119 230) # # SPDX-License-Identifier: BSD-2-Clause # cmake_minimum_required(VERSION 3.7.2) include(settings.cmake) project(sel4test C CXX ASM) find_package(seL4 REQUIRED) find_package(elfloader-tool REQUIRED) # Set the roottask CNode size to be large enough for DTB, timer caps, etc # Note that this works for the platforms that we have at the moment, and may # need to be increased in the future set(KernelRootCNodeSizeBits 13 CACHE INTERNAL "") # Set our custom domain schedule set(KernelDomainSchedule "${CMAKE_CURRENT_LIST_DIR}/domain_schedule.c" CACHE INTERNAL "") sel4_import_kernel() if((NOT Sel4testAllowSettingsOverride) AND (KernelArchARM OR KernelArchRiscV)) # Elfloader settings that correspond to how Data61 sets its boards up. ApplyData61ElfLoaderSettings(${KernelPlatform} ${KernelSel4Arch}) endif() elfloader_import_project() add_subdirectory(apps/sel4test-driver) if(SIMULATION) include(simulation) if(KernelSel4ArchX86_64) SetSimulationScriptProperty(MEM_SIZE "3G") endif() if(KernelPlatformQEMUArmVirt) SetSimulationScriptProperty(MEM_SIZE "2G") endif() GenerateSimulateScript() endif()
2.2projects/sel4test/settings.cmake解析(待注释)
# # Copyright 2019, Data61, CSIRO (ABN 41 687 119 230) # # SPDX-License-Identifier: BSD-2-Clause # cmake_minimum_required(VERSION 3.7.2) set(project_dir "${CMAKE_CURRENT_LIST_DIR}/../../") file(GLOB project_modules ${project_dir}/projects/*) list( APPEND CMAKE_MODULE_PATH ${project_dir}/kernel ${project_dir}/tools/seL4/cmake-tool/helpers/ ${project_dir}/tools/seL4/elfloader-tool/ ${project_modules} ) set(NANOPB_SRC_ROOT_FOLDER "${project_dir}/tools/nanopb" CACHE INTERNAL "") set(OPENSBI_PATH "${project_dir}/tools/opensbi" CACHE STRING "OpenSBI Folder location") set(SEL4_CONFIG_DEFAULT_ADVANCED ON) include(application_settings) include(${CMAKE_CURRENT_LIST_DIR}/easy-settings.cmake) correct_platform_strings() find_package(seL4 REQUIRED) sel4_configure_platform_settings() set(valid_platforms ${KernelPlatform_all_strings} ${correct_platform_strings_platform_aliases}) set_property(CACHE PLATFORM PROPERTY STRINGS ${valid_platforms}) if(NOT "${PLATFORM}" IN_LIST valid_platforms) message(FATAL_ERROR "Invalid PLATFORM selected: \"${PLATFORM}\" Valid platforms are: \"${valid_platforms}\"") endif() # Declare a cache variable that enables/disablings the forcing of cache variables to # the specific test values. By default it is disabled set(Sel4testAllowSettingsOverride OFF CACHE BOOL "Allow user to override configuration settings") if(NOT Sel4testAllowSettingsOverride) # We use 'FORCE' when settings these values instead of 'INTERNAL' so that they still appear # in the cmake-gui to prevent excessively confusing users if(ARM_HYP) set(KernelArmHypervisorSupport ON CACHE BOOL "" FORCE) endif() if(KernelPlatformQEMUArmVirt OR KernelPlatformQEMURiscVVirt OR KernelPlatformSpike) set(SIMULATION ON CACHE BOOL "" FORCE) endif() if(SIMULATION) ApplyCommonSimulationSettings(${KernelSel4Arch}) else() if(KernelArchX86) set(KernelIOMMU ON CACHE BOOL "" FORCE) endif() endif() # sel4test specific config settings. if(SIMULATION) set(Sel4testSimulation ON CACHE BOOL "" FORCE) set(Sel4testHaveCache OFF CACHE BOOL "" FORCE) else() set(Sel4testSimulation OFF CACHE BOOL "" FORCE) set(Sel4testHaveCache ON CACHE BOOL "" FORCE) endif() if(KernelPlatformQEMUArmVirt) if(KernelArmExportPCNTUser AND KernelArmExportPTMRUser) set(Sel4testHaveTimer ON CACHE BOOL "" FORCE) else() set(Sel4testHaveTimer OFF CACHE BOOL "" FORCE) endif() elseif( KernelPlatformZynqmp OR KernelPlatformPolarfire OR KernelPlatformQuartz64 OR (SIMULATION AND (KernelArchRiscV OR KernelArchARM)) ) # Frequency settings of the ZynqMP make the ltimer tests problematic # Polarfire does not have a complete ltimer implementation # Quartz64 does not have a complete ltimer implementation set(Sel4testHaveTimer OFF CACHE BOOL "" FORCE) else() set(Sel4testHaveTimer ON CACHE BOOL "" FORCE) endif() # Check the hardware debug API non simulated (except for ia32, which can be simulated), # or platforms that don't support it. if(((NOT SIMULATION) OR KernelSel4ArchIA32) AND NOT KernelHardwareDebugAPIUnsupported) set(HardwareDebugAPI ON CACHE BOOL "" FORCE) else() set(HardwareDebugAPI OFF CACHE BOOL "" FORCE) endif() ApplyCommonReleaseVerificationSettings(${RELEASE} ${VERIFICATION}) if(BAMBOO) set(LibSel4TestPrintXML ON CACHE BOOL "" FORCE) else() set(LibSel4TestPrintXML OFF CACHE BOOL "" FORCE) endif() if(DOMAINS) set(KernelNumDomains 4 CACHE STRING "" FORCE) else() set(KernelNumDomains 1 CACHE STRING "" FORCE) endif() if(SMP) if(NUM_NODES MATCHES "^[0-9]+$") set(KernelMaxNumNodes ${NUM_NODES} CACHE STRING "" FORCE) else() set(KernelMaxNumNodes 4 CACHE STRING "" FORCE) endif() else() set(KernelMaxNumNodes 1 CACHE STRING "" FORCE) endif() if(MCS) set(KernelIsMCS ON CACHE BOOL "" FORCE) else() set(KernelIsMCS OFF CACHE BOOL "" FORCE) endif() endif()