在前几篇文章,我们聊到了不同类型的汽车芯片或者控制单元,包括冯诺依曼架构,CPU组成架构,汽车嵌入式控制单元MCU,多用于安全监控的基础芯片SBC,随着AI兴起的GPU以及汽车电子架构集中化,智能化催生的SoC以及安全岛的设计。
对于一个完整的电控单元来讲,这些硬件控制器的只是软件运行的载体,为了能够最终实现我们想要的功能,除了这些传感器,控制单元硬件外,软件发挥的作用不可小觑,这也是这些年软件定义汽车的由来之一。在这些软件中,除了我们熟悉的用于实现基本功能的应用层软件外,基础软件作为应用层软件和底层硬件衔接的桥梁,充当了非常重要的角色。
当然,根据承担的角色不同,这些基础软件又可以被进一步划分,而在这些基础软件中,操作系统无疑是最重要的内容之一。车载操作系统是现代汽车软件架构的核心部分,它能够有效地管理和协调车载硬件及软件资源,为上层应用的搭建提供统一接口和服务。
01
汽车软件为什么需要操作系统OS
提到操作系统,大家最先想到的就是我们日常使用的个人电脑中的操作系统,什么DOS,苹果OS,Linux,Windows操作系统等等,它存在的目的无非就是负责管理和分配计算机的各种资源,包括CPU、内存、硬盘和外设,并为我们提供了一个直观、易用的界面,支撑我们写文档、上网,与朋友视频聊天等等,让各种复杂的计算机任务变得简单易行。
这就像操作系统在处理不同的周期的任务或者线程,例如5ms,10ms任务等。
操作系统也是这样,遇到紧急情况或优先级高的任务,它必须能够快速响应重要的任务,比如突然刹车的需求,确保你在紧急情况下能安全停车。
操作系统也会管理控制器硬件资源,比如CPU执行时间和内存,确保各个功能模块之间不互相打架,在一个任务需要等待时,暂时等待,运行下一个任务等。
操作系统必须提供相关的安全措施,保护应用不受外界攻击,内部错误检出,并且在出现问题时能够迅速恢复正常。
操作系统也是这样,它让应用层的功能可以灵活扩展和更新,不需要对硬件本身以及现有的任务做大幅修改。
其实,在汽车电子软件发展的初期,汽车电控系统相对比较简单:
处理的任务也比较单一,通常只执行单一任务,没有任务调度的需求
代码通常以无限循环的方式运行,并依靠中断来处理定时事件或外部信号
代码结构通常是一个主循环加上一些中断服务程序,也就是所谓的while(1)。
想必年纪大一些的汽车工程师都写过这个最基本的东西吧。
但随着汽车电控系统不断复杂化,软件任务越来越复杂,多任务成为常态,对任务实时性,安全性的要求也越来越高,尤其涉及到多个任务之间的状态切换,优先级,现场保护,执行时间控制等。这时候单任务无操作系统的软件架构根本没办法满足这样需求,汽车软件任务急切需要一个集中管理者,汽车软件操作系统,即车载操作系统的需求由此出现。
但操作系统的开发并不是一朝一夕就能完成,除了基本功能的实现外,其可靠性,兼容性,生态环境,开发工具,行业内的认可等等这才是真正的难点,这都需要大量的时间验证,而个人电脑操作系统发展至今已经比较成熟,也没有必要重复造轮子,所以汽车操作系统实际上是直接借用电脑操作系统,也正是因为这样,实际上并不存在真正专门为汽车设计的操作系统,都是在现有的操作系统基础上,根据汽车软件的特性,例如,实时性,安全性,对其进行适配。
尤其随着汽车电子电气架构的集中化,软件定义汽车,自动驾驶,智能座舱的出现,使得汽车操作系统也随之演变,逐渐从单一的实时操作系统RTOS,逐渐向Linux 等更加复杂,性能更强的操作系统扩展,并且呈现多系统融合的趋势,这部分内容我们下篇具体聊。
02
操作系统的核心 - 内核OS
很多朋友提起汽车操作系统,大部分反应就是任务管理调度,中断处理,实际上操作系统功能远比这个强大,这些只是操作系统一部分的职能。
根据操作系统所包含的具体内容不同,它可以分为狭义操作系统(狭义 OS)和广义操作系统(广义 OS),这也同样适用于车载操作系统,具体如下图所示:
接下来,我们首先来聊聊狭义的操作系统,即内核OS:
狭义的汽车操作系统: 内核的基石
作为底层系统软件,它直接与硬件进行交互,管理系统的基本资源和操作,也是操作系统的根本核心。
内核的主要功能主要包括:
任务调度(Task Scheduling):
负责创建、调度、终止进程,确保多个任务能够并发执行且系统资源得到合理分配。
管理多个任务(进程)的执行,确保每个任务能在合理的时间内运行。
管理系统的内存资源,包括内存分配和回收、虚拟内存管理等。
管理系统内存的分配和回收,确保内存的有效使用,支持虚拟内存机制,提供内存保护和共享功能。
设备驱动(Device Drivers):
提供与硬件设备的接口,负责驱动各种设备如传感器、执行器、显示器等,处理设备的输入和输出操作。
安全和权限管理(Security and Permissions Management):
控制对系统资源的访问权限,确保系统的安全性和稳定性。
那么,它们二者有什么区别呢?
微内核(Microkernel)
概念与特点
基本概念:微内核操作系统的设计思想是将操作系统内核功能最小化,只保留最核心的功能,比如进程管理、内存管理、和基本的IPC(进程间通信)。 模块化:其他功能(如文件系统、网络协议栈、驱动程序等)运行在用户态,通过消息传递与微内核通信。 安全与稳定性:由于大部分服务在用户态运行,系统的可靠性和安全性得到提高,某个服务崩溃不会导致整个系统崩溃。 灵活性:易于扩展和移植,不同模块可以独立开发和调试。
典型例子
QNX:QNX是一个广泛用于汽车领域的实时操作系统,凭借其微内核架构、高可靠性、安全认证和全面的安全功能,成为嵌入式系统,特别是汽车行业中的首选操作系统。其在内存保护、访问控制、网络安全、更新维护和安全工具方面的优势,确保了系统的整体安全性和稳定性。 但QNX是一款商业操作系统,非开源,使用它需要支付许可费用,生态系统也相对比较局限,这可能对一些预算有限的项目和企业造成很重的负担。
宏内核(Monolithic Kernel)
概念与特点
基本概念:宏内核操作系统将所有核心服务(包括文件系统、设备驱动、网络栈等)集成到单一的内核空间中运行。 性能:由于所有服务在内核空间内运行,系统调用和服务之间的通信开销较低,性能较高。 复杂性:内核空间的代码量较大,复杂性增加,错误和漏洞可能会影响整个系统的稳定性,所以安全性较差。
典型例子
Linux:虽然Linux内核也在不断引入一些微内核的思想,但总体上仍属于宏内核。
Linux操作系统凭借其开源性、广泛的硬件支持、丰富的软件生态系统和强大的网络功能,成为嵌入式系统,尤其是汽车电子系统的热门选择。然而,其实时性能的限制、安全性和稳定性问题、开发复杂性以及资源需求等缺点也需要在项目选择和实施过程中加以考虑。但好在目前针对Linux实时性的问题,也有不少改进的版本,在现有车载操作系统中,发挥越来越重要的作用,广泛用于汽车的信息娱乐系统和高级驾驶辅助系统(ADAS)。
那么,在具体汽车操作系统应用中,微内核和宏内核架构应该如何选择呢?
安全性:微内核架构由于模块化设计,更容易实现高安全性。而宏内核由于所有服务运行在内核态,潜在的安全风险更大。 性能:宏内核通常在性能上占优,适合需要高效处理大量数据的应用。 开发与维护:微内核架构更适合模块化开发,便于维护和更新;宏内核则开发和调试更为复杂,但在单一任务的性能优化上有优势。
在实际应用中,汽车操作系统的选择通常基于具体的使用场景和需求。例如,信息娱乐系统可能更倾向于使用基于Linux的宏内核操作系统,而用于关键安全控制的ECU则可能选择基于QNX的微内核操作系统。
但是,不管是微内核还是宏内核,现有的OS体系都已经比较完整,基本上就那么几个,鉴于之前提到的开发周期,验证,行业认可,生态等问题,也没有必要再重新去开发新的内核,尽管现在汽车市场上充斥着各种自研操作系统的宣传,我不说这些宣传都是假的,但都不是真正内核OS自研,哪天你再看到这样的新闻,心里懂就行了😉!
03
广义的车载系统OS
广义的汽车操作系统: 全面的软件栈
在前面我们聊完了狭义的操作系统,也就是内核OS,但实际上为了支持整个软件系统工作,单有内核是远远不够的,还需要其他系统软件的支持,这就是所谓的广义操作系统。
广义的操作系统指的是控制和管理车载硬件以及软件资源的完整程序系统集合。它不仅包括狭义操作系统的核心内核,还涵盖了硬件抽象层、系统中间件组件、功能软件等,具体示意图如下所示:
组成部分
1. 核心功能(内核):
负责任务调度、内存管理、设备驱动、文件系统管理和安全性控制等基本系统服务,具体见上面广义广义操作系统的描述和介绍。
2. 中间件(Middleware):
随着电子电气(EE)架构逐渐趋于集中化,汽车软件系统中出现了多种操作系统,或不同底层硬件平台并存的局面,这导致上层应用层软件不得不适配底层系统,使得系统复杂性和开发成本的急剧上升。 为了解决这些问题,提高软件的可管理性、移植性、裁剪性和质量,需要定义一套架构(Architecture)、方法学(Methodology)和应用接口(Application Interface)来标准化上层对下层的访问接口,这种解决方案正是中间件,我们最熟悉的Classes Autosar中的RTE正是这种背景下产生的中间件。 中间件通过提供标准的接口、高质量的无缝集成、高效的开发流程以及复杂系统管理的新模型,显著提升了软件开发的效率和质量。汽车行业有众多整车厂和供应商,每家原始设备制造商(OEM)都与不同的供应商合作,每个供应商也不止向一家OEM供货。中间件的存在使得相同产品可以在不同车型上重复使用,或使不同供应商的产品互相兼容,从而大幅减少开发成本。
中间件的任务就是负责各类应用软件模块之间的通信以及对系统资源的调度,提供各种服务,如通信、数据管理等,例如,提供跨ECU的通信和数据管理功能,如CAN总线协议、LIN、MOST、FlexRay等通信协议栈,以及数据抽象层和服务管理,所以通常我们说的中间件大多也就是通信中间件。这部分涉及内容较多,我们后续单独在聊。
3. 应用程序框架(Application Framework):
支持开发和运行各种应用程序的框架,如高级驾驶辅助系统(ADAS),应用程序框架为开发自动驾驶功能软件提供了一个基础平台,它提供了一组预定义的接口、组件和服务,开发者可以基于这些基础组件快速构建复杂的自动驾驶系统。
4. 系统库(Libraries):
提供常用的,可重用的代码模块,实现特定功能,方便开发应用程序。例如,车辆诊断库、传感器数据处理库等。
5. 系统实用程序(Utilities):
各种辅助工具,如故障诊断、系统监控、固件更新和安全工具等。
直白地将,就是中间件和功能软件的自研,本质上还是基于内核OS的上层软件架构的搭建,一方面是为了软硬件解耦,模块化快速开发迭代,另一方面也是为了满足OEM自身所谓的自主性,
高安全性系统:更注重实时性、性能和安全性,可能选择QNX、VxWorks等实时操作系统。
智能座舱系统:更注重信息安全、开放性和可扩展性,可能选择基于Linux或Android的定制操作系统。
写在最后:
芯片系列,解密汽车操作系统基本的内容我们就聊完了,希望能够给朋友们对其带来更多理解。下一篇我们继续深入,来探讨汽车操作系统具体的应用和演变。
END
【点赞】和【在看】= 原创的动力
多谢【点赞】和【在看】