技术架构介绍
OneOS 总体架构采用分层设计,主体由内核层、组件层、接口层以及安全框架组成,另外还有硬件层和应用层,但不属于 OneOS 操作系统的范畴。同时,采用一个轻量级内核加多个系统组件的模式,并采用统一的接口层,使物联网操作系统具备极高的可伸缩性和可移植性。操作系统整体架构如下图:
下面对总体架构的各层做一个简要描述。
硬件层
OneOS操作系统运行时所依赖的硬件环境,目前支持ARM Cortex-M、MIPS和RISC-V等主流芯片架构。随着OneOS操作系统的演进,会支持越来越多的芯片架构。
内核层
极简的硬实时内核,支持多任务管理调度、工作队列、任务间同步(信号量、互斥量、事件集、完成量)、任务间通信(消息队列、邮箱、数据队列)以及内存管理等。
组件层
包括网络协议、OneNET接入、远程升级、虚拟文件系统、SHELL命令行工具、日志系统、测试框架等。采用模块化设计,使各个组件的功能独立,易于灵活裁剪。
接口层
提供统一的抽象接口层,方便业务代码在多个操作系统间移植。在此接口层,主要适配如下的常用接口:
- 标准C接口
- Posix接口
- CMSIS接口
- RT-Thread接口
- FreeRTOS接口
应用层
应用层是基于OneOS操作系统开发的应用程序,通常为某产品的业务代码。应用层可以基于抽象层开发,便于移植;也可基于内核层或组件层提供的接口开发,可以降低对硬件资源的使用(主要的是RAM和ROM)。
安全框架
终端侧基于信任根实现轻量级的主动检测和可信度量,提供轻量级的密码算法库及轻量级密钥管理与密钥协商机制,实现端到端安全通信。平台侧基于大数据态势感知技术,帮助用户建立端侧安全画像,根据应用场景制定不同的安全管理策略。
目录结构
OneOS操作系统有着清晰的目录结构(即代码静态组织架构),通过目录名称,就可以理解可个目录要实现的功能,学习时,很容易上手。
根目录结构
OneOS操作系统的根目录结构如下:
根目录下各子目录和文件的功能描述如下:
目录或文件名称 | 描述 |
---|---|
arch | 存放和 MCU(或 CPU )架构体系相关的代码。 |
common | 存放一些通用的没有具体业务指向的程序代码,所有模块都可以使用,不通过编译选项控制是否编译,采用默认编译进工程的方式。 |
components | 存放组件代码,可进行裁剪。 |
demos | 存放内核或组件的对外接口如何使用的示例程序。 |
docs | 存放一些文档,如编码规范、编程指南等。 |
drivers | 存放驱动的抽象层代码和具体外设的驱动代码。 |
kernel | 存放内核代码,如任务管理及调度、任务间同步以及通信、内存管理等代码。 |
libc | Libc 库部分硬件相关接口的底层适配。 |
osal | OneOS操作系统接口抽象层,支持Posix接口、CMSIS接口、RT-Thread接口等 |
projects | 各种开发板的示例工程 |
scripts | 存放OneOS-Cube工具在编译构造时所需要的脚本文件。 |
thirdparty | 存放第三方开源社区或第三方厂家的程序,包括组件、工具、协议实现或对接平台的代码等。 |
Kconfig | Menuconfig配置文件,代码工程(如projects目录下的示例工程)中的Kconfig文件会引用此文件 |
SConscript | OneOS操作系统使用Scons构建工具时的根编译脚本,该脚本会引用其它目录的SConscript脚本,若在OneOS操作系统根目录增加新的代码目录,需要修改此文件(参见“从零开始构建代码工程”章节)。 |
LICENSE | License 授权说明。 |
内核目录结构
进入到OneOS操作系统代码的kernel目录,可以看到2个文件夹和2个文件,如下图:
目录或文件 | 描述 |
---|---|
include | 存放内核对外提供的头文件 |
source | 存放内核源代码实现和只针对内核内部使用的头文件 |
Kconfig | 内核配置文件 |
SConscript | 内核Scons编译构造脚本 |
另外,include和source目录下,各有一个extend目录,两个extend目录是相互对应的,提供内核扩展机制(只是为了扩展内核功能,并不是内核必须要实现的功能)。
kernel/include目录下各个头文件的作用描述如下表:
头文件 | 描述 |
---|---|
os_assert.h | 该文件提供OneOS统一的断言接口 |
os_clock.h | 时钟节拍管理接口声明 |
os_dbg.h | 各种级别的日志打印全部编译到链接输出文件的接口(在调试总开关打开的情况下)。 |
os_dbg_ext.h | 各种级别的日志打印根据用户定义的编译级别选择是否编译到链接输出文件(在调试总开关打开的情况下),该文件包含相关接口。 |
os_device.h | 设备管理相关数据结构定义和接口声明(在内核层,只是抽象的设备管理,不涉及到具体设备)。 |
os_errno.h | 错误返回码定义。 |
os_event.h | 事件相关的数据结构定义及接口声明。 |
os_hw.h | 内核实现或使用的与硬件相关的接口声明。 |
os_idle.h | IDLE任务提供的接口声明,如用于注册钩子函数的接口。 |
os_irq.h | 中断管理接口声明。 |
os_kernel.h | 包含内核提供的全部接口头文件(除os_dbg.h和os_dbg_ext.h外,这2个头文件不能同时包含),方便应用程序和组件使用,减少包含多个内核头文件的不便。 |
os_list.h | 双向链表和单向链表的相关函数实现,采用内联函数。 |
os_mailbox.h | 邮箱数据结构定义和接口声明。 |
os_memory.h | 内核中提供的内存堆管理和内存池管理接口声明。 |
os_mq.h | 消息队列数据结构定义和接口声明。 |
os_mutex.h | 互斥锁数据结构定义和接口声明。 |
os_sem.h | 信号量数据结构定义和接口声明。 |
os_stddef.h | 内核中标准的宏定义等数据类型,如OS_SECTION,OS_ALIGN,OS_NULL,OS_TRUE等。 |
os_task.h | 任务相关的数据结构定义和接口声明。 |
os_timer.h | 定时器相关的数据结构定义和接口声明。 |
os_types.h | OneOS提供的基础数据类型定义 |
os_util.h | 内核公共函数库(为使内核不依赖于标准C库,开发一些内核用到的C库接口)对外接口,此头文件只对外提供了少量的公共函数库接口,这些接口都是经过优化过的;其它公共函数库接口,请使用标准C库提供的。 |
os_version.h | 存放OneOS版本号 |
extend/os_completion.h | 完成量相关的数据结构定义和接口声明。 |
extend/os_dataqueue.h | 数据队列相关的数据结构定义和接口声明 |
extend/os_workqueue.h | 工作队列相关的数据结构定义和接口声明 |
kernel/source目录下各个文件的作用描述如下表:
文件 | 描述 |
---|---|
os_clock.c | 时钟节拍管理,其对外的接口由os_clock.h提供。 |
os_device.c | 设备管理功能实现,是一种设备管理框架,属于抽象层,其对外接口由os_device.h提供。 |
os_event.c | 事件功能实现,其对外接口由os_event.h提供。 |
os_idle.c | IDLE任务实现,其对外接口由os_idle.h提供。 |
os_ipc.c | IPC通信公共部分代码实现,所提供的接口主要给其它具体某种IPC通信使用。 |
os_irq.c | 中断管理,用于记录中断的嵌套层次,以便让系统判断当前是否在中断上下文,其对外接口由os_irq.h提供。 |
os_kernel_log.c | 内核日志打印实现,对外的接口放在os_util.h中,对内的接口放在os_kernel_internal.h中。 |
os_mailbox.c | 邮箱功能实现,其对外接口由os_mailbox.h提供。 |
os_mem_heap.c | 针对于拥有多个内存块的堆管理算法,多数应用于拥有1M以上内存的情况,其对外接口由os_memory.h提供。 |
os_mem_pool.c | 内存池管理,其对外接口由os_memory.h提供。 |
os_mem_slab.c | SLAB内存管理算法实现,其对外接口由os_memory.h提供。 |
os_mem_small.c | 小内存管理算法实现,其对外接口由os_memory.h提供。 |
os_mq.c | 消息队列功能实现,其对外接口由os_mq.h提供。 |
os_mutex.c | 互斥量功能实现,其对外接口由os_mutex.h提供。 |
os_sem.c | 信号量功能实现,其对外接口由os_sem.h提供。 |
os_startup.c | 内核启动实现,其向外提供的接口放到os_hw.h中。 |
os_task.c | 任务管理及任务调度实现,其对外接口由os_task.h提供。 |
os_timer.c | 定时器功能实现,其对外接口由os_timer.h提供。 |
os_util.c | 内核公共函数库,其对外接口由os_util.h提供。注意,此文件实现的函数只有一部分对外提供,见os_util.h。 |
os_kernel_internal.h | 内核内部使用。诸如内核打印宏、内核内部使用接口声明。 |
os_util_internal.h | 内核内部使用,为公共函数库对内核内部使用的函数声明。 |
extend/os_completion.c | 完成量功能实现,其对外接口由os_completion.h 提供。 |
extend/os_dataqueue.c | 数据队列功能实现,其对外接口由os_dataqueue.h提供。 |
extend/os_workqueue.c | 工作队列功能实现,其对外接口由os_workqueue.h提供。 |