PRTOS Hypervisor X86平台操作指南

prtos, info 分区实时系统 prtos-开发手册32字数 23575阅读78分35秒阅读模式

背景介绍:

虚拟化技术提供了在单核或多核处理器上以虚拟机方式运行多个操作系统的方法。虚拟化的应用具有以下优势:

  • 过去运行在不同设备上的服务现在可以作为多个VM运行在同一个设备上;
  • 在同一个设备上合并操作系统的实时特性和通用目的特性,即在不同的VM中执行实时程序和通用程序;
  • 更好的容错性和可靠的隔离性。

目前嵌入式虚拟化技术在以下方面有着成熟的应用:

  • 在航空领域,综合模块化航电架构(Integrated Modular Avionic, IMA)已成为主流航空电子系统,ARINC653标准已经是IMA架构的标准应用接口, 符合ARINC653标准的Type 1 Hypervisor已经是航空电子系统领域基础软件。
  • 车载领域,汽车通过在若干个互相隔离的VM上分别运行娱乐信息操作系统、AUTOSAR(汽车开放系统架构)操作系统和RTOS(实时操作系统),从而使得多个服务可以在同一套硬件上运行。当分配处理器资源时,以VM为单位分配CPU、输入/输出外设和内存,以保证产品的实时性。并且SKH与硬件紧密结合,使得系统软件在异常检测、故障隔离方面开展更多工作,并确保一旦出现问题,故障能够早期被识别和处理,以避免故障向其他领域蔓延.
  • 在工业领域,Hypervisor可以帮助提高工业自动化系统的效率、可靠性和安全性,并促进工业物联网的发展。比如Hypervisor可以用于工业自动化系统中,使不同的控制和监控应用程序能够在同一硬件平台上并行运行。这有助于提高生产效率和降低硬件成本;在工业物联网(Industrial Internet of Things,IIoT)中,工业领域中的设备和传感器越来越多地与互联网连接,Hypervisor可以用于管理和隔离这些设备之间的不同应用程序,以确保安全性和可靠性。
  • 在医疗领域,Hypervisor也有广泛的应用。比如医疗设备虚拟化: 医疗设备通常包括多个功能模块,例如图像处理、数据采集、通信和用户界面。嵌入式Hypervisor可以在同一硬件平台上虚拟化多个操作系统,以运行这些模块,从而提高设备的多功能性和资源利用率。一台医疗设备可以同时运行实时数据采集和图像处理操作系统。在医疗设备中,安全性和隔离性至关重要,因为医疗设备可能涉及到患者的生命安全。 医疗设备需要定期进行固件和软件更新以确保性能和安全性。Hypervisor可以简化更新过程,通过在虚拟机级别进行更新,减少了对整个设备的干扰。

总之,随着嵌入式系统变得越来越复杂,嵌入式Hypervisor的应用前景非常广泛。它可以提高系统的灵活性、可管理性、安全性和性能,适用于各种行业和领域,为嵌入式系统设计师提供了更多的工具和解决方案,以应对不断变化的需求。

PRTOS是一款轻量级、开源嵌入式嵌入式Type 1 Hypervisor,旨在通过虚拟化技术实现安全高效的嵌入式实时系统,采用Separation Kernel架构实现。它允许不同的应用程序通过分区的时间和空间隔离来共享相同的硬件平台。PRTOS对系统资源进行分区虚拟化,包括CPU、内存和I/O设备,以确保系统安全,并防止应用程序之间的干扰。PRTOS采用分离内核架构实现,其中PRTOS内核在特权模式下运行,并为硬件和分区之间提供抽象层。

PRTOS的分区被定义为独立的执行环境,可以独立且安全地运行。它们按照预定义的循环调度表进行调度,分区之间的通信通过消息传递实现。PRTOS支持两种类型的分区:系统分区和标准分区,只有系统分区具有控制系统和其他分区状态的能力。

PRTOS还提供了多种其他功能,如细粒度的错误检测系统、故障管理、高级故障分析技术和高度可配置的健康监测系统。它还提供了一个跟踪服务,用于实时调试分区和监视系统行为。

更多信息请参考:https://github.com/prtos-project/prtos-hypervisor/blob/main/README_zh.md

本文主要介绍如何使用PRTOS BAIL (Bare-metal Application Interface Library)进行分区裸机应用(Bare-metal Application)的开发。PRTOS BAIL是一个基于C语言的裸机应用程序运行时环境 (Basic Runtime for Bare C based Application) ,是一个用于在PRTOS Hypervisor之上直接开发C程序的最小分区开发环境。 BAIL提供了建立基本的C语言执行环境所需的基本服务,适用于那些不需要操作系统的分区、以及测试PROTS提供的超级调用服务接口。除了BAIL, PRTOS也支持通用操作系统(GPOS)虚拟化(比如Linux Kernel) 、以及实时操作系统(RTOS)虚拟化,比如uC/OS-II。

NOTE:PRTOS Hypervisor 站在巨人们的肩膀上实现,主要借鉴了一些经典开源软件项目,比如XtratuM, Xen Hypervisor, Lguest Hypervisor, 以及Linux Kernel等开源软件项目,正因为如此PRTOS Hypervisor 以GPL许可证的方式发布, 同时一本与之配套的图书《嵌入式Hypervisor:架构、原理与实现》(WIP)详细介绍PRTOS Hypervisor的设计与实现技术,以方便大家更好的理解PRTOS Hypervisor,同时也希望借此形成一个PRTOS Hypervisor的开放社区,让更多的对Hypervisor感兴趣的小伙伴们参与进来,以促进PRTOS Hypervisor的健康演化。尤其是后续对ARM-V8,RISC-V架构的支持,以及更多分区应用的适配,O(∩_∩)O~。

  • 1 PRTOS Hypervisor开发环境

本文中PRTOS Hypervisor的开发环境是 Debian GNU/Linux 12(NOTE:UB22.04也支持)。表1列出了所需的软件包,这些软件包是开发PRTOS Hypervisor所依赖的软件包,在Debian-12中可以通过apt-get进行搜索和安装。

表1 PRTOS Hypervisor开发所需软件包

PRTOS Hypervisor X86平台操作指南

Note:

  1. 关于xmllint的详细信息,请参考 https://gnome.pages.gitlab.gnome.org/libxml2/xmllint.html
  2. PRTOS支持X86平台32位和64位Debian12主机开发环境,  本文推荐安装X86 64 位版本 https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/, 以便小伙伴们使用VS Code来阅读、开发、调试PRTOS Hypervisor源码。 另外,PRTOS也支持UB22.04主机开发环境(https://releases.ubuntu.com/jammy/ubuntu-22.04.3-desktop-amd64.iso)
  3. 小伙伴们可以使用apt-get命令在线安装上述软件包:
sudo apt-get install libncurses5-dev gcc make binutils  libxml2-dev  libxml2-utils perl makeself xorriso makeself build-essential binutils gcc-multilib qemu-system-i386

4.如果使用UB22.04, 除了上面的软件包外,还需要安装mtools:

sudo apt-get install mtools

这是因为在UB2204上,grub-mkrescue 依赖的mformat(mtools中的组件)没有被自动安装,如果不安装的话,会出现以下错误:

/home/prtos/prtos-project/prtos-hypervisor/user/bin/grub_iso resident_sw.iso resident_sw
grub-mkrescue: error: `mformat` invocation failed
  • 2 PRTOS 配置

在Debian-12中安装了13.1节列出的所有的软件包后,小伙伴们就可以配置PRTOS Hypervisor,当然也可以采用默认配置(2.5节所示)。

  • 2.1 PRTOS工具链配置

PRTOS配置文件prtos_config为目标硬件平台定义设备编译器和主机编译器。prtos_config.x86是用于Intel X86目标平台的编译文件。小伙伴们采用下面的命令来做X86平台的配置:

git clone https://github.com/prtos-project/prtos-hypervisor.git
cd prtos-hypervisor
cp prtos_config.x86 prtos_config 

配置好工具链后,小伙伴们就可以通过“make menuconfig”配置工具来配置PRTOS Hypervisor,图1所示。

PRTOS Hypervisor X86平台操作指南

 

图1 PRTOS menuconfig配置界面

从图13-1可以出,PRTOS Hypervisor的配置过程分成3步:

1)配置 PRTOS Hypervisor内核;

2)配置 PRTOS RSW驻留软件加载程序;

3)配置 PRTOS BAIL(Bare-metal Application Interface Library)。

2.2 PRTOS内核配置

这一步是配置PRTOS Hypervisor内核,这个配置过程主要是配置目标平台、多核处理器支持、基本Hypervisor服务以及Hypervisor的设备驱动配置,见图2。

PRTOS Hypervisor X86平台操作指南

图13-2 PRTOS Hypervisor内核配置

其主要配置选项见表2。

表2 PRTOS配置表项清单

PRTOS Hypervisor X86平台操作指南

2.3 驻留软件RSW配置

驻留软件(Resident SW 或简称 RSW)是一个小型加载程序,负责加载PRTOS Hypervisor内核映像和分区映像。配置RSW的主要选项清单,见表3。

表3 PRTOS RSW配置表项清单

PRTOS Hypervisor X86平台操作指南

PRTOS配置项界面见图3:

PRTOS Hypervisor X86平台操作指南

图3 驻留软件RSW配置

2.4 PRTOS BAIL配置

PRTOS抽象层(Abstract Lay)是针对基本C语言分区开发的裸运行时环境。 主要配置选项见表4。

表4 BAIL主要配置选项清单

PRTOS Hypervisor X86平台操作指南

BAIL是一个基于C语言开发的裸机运行时环境。 主要配置选项包含分区栈的大小设置和分区页表的大小设置,如图4所示。

PRTOS Hypervisor X86平台操作指南

图4 PRTOS BAIL配置

配置完PRTOS Hypervisor内核和分区后,小伙伴们就可以编译PRTOS Hypervisor,并创建PRTOS SDK开发包。 PRTOS Hypervisor也提供了默认配置。

2.5 PRTOS 默认配置

PRTOS的默认配置文件如下:

01 prtos@debian12-64:~/prtos-project/prtos-hypervisor$ find ./ -name defconfig
02 ./core/kernel/x86/defconfig
03 ./user/bail/x86/defconfig
04 ./user/bootloaders/rsw/x86/defconfig

配置命令:

cp prtos_config.x86 prtos_config
make defconfig
  • 3. PRTOS Hypervisor内核构建

PRTOS 软件开发工具包简称 (PRTOS SDK) 是一个独立的发行包 (包含PRTOS Hypervisor的分区应用开发组件) 安装程序 (扩展名为. run的文件) 以允许分区开发人员安装使用。小伙伴们在配置完PRTOS Hypervisor内核和分区后,接下来编译PRTOS Hypervisor,编译过程见代码清单1。

配置清单1  编译PRTOS Hypervisor

01 prtos@debian12-64:~/prtos-project/prtos-hypervisor$ make defconfig
02 
03 > Building Kconfig:
04 
05 > Target architecture: [x86]
06 prtos@debian12-64:~/prtos-project/prtos-hypervisor$ make
07 make[1]: Entering directory '/home/prtos/prtos-project/prtos-hypervisor/core'
08 
09 > Target architecture: [x86]
10 make[1]: Leaving directory '/home/prtos/prtos-project/prtos-hypervisor/core'
11 
12 > Configuring and building the "PRTOS Hypervisor"
13 > Building PRTOS Core
14   - kernel/x86
15   - kernel/mmu
16   - kernel
17   - klibc
18   - klibc/x86
19   - objects
20   - drivers
21 > Linking PRTOS Core
22    text    data     bss     dec     hex filename
23  141406    9524   59400  210330   3359a prtos_core
24 4d9aca1b732df9f1c68349a5cedfcaed prtos_core.pef
25 > Done
26 
27 > Configuring and building the "User Utilities"
28 > Building PRTOS User
29   - libprtos
30   - tools
31   - tools/prtospack
32   - tools/prtoscparser
33   - tools/prtosbuildinfo
34   - tools/rswbuild
35   - tools/pef
36   - bail
37   - bootloaders/rsw
38 > Done

 

  • 4 PRTOS SDK软件开发包

 

PRTOS 软件开发工具包(简称 PRTOS-SDK)是一个独立的发行版(包含基于PRTOS Hypervisor的分区应用开发所需的组件)安装程序(扩展名为.run的文件)以允许由分区开发人员安装使用。

接下来,小伙伴们可以来构建PRTOS SDK安装包。

4.1 PRTOS SDK构建

PRTOS-SDK 是使用make distro-run命令构建,该命令会执行PRTOS编译命令,编译过程见安装清单2。

 

安装清单2 PRTOS SDK构建过程

01 prtos@debian12-64:~/prtos-project/prtos-hypervisor$ make distro-run
02 
03 > Configuring and building the "PRTOS Hypervisor"
04 > Building PRTOS Core
05   - kernel/x86
06   - kernel/mmu
07   - kernel
08   - klibc
09   - klibc/x86
10   - objects
11   - drivers
12 > Linking PRTOS Core
13    text    data     bss     dec     hex filename
14  141406    9524   59400  210330   3359a prtos_core
15 4d9aca1b732df9f1c68349a5cedfcaed prtos_core.pef
16 > Done
17 
18 > Configuring and building the "User Utilities"
19 > Building PRTOS User
20   - libprtos
21   - tools
22   - tools/prtospack
23   - tools/prtoscparser
24   - tools/prtosbuildinfo
25   - tools/rswbuild
26   - tools/pef
27   - bail
28   - bootloaders/rsw
29 > Done
30 
31 > Installing PRTOS in "/tmp/prtos-1.0.0-7127/prtos-1.0.0/prtos"
32    - Generating PRTOS sha1sums
33    - Installing BAIL
34    - Generating BAIL sha1sums
35    - Setting read-only (og-w) permission.
36    - Deleting empty files/directories.
37 > Done
38 
39 > Generating PRTOS distribution "prtos-1.0.0.tar.bz2"
40 > Done
41 
42 > Generating self extracting binary distribution "prtos-1.0.0.run"
43 > Done
44 
45 prtos@debian12-64:~/prtos-project/prtos-hypervisor$

 

prtos-1.0.0.run是一个自解压安装包,PRTOS也支持以PRTOS分发包的形式(prtos-1.0.0.tar.bz2)进行发布,通过构建命令“make distro-tar”进行创建,构建过程类似代码清单2。

4.2 PRTOS SDK安装

 

我们在4.1构建了自解压的PRTOS SDK安装包prtos-1.0.0.run,接下来,小伙伴们就可以安装prtos-1.0.0.run。

安装过程见,代码清单3所示。

代码清单3 PRTOS SDK安装过程

01 
02 prtos@debian12-64:~/prtos-project/prtos-hypervisor$ ./prtos-1.0.0.run
03 Verifying archive integrity...  100%   MD5 checksums are OK. All good.
04 Uncompressing prtos binary distribution 1.0.0:   100%
05 Starting installation.
06 Installation log in: /tmp/prtos-installer-10319.log
07 
08 1. Select the directory where prtos will be installed. The installation
09    directory shall not exist.
10 
11 2. Select the target compiler toolchain binary directory (arch x86).
12 
13 3. Confirm the installation settings.
14 
15 Important: you need write permision in the path of the installation directory.
16 
17 Continue with the installation [Y/n]? y
18 
19 Press [Enter] for the default value or enter a new one.
20 Press [TAB] to complete directory names.
21 
22 1.- Installation directory [/opt]: /home/prtos/prtos-sdk
23 2.- Path to the arch toolchain [/usr/bin/]:
24 prtos-installer: chkdestdir /home/prtos/prtos-sdk
25 prtos-installer: chktargetgcc /usr/bin/
26 
27 Confirm the Installation settings:
28 Selected installation path :  /home/prtos/prtos-sdk
29 Selected toolchain path    :  /usr/bin/
30 
31 3.- Perform the installation using the above settings [Y/n]? y
32 
33 Installation completed.
34 prtos@debian12-64:~/prtos-project/prtos-hypervisor$

安装后,/home/prtos/prtos-sdk/目录中的文件就是PRTOS-SDK分发的内容。

主要组件如下。

1)PRTOS Hypervisor内核prtos_core.pef。

2)libprtos.a提供PRTOS Hypervisor服务和驻留软件RSW引导加载程序。

3)prtos-sdk/bail是一个用于在PRTOS Hypervisor之上直接开发C程序的最小分区开发环境。BAIL提供了建立基本的"C"执行环境所需的基本服务。

4)prtos-sdk/bail-examples 包含PRTOS BAIL示例源代码,这些示例使用BAIL层来构建分区系统。

 

PRTOS-SDK组件布局见图5。

PRTOS Hypervisor X86平台操作指南

图5 PRTOS SDK 组件布局

4.3 PRTOS软件开发套件的辅助工具列表

PRTOS软件开发套件中的辅助工具,见表4。

表4 PRTOS SDK包中的辅助工具表单

PRTOS Hypervisor X86平台操作指南

5 PRTOS 分区开发

5.1 RTOS BAIL概述

PRTOS BAIL是一个极小的C语言运行时环境,它提供以下服务:

  • 分区初始化:初始化虚拟陷阱表、栈空间、分区入口点(partition_main).
  • 最小的C 库:stdio、stdlib、字符串。
  • 用于陷阱/中断管理的附加库:
    • 单独设置陷阱处理程序(install_trap_handler).
    • IRQ 屏蔽(hw_cli、hw_sti).
  • 内部使用 LIBBAIL库封装的PRTOS超级调用API接口。

5.2 基于RTOS BAIL示例

helloworld示例与其他示例一起位于 /home/prtos/prtos-sdk/bail-examples

与 PRTOS-SDK 一起分发。helloworld示例的内容见图6。

PRTOS Hypervisor X86平台操作指南

图6 helloworld裸应用示例

5.2.1 PRTOS 配置文件

PRTOS配置文件(PRTOS Configuration File, PRTOS CF)定义了目标系统资源,以及它们是如何分配给每个分区,配置文件见代码清单4。

代码清单 4 PRTOS helloworld裸应用配置文件  [user/bail/examples/helloworld/prtos_cf.x86.xml]

01 <SystemDescription xmlns="http://www.prtos.org/prtos-1.x" version="1.0.0" name="hello_world">
02     <HwDescription>
03         <MemoryLayout>
04             <Region type="ram" start="0x0" size="512MB" />
05         </MemoryLayout>
06         <ProcessorTable>
07             <Processor id="0">
08                 <CyclicPlanTable>
09                     <Plan id="0" majorFrame="2ms">
10                         <Slot id="0" start="0ms" duration="1ms" partitionId="0" />
11                     </Plan>
12                 </CyclicPlanTable>
13             </Processor>
14         </ProcessorTable>
15         <Devices>
16             <Uart id="0" baudRate="115200" name="Uart" />
17         </Devices>
18     </HwDescription>
19     
20     <PRTOSHypervisor console="Uart">
21         <PhysicalMemoryArea size="4MB" />
22     </PRTOSHypervisor>
23     
24     <PartitionTable>
25         <Partition id="0" name="Partition0" flags="system" console="Uart">
26             <PhysicalMemoryAreas>
27                 <Area start="0x6000000" size="1MB" />
28             </PhysicalMemoryAreas>
29         </Partition>
30     </PartitionTable>
31 </SystemDescription>

代码清单 5中配置分区Partition1占用1MB的系统空间,输出设备为Uart串口设备,helloword示例程序在这个分区上运行。

5.2.2 HelloWorld源文件

为了对 BAIL 分区进行编程,BAIL 分区必须包含特定的头文件来调用libprtos.a和libBAIL库提供的服务,如代码清单5所示。

代码清单5  helloword源代码 partition.c

01 #include <string.h>  // string services provided by the libbail library
02 #include <stdio.h>   // stdio services provided by the libbail library
03 #include <prtos.h>   // hypercall services provided by the libprtos library
04 #include <irqs.h>    // virtual irq services provided by the libbail library
05 
06 #define PRINT(...)                             \
07     do {                                       \
08         printf("[%d] ", PRTOS_PARTITION_SELF); \
09         printf(__VA_ARGS__);                   \
10     } while (0)
11 
12 void partition_main(void) {
13     PRINT("Hello World!\n");
14     PRINT("Verification Passed\n");
15     prtos_idle_self();
16 }

5.2.3 Makefile构建过程

我们通过helloworld的Makefile文件来描述PRTOS系统镜像的构建过程。

构建过程定义,见代码清单6。

代码清单 6 helloworld裸应用Makefile文件

01 # BAIL_PATH: path to the PRTOS directory
02 BAIL_PATH=/home/prtos/prtos-sdk/bail
03 
04 all: container.bin resident_sw
05 include $(BAIL_PATH)/common/rules.mk
06 
07 # XMLCF: path to the XML configuration file
08 XMLCF=prtos_cf.$(ARCH).xml
09 
10 # PARTITIONS: partition files (pef format) composing the example
11 PARTITIONS=partition.pef
12 
13 partition: partition.o
14 	$(TARGET_LD) -o $@ $^ $(TARGET_LDFLAGS) -Ttext=$(shell $(XPATHSTART) 0 $(XMLCF))
15 	
16 PACK_ARGS=-h $(PRTOS_CORE):prtos_cf.pef.prtos_conf \
17 	-p 0:partition.pef
18 	
19 container.bin: $(PARTITIONS) prtos_cf.pef.prtos_conf
20 	$(PRTOS_PACK) check prtos_cf.pef.prtos_conf $(PACK_ARGS)
21 	$(PRTOS_PACK) build $(PACK_ARGS) $@
22 
23 include ../run.mk
24 	

其中主要的变量定义如下。

1)BAIL_PATH:定义PRTOS SDK的安装路径。

2)XMLCF:定义示例使用的PRTOS XML 配置文件。

3)PARTITIONS:定义构成示例的分区代码,代码清单5.2.2所示。

4)Makefile 的其余部分定义了系统的构建方式,其构建过程如图7所示,其中make工具自动构建最终系统映像。主要包含3个组成部分:分区代码的编译、系统配置文件的编译、最终系统映像的构建。

PRTOS Hypervisor X86平台操作指南

图7 helloworld示例构建过程

图7包含以下7个步骤。

步骤1:使用gcc编译C源代码文件生成.o文件;

步骤2:使用ld链接器链接.o文件到固定的分区地址;

步骤3:使用prtoseformat工具构建分区PEF(PRTOS Executable Format)映像文件;

步骤4:使用prtoscparser工具parse和编译PRTOS_CF XML配置文件;

步骤5:使用prtospack tool打包系统的各个组件,生成container.bin;

步骤6:创建自引导的resident_sw自引导映像文件。

步骤7:借助grub工具,生成grub引导的resident_sw.iso镜像文件。

5.3 PRTOS 分区编程

make工具自动构建最终系统映像。本节我们分别构建每个元素来解释构建过程:

  • 分区代码的编译。
  • 编译配置文件。
  • 最终系统映像的构建

5.3.1 分区代码编译

分区源代码hello.c使用gcc编译器编译,输出结果是编译生成PEF格式的分区文件

步骤1:拷贝示例到开发目录,并进入开发目录

cd /home/prtos/prtos-sdk/bail-examples/helloworld

编译partition.c源码

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make partition.o
/usr/bin/gcc -Wall -O2 -nostdlib -nostdinc -Dx86 -fno-strict-aliasing -fomit-frame-pointer -D"__PRTOS_INCFLD(_fld)=<prtos_inc/_fld>" -I/home/prtos/prtos-sdk/prtos/include --include prtos_inc/config.h --include prtos_inc/arch/arch_types.h -Wno-unused-but-set-variable -fno-pie -ffreestanding -Wno-int-in-bool-context -Wno-address-of-packed-member -Wno-array-bounds --std=gnu89 -Wno-implicit-function-declaration -m32 -fomit-frame-pointer -I/home/prtos/prtos-sdk/bail/include -fno-builtin -c partition.c -o partition.o
prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$

步骤2:将partition.o链接到固定的分区地址

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make partition
/usr/bin/ld -o partition partition.o -melf_i386 -z noexecstack --no-warn-rwx-segments -u start -u prtos_image_hdr -T/home/prtos/prtos-sdk/bail/lib/loader.lds -L/home/prtos/prtos-sdk/prtos/lib -L/home/prtos/prtos-sdk/bail/lib --start-group `/usr/bin/gcc -print-libgcc-file-name -m32` -lprtos -lbail --end-group -z noexecstack --no-warn-rwx-segments -Ttext=0x6000000
prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$

步骤3:构建分区映像文件

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make partition.pef
/home/prtos/prtos-sdk/prtos/bin/prtoseformat build partition -c -o partition.pef
593d583773f614c0877ca53244407d47 partition.pef
prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$

详细过程,见代码清单7。

代码清单 7 分区裸应用构建过程清单

01 
02 prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make clean
03 prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make partition.o
04 /usr/bin/gcc -Wall -O2 -nostdlib -nostdinc -Dx86 -fno-strict-aliasing -fomit-frame-pointer -D"__PRTOS_INCFLD(_fld)=<prtos_inc/_fld>" -I/home/prtos/prtos-sdk/prtos/include --include prtos_inc/config.h --include prtos_inc/arch/arch_types.h -Wno-unused-but-set-variable -fno-pie -ffreestanding -Wno-int-in-bool-context -Wno-address-of-packed-member -Wno-array-bounds --std=gnu89 -Wno-implicit-function-declaration -m32 -fomit-frame-pointer -I/home/prtos/prtos-sdk/bail/include -fno-builtin -c partition.c -o partition.o
05 prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make partition
06 /usr/bin/ld -o partition partition.o -melf_i386 -z noexecstack --no-warn-rwx-segments -u start -u prtos_image_hdr -T/home/prtos/prtos-sdk/bail/lib/loader.lds -L/home/prtos/prtos-sdk/prtos/lib -L/home/prtos/prtos-sdk/bail/lib --start-group `/usr/bin/gcc -print-libgcc-file-name -m32` -lprtos -lbail --end-group -z noexecstack --no-warn-rwx-segments -Ttext=0x6000000
07 prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make partition.pef
08 /home/prtos/prtos-sdk/prtos/bin/prtoseformat build partition -c -o partition.pef
09 593d583773f614c0877ca53244407d47 partition.pef
10 prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ tree ./
11 ./
12 ├── Makefile
13 ├── partition
14 ├── partition.c
15 ├── partition.o
16 ├── partition.pef
17 ├── prtos_cf.x86.xml
18 └── README.md
19 
20 1 directory, 7 files
21 prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$

5.3.2 编译配置文件

 

PRTOS XML配置文件使用prtosparser进行XML的合法性检测后,进行编译,最后转换成PEF格式的编译版本。

步骤4: Parse并编译prtos_cf.x86.xml

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make prtos_cf.bin.prtos_conf
/home/prtos/prtos-sdk/prtos/bin/prtoscparser -o prtos_cf.bin.prtos_conf prtos_cf.x86.xml
make[1]: Entering directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
/usr/bin/gcc -m32 -x c -O2 -Wall -I/home/prtos/prtos-sdk/prtos/user/libprtos/include -D"__PRTOS_INCFLD(_fld)=<prtos_inc/_fld>" -I/home/prtos/prtos-sdk/prtos/include -nostdlib -nostdinc --include prtos_inc/config.h --include prtos_inc/arch/arch_types.h a.c.prtos_conf -o prtos_cf.bin.prtos_conf -Wl,--entry=0x0,-TldsM6dc23
/tmp/ccUC0azk.s: Assembler messages:
/tmp/ccUC0azk.s:177: Warning: setting incorrect section attributes for .rodata.hdr
make[1]: Leaving directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$

5.3.3 编译最终的系统映像

驻留软件映像是一个多启动标准兼容的自引导内核映像,它包含一个很小的引导器外加一个自包含的文件容器container.bin,container.bin打包了以下的组件:

  • PRTOS 核心;
  • 分区代码;
  • PRTOS_CF配置向量

步骤5: 打包系统的各个PEF格式的文件成一个单独的容器

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make container.bin
/home/prtos/prtos-sdk/prtos/bin/prtoseformat build -m prtos_cf.bin.prtos_conf -c -o prtos_cf.pef.prtos_conf
05b57913ff5b0ee5202c2bb58192551e prtos_cf.pef.prtos_conf
/home/prtos/prtos-sdk/prtos/bin/prtospack check prtos_cf.pef.prtos_conf -h /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef:prtos_cf.pef.prtos_conf -p 0:partition.pef
> /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef ... ok
> partition.pef ... ok
/home/prtos/prtos-sdk/prtos/bin/prtospack build -h /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef:prtos_cf.pef.prtos_conf -p 0:partition.pef container.bin
> /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef ... ok
> partition.pef ... ok
prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$

步骤6: 使用驻留软件工具RSW和容器container.bin构建自引导文件

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make resident_sw
/home/prtos/prtos-sdk/prtos/bin/rswbuild container.bin resident_sw

Created by "prtos" on "debian12-64" at "Sun Sep 17 04:29:43 EDT 2023"
PRTOS path: "/home/prtos/prtos-sdk/prtos"

prtos Core:
   Version: "1.0.0"
   Arch:    "x86"
   File:    "/home/prtos/prtos-sdk/prtos/lib/prtos_core.pef"
   Sha1:    "db7f7906116232a22b862c68824cbec61d3205d4"
   Changed: ""

prtos Library:
   Version: "1.0.0"
   File:    "/home/prtos/prtos-sdk/prtos/lib/libprtos.a"
   Sha1:    "5015d7a383cbb52b74162312dc308d6c40838b67"
   Changed: ""

prtos Tools:
   File:    "/home/prtos/prtos-sdk/prtos/bin/prtoscparser"
   Sha1:    "86060958fe462d50ef0302c4957a47d20812ad5d"
/usr/bin/ld: warning: resident_sw has a LOAD segment with RWX permissions
prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$

 

6 PRTOS系统执行

自引导映像resident_sw兼容多引导兼容的引导加载程序,比如GRUB引导程序。

 

6.1 QEMU上执行

为了在QEMU模拟器上运行resident_sw映像,小伙伴们需要执行下面的步骤:

  • 创建一个包含 GRUB 引导加载程序和自引导映像resident_sw的iso 映像文件:
prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$  /home/prtos/prtos-sdk/prtos/bin/grub_iso resident_sw.iso resident_sw
xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project.

Drive current: -outdev 'stdio:resident_sw.iso'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 10.9g free
Added to ISO image: directory '/'='/tmp/grub.WFPYQU'
xorriso : UPDATE :     335 files added in 1 seconds
Added to ISO image: directory '/'='/tmp/iso.zIA'
xorriso : UPDATE :     339 files added in 1 seconds
xorriso : NOTE : Copying to System Area: 512 bytes from file '/usr/lib/grub/i386-pc/boot_hybrid.img'
ISO image produced: 4687 sectors
Written to medium : 4687 sectors at LBA 0
Writing to 'stdio:resident_sw.iso' completed successfully.

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$
  • 在 QEMU 仿真器上运行iso 文件,将 UART 串行发送到 stdio:
qemu-system-i386 -m 512 -serial stdio -hda resident_sw.iso

执行效果,见代码清单8。

 

代码清单8 hello-world裸应用在QEMU仿真平台运行效果

01 prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ qemu-system-i386 -m 512 -serial stdio -hda resident_sw.iso
02 PRTOS map: [0x1000000 - 0x13fffff] flags: 0x0
03 [VMM] Free [0xfc400000-0xffffffff] 15360 frames
04 HPET Vendor ID 8086
05 PRTOS Hypervisor (1.0 r0)
06 Detected 3204.84MHz processor.
07 >> HWClocks [HPET clock (100000khz)]
08 [CPU0] >> hardware timer [lapic timer (31395Khz)]
09 1 Partition(s) created
10 P0 ("Partition0":0:1) flags: [ SYSTEM ]:
11     [0x6000000:0x6000000 - 0x60fffff:0x60fffff] flags: 0x0
12 [0] Hello World!
13 [0] Verification Passed
14 [HYPERCALL] (0x0) Halted

NOTE: 以上各个构建命令的分步执行,主要是为了增加小伙伴们对helloword裸机应用构建过程的理解,小伙伴们也可以直接执行一条命令 "make run.x86",完成helloword的构建、部署、以及在QEMU上的执行,命令清单如下:

prtos@debian12-64:~/prtos-sdk/bail-examples/helloworld$ make run.x86
make[1]: Entering directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
make[1]: Leaving directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
make[1]: Entering directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
/usr/bin/gcc -Wall -O2 -nostdlib -nostdinc -Dx86 -fno-strict-aliasing -fomit-frame-pointer -D"__PRTOS_INCFLD(_fld)=<prtos_inc/_fld>" -I/home/prtos/prtos-sdk/prtos/include --include prtos_inc/config.h --include prtos_inc/arch/arch_types.h -Wno-unused-but-set-variable -fno-pie -ffreestanding -Wno-int-in-bool-context -Wno-address-of-packed-member -Wno-array-bounds --std=gnu89 -Wno-implicit-function-declaration -m32 -fomit-frame-pointer -I/home/prtos/prtos-sdk/bail/include -fno-builtin -c partition.c -o partition.o
/usr/bin/ld -o partition partition.o -melf_i386 -z noexecstack --no-warn-rwx-segments -u start -u prtos_image_hdr -T/home/prtos/prtos-sdk/bail/lib/loader.lds -L/home/prtos/prtos-sdk/prtos/lib -L/home/prtos/prtos-sdk/bail/lib --start-group `/usr/bin/gcc -print-libgcc-file-name -m32` -lprtos -lbail --end-group -z noexecstack --no-warn-rwx-segments -Ttext=0x6000000
/home/prtos/prtos-sdk/prtos/bin/prtoseformat build partition -c -o partition.pef
593d583773f614c0877ca53244407d47 partition.pef
/home/prtos/prtos-sdk/prtos/bin/prtoscparser -o prtos_cf.bin.prtos_conf prtos_cf.x86.xml
make[2]: Entering directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
/usr/bin/gcc -m32 -x c -O2 -Wall -I/home/prtos/prtos-sdk/prtos/user/libprtos/include -D"__PRTOS_INCFLD(_fld)=<prtos_inc/_fld>" -I/home/prtos/prtos-sdk/prtos/include -nostdlib -nostdinc --include prtos_inc/config.h --include prtos_inc/arch/arch_types.h a.c.prtos_conf -o prtos_cf.bin.prtos_conf -Wl,--entry=0x0,-Tldsl9qbBy
/tmp/cckfWHw8.s: Assembler messages:
/tmp/cckfWHw8.s:177: Warning: setting incorrect section attributes for .rodata.hdr
make[2]: Leaving directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
/home/prtos/prtos-sdk/prtos/bin/prtoseformat build -m prtos_cf.bin.prtos_conf -c -o prtos_cf.pef.prtos_conf
05b57913ff5b0ee5202c2bb58192551e prtos_cf.pef.prtos_conf
/home/prtos/prtos-sdk/prtos/bin/prtospack check prtos_cf.pef.prtos_conf -h /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef:prtos_cf.pef.prtos_conf -p 0:partition.pef
> /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef ... ok
> partition.pef ... ok
/home/prtos/prtos-sdk/prtos/bin/prtospack build -h /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef:prtos_cf.pef.prtos_conf -p 0:partition.pef container.bin
> /home/prtos/prtos-sdk/prtos/lib/prtos_core.pef ... ok
> partition.pef ... ok
/home/prtos/prtos-sdk/prtos/bin/rswbuild container.bin resident_sw

Created by "prtos" on "debian12-64" at "Sun Sep 17 07:16:32 EDT 2023"
PRTOS path: "/home/prtos/prtos-sdk/prtos"

prtos Core:
   Version: "1.0.0"
   Arch:    "x86"
   File:    "/home/prtos/prtos-sdk/prtos/lib/prtos_core.pef"
   Sha1:    "db7f7906116232a22b862c68824cbec61d3205d4"
   Changed: ""

prtos Library:
   Version: "1.0.0"
   File:    "/home/prtos/prtos-sdk/prtos/lib/libprtos.a"
   Sha1:    "5015d7a383cbb52b74162312dc308d6c40838b67"
   Changed: ""

prtos Tools:
   File:    "/home/prtos/prtos-sdk/prtos/bin/prtoscparser"
   Sha1:    "86060958fe462d50ef0302c4957a47d20812ad5d"
/usr/bin/ld: warning: resident_sw has a LOAD segment with RWX permissions
/home/prtos/prtos-sdk/prtos/bin/grub_iso resident_sw.iso resident_sw
xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project.

Drive current: -outdev 'stdio:resident_sw.iso'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 10.9g free
Added to ISO image: directory '/'='/tmp/grub.53WdMw'
xorriso : UPDATE :     335 files added in 1 seconds
Added to ISO image: directory '/'='/tmp/iso.Ayh'
xorriso : UPDATE :     339 files added in 1 seconds
xorriso : NOTE : Copying to System Area: 512 bytes from file '/usr/lib/grub/i386-pc/boot_hybrid.img'
ISO image produced: 4687 sectors
Written to medium : 4687 sectors at LBA 0
Writing to 'stdio:resident_sw.iso' completed successfully.

make[1]: Leaving directory '/home/prtos/prtos-sdk/bail-examples/helloworld'
PRTOS map: [0x1000000 - 0x13fffff] flags: 0x0
[VMM] Free [0xfc400000-0xffffffff] 15360 frames
HPET Vendor ID 8086
PRTOS Hypervisor (1.0 r0)
Detected 3213.583MHz processor.
>> HWClocks [HPET clock (100000khz)]
[CPU0] >> hardware timer [lapic timer (31353Khz)]
1 Partition(s) created
P0 ("Partition0":0:1) flags: [ SYSTEM ]:
    [0x6000000:0x6000000 - 0x60fffff:0x60fffff] flags: 0x0
[0] Hello World!
[0] Verification Passed
[HYPERCALL] (0x0) Halted

对于其它裸机应用(https://github.com/prtos-project/prtos-hypervisor/tree/main/user/bail/examples)操作过程类似,这里不在赘述。

另外,自引导映像resident_sw也可以运行在VMware虚拟机中。

6.2 在GRUB上执行

使用 GRUB 在目标系统上运行resident_sw自引导映像,需要执行以下步骤:

  • 拷贝resident_sw文件到/boot/prtos目录
  • 创建一个新的菜单条目,在GRUB 中/boot/grub/grub.cfg文件中描述resident_sw的引导

Note:在QEMU平台,小伙伴们可以使用 grub_iso工具为resident_sw自动菜单项,启动helloword裸机应用。

  • 重启宿主系统并在 GRUB 引导菜单中选择resident_sw引导条目。

本文小结

本文主要介绍使用PRTOS BAIL进行裸机应用开发。PRTOS BAIL是一个基于C语言的裸机应用程序的运行时环境,通过本章的介绍,小伙伴们对PRTOS的开发环境会有一个直观上的了解,这有助于大家对PRTOS结构布局的了解,以及未来对更多分区应用的适配。

继续阅读
prtos, info
  • 本文由 发表于 2023年9月17日 15:54:28
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
分区操作系统(Partition Operating System)概述 分区实时系统

分区操作系统(Partition Operating System)概述

本文概述:随着嵌入式系统日趋复杂化以及对安全性要求的不断提高,采用空间隔离、时间预先分配的分时分区操作系统已经成为未来的发展方向。本文描述分时分区操作系统出现的背景、实现技术、以及设计理念,来研究主流...
评论  3  访客  3
    • 明贵
      明贵 0

      git clone git@github.com:prtos-project/prtos-hypervisor.git 是否改成https?git@需要在项目里面添加ssh key的,https 不需要账户的

        • prtos, info
          prtos, info

          @ 明贵 这个我没有专门设置,你用git clone https://github.com/prtos-project/prtos-hypervisor.git 不能下载代码吗?

      匿名

      发表评论

      匿名网友

      :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

      确定