qnx开源代码
GitHub - vocho/openqnx: mirror of git://git.code.sf.net/p/monartis/openqnx
ap是对进程和线程集合分配最小的系统资源,目前是对cpu控制,通过thread scheduler
1、能动态配置
2、在系统满载,可以保证对应partion 最小的系统资源;保证最小中断延迟
3、系统空闲时,可以将空闲partion的cpu 给到繁忙的partion
4、能保证重要任务服务,避免不重要任务服务一直占用系统
5、子进程和线程自动运行在父进程所在partion
6、By default, when you use the standard QNX Neutrino send-receive-reply messaging, message receivers automatically run in the partition of the message sender while they're processing that message. This means that all resource managers, such as drivers and filesystems, automatically bill CPU time (except overhead) to the budget of their clients.
aps show 可以查看系统是否运行ap
在QNX中镜像的编译是以build_file_tmpl(也就是以.build.tmpl为后缀的文件)为单元来实现的,且每个镜像对应一个img_name.build.tmpl。
一,QNX镜像编译
QNX的编译同样是由make来执行的,那么make的执行就离不开Makefile。在QNX中,镜像的编译还是从qnx/hlos_dev_qnx/app/qnx_ap/target/hypervisor/host/Makefile开始的,在Makefile中通过“bash create_variant_images.sh",调用执行create_variant_images.sh的执行过程中,会通过下面的语句来build各个镜像。
编译除system分区外的其他所有分区
create_variant_images.sh-> create_images.sh
. ${BSP_ROOT}/tools/build/image-builder.sh [BSP_ROOT=qnx/hlos_dev_qnx/apps/qnx_ap]
. ${BSP_ROOT}/tools/build/image-builder.sh
VARIANT_NAME=`basename ${SOC_VARIANT} | sed "s/\..*//"`
build_ifs2()
{
LIST="ifs_coreservices\
ifs_audio_camera \
ifs_display\
ifs_graphics\
ifs_ethernet\
ifs_video\
ifs_camera\
ifs_disk"
# build the host component images
for build_file_tmpl in ${LIST}; do
build_aifs ${build_file_tmpl} "-qvmhost" "" "${SOC_VARIANT}" "" "${BSP_ROOT}/target/hypervisor/host"
done
calc_size "__HOSTIFS2_RUNTIME_SIZE__" "131072" ${LIST}
MKIFS_PATH=$MKIFS_PATH:./${OUT_DIR}
build_aifs ifs_startup "" "" "${SOC_VARIANT}" "" "${BSP_ROOT}/target/hypervisor/host"
build_aifs ifs2 "" "" "${SOC_VARIANT}" "${ext_name}" "${BSP_ROOT}/target/hypervisor/host"
}
build_mifs()
{
...
}
${BSP_ROOT}/tools/build/image-builder.sh
build_aifs()
{
img_name=$1
vm_variant=$2 # -qvmhost or -qvmguest
mifs_ext=$3 # base image name extension
variant_config=$4 # file which has the multi guest config/single guest config file *_la.txt , *_lv.tx , _multi, etc
guest_variant=$5 # _la , _lv
build_file_path=$6 #customer path , generic reference path
img_ext=${mifs_ext}${guest_variant}
build_file_tmpl=${img_name}.build.tmpl
out_build_file=${img_name}${img_ext}.build;
imgfile=${img_name}${img_ext}.img
filepp -imacros ${SOC_CONFIG} -imacros ${variant_config} -D__IMAGEFS__ -D__VARIANT_hyp__="${vm_variant}" -DVARIANT_${vm_variant:1} -D__SECURE_BOOT_SECPOL__=${SECURE_BOOT_SECPOL} -D__SECURE_BOOT_QTD__=${SECURE_BOOT_QTD} -D__SECURE_BOOT_QVB__=${SECURE_BOOT_QVB} -D__PERF_ENABLE__=${PERF_ENABLE} -D__MERKLE_ENABLE__=${MERKLE_ENABLE} -I${FILESETS} -I${FILESETS_CUST} -I${FILESETS_CUST_COMMON} -I${INSTALL_ROOT_nto}/usr/include -I${BSP_ROOT}/target/hypervisor/host ${build_file_path}/build_files/${build_file_tmpl} > ./${OUT_DIR}/${out_build_file}
if [ $? -ne 0 ]; then
echo "filepp failed for $out_build_file"
exit 1;
fi
mkifs -nn -v ./${OUT_DIR}/${out_build_file} ./${OUT_DIR}/${imgfile} -a "${vm_variant:1}${img_ext}" -o ./${OUT_DIR}
if [ $? -ne 0 ]; then
echo "mkifs failed for $out_build_file"
exit 1;
fi
if [ ! -z ${HASHFILE+x} ]; then
#Inject ifs2 hash into the startup manager application.
hash=`sha256sum ${OUT_DIR}/${imgfile} | awk '{ print $1}'`
echo "#define __${img_name}${mifs_ext}__hash__ \"${hash}\"" >> ${HASHFILE}
fi
}
build_aifs_recovery()
{
img_name=$1
mifs.build.tmpl
利用QNX的模块性和和可裁剪性,其嵌入过程一般是:
构建Buildfile -> 编译buildfile生成系统映象文件 -> 启动目标系统 ->嵌入式系统软件设计。
其中的关键是构建Buildfile[19]。通常一个嵌入式系统需要一个可启动的操作系统映象文件(OS Image)。对于基于QNX的嵌入式一个应用系统,就是根据所选择的CPU类型以及应用程序所需要的操作系统模块来定制嵌入式系统。构建Buildfile的过程就是配置操作系统映象的过程。简单来说Buildfile是一个产生映象文件所需遵守的一组规则、准则。Buildfile由三部分组成,其结构如下:
l bootstrap script(启动引导脚本)
l startup script(启动脚本)
l file list(文件列表)
QNX 启动时创建aps调试分区
https://www.jianshu.com/p/80fe4e6ccd10