一直以来,汽车ECU的编程语言90%都是C语言编写(大部分是涉及到MCU的控制编程),还有部分C++语言。比如,大多数主流的机器学习框架实际上都是依赖C++。
过去几年时间,通过尽可能少的代码简化任务也催生了大量的新编程语言的应用,然而,特斯拉仍然依赖于最基础的语言:C和C++。
“原因是C和C++可以在几乎任何一种系统上运行,尤其是对于安全关键的嵌入式系统来说,可以帮助工程师优化软件。”这是特斯拉的结论,实际上英伟达也在大量使用C和C++。
不过,考虑到整车系统的复杂性以及越来越多的应用功能开发,不同语言的组合也是趋势。但毋庸置疑的是,核心软件价值仍然在芯片和域控制器这一级别。
近日,有消息称,AUTOSAR(汽车开放系统架构)组织正在考虑保持经典AUTOSAR(基于C++14编程语言)的基础上,寻求为AUTOSAR Adaptive启动Rust编程语言的导入。
按照计划,AUTOSAR决定从2022年4月开始,在功能安全工作组(WG-SAF)内成立一个子小组,制定两份和Rust相关的指南文件,包括在AUTOSAR Adaptive使用Rust的指导文件以及相应的编码指南。
这意味着,对于处于起步期的AUTOSAR Adaptive以及域控制器电子架构、软件定义汽车开发模式来说,有可能会产生深远的影响。
一、
众所周知,Rust是一种多范例、通用的系统编程语言,目标是提高性能和安全性,特别是并发安全。Rust在语法上类似于c++,但可以在不进行垃圾回收的情况下保证内存安全。除了函数式编程等高级特性外,它还提供低内存管理机制。
这种语言在2006年前后出现,此后在Firefox浏览器引擎的开发中进行了一系列改进(通过使用Rust语言重建组件来提高浏览器的速度),也在过去十几年时间获得了包括亚马逊、Facebook、谷歌和微软等软件巨头的支持,也多次被选为“最受欢迎的编程语言”。
Rust在语法上和C++类似 ,但是设计者想要在保证性能的同时提供更好的内存安全。这一点,已经在过去几年成为汽车行业的最大完全风险之一。
有数据显示,当今汽车中使用的代码超过1亿行。在接下来的十年,汽车中使用的代码平均将达到3亿行。随着汽车联网越来越多,黑客也会越来越多地瞄准汽车应用。
此前,静态代码分析安全公司Veracode曾发布一份应用程序分析报告,结果发现比起Javascript和Python等语言,C++的安全漏洞要严重得多。原因之一就是C++不是内存安全的语言,代码库中频频出现内存漏洞,大量的时间被耗费在修补漏洞上。
比如,易受攻击的嵌入式Web服务器是用C++编写的,并通过智能汽车的WiFi网络对外暴露,致使攻击者在访问WiFi网络后可攻击web服务器。
按照谷歌Linux内核安全工程师的说法,C语言是一种高级的汇编程序,但C语言也带来了一些导致安全缺陷和基础设施漏洞。C语言中存在大量的开源漏洞是有原因的。而C语言的使用时间相对其他语言要长,并且拥有最多的编写代码量。
相比较而言,Rust试图从一开始就阻止许多漏洞进入代码。如果有语法错误或其他内存安全漏洞,根本不会编译。这是设计上的内存安全编程,确保没有对无效内存的访问(无论软件如何执行)。
而对于汽车,尤其是智能汽车来说,多核多线程处理是主流。这意味着,运行在多个核上的多线程应用程序可能会导致更多的问题。此前,工程师可以通过使用静态代码分析器来完成bug的定位,解析源代码并报告任何潜在的错误。
在AUTOSAR的C++14语言编程指南中,有这样一句话,“如果本文档的用户使用了并行计算、C++标准库或开发了与安全相关的软件,那么他们有责任为这些应用自己的指导方针。”
依赖于静态代码分析和手工审核,已经是一种“常规”的解决方案,大部分工程师也已经习惯了这种解决方案,而在过去几年时间,C++也成为了高性能编程的首选语言。
这意味着,如果软件是多线程的,并且使用了多核,那么工程师就只能靠自己了,而Adaptive AUTOSAR对于这些问题没有任何指导。
但大多数新的软件系统都是多线程,并运行在多个核上,尤其是多核SoC逐步成为主流搭载平台,而非传统的MCU(MCU本身也处于多核、大算力的趋势发展,控制系统本身也越来越复杂,融合集成度越来越高)。
从这个角度来说,Rust编译器在编译时执行所有检查,因此不会产生任何运行时的开销。性能可与C++相媲美。此外,Rust的目标是零成本的抽象,一旦代码编译完成,就可以确信它能够正常工作。
一些汽车行业人士认为,多核系统是未来的趋势,而Rust正是一种适用于复杂嵌入式软件的优秀编程语言,潜力不可估量。
二、
不过,任何一种语言都存在自己的天然弊端。作为一种适合于系统软件开发的语言,Rust的开发人员也要跨越一些已知的障碍。
比如,Rust保证安全性的代价就是学习门槛很高,对于习惯了脚本语言或者C语言的程序员来说,Rust显得不是那么友善,同时学习成本也很高。比如,Rust还没有一套完善的开发栈可供参考,这也是长期被“吐槽”的地方。
但,Rust的独特优势也已经明确。比如,在过去几年时间,全球已经有不少知名互联网或科技公司都在采用Rust重构技术栈,不过,生态还不是很丰富,有些领域还没有很好的库支撑。
而在汽车行业,尤其是关键安全领域,Rust编程语言可以进行安全关键型软件开发,来改善安全关键型软件质量,这是对现有编程语言的重大改进。
比如,Rust目前只有一个主编译器,这意味着,关键安全系统开发对于严谨性和稳定性的关注被视为Rust的一个主要竞争优势,也是一种比其他语言更容易分析和检查的语言。
目前,全球已经有一些公司在汽车行业应用Rust语言提供相关的开发和培训支持。比如,Ferrous Systems是一家德国的公司,主要服务就是验证Rust语言和编译器在安全关键领域的使用。要知道,在汽车行业,目前还没有安全认证的Rust工具链。
按照计划,该公司的第一个目标是ISO 26262/ASIL-B认证,并在2022年底正式对外,为关键任务和高安全性环境中的开发人员提供了一个健全的、经过验证的、可寻址的基础架构和验证工具,以构建关键库、分析工具和进一步的系统保证。
在今年初,AdaCore(软件开发和验证工具提供商)宣布与Ferrous Systems建立战略合作伙伴关系,进一步开发后者的Rust开发工具链,以支持嵌入式任务和安全关键应用,并使其符合相关行业软件安全标准。
而AdaCore同样也是类似英伟达这样的全球芯片巨头的合作伙伴,前者的工具链可以在在软件生命周期的早期检测代码缺陷,并通过集成到英伟达的芯片,来最大限度地降低软件发生故障或者恶意漏洞攻击的可能性。
“自动驾驶很复杂,需要软件的复杂程度超过了目前最严格的标准。”在英伟达软件安全副总裁Daniel Rohrer看来,软件必须与硬件具有一样的功能安全标准,并经过同样严格的安全评估。
实际上,以目前车载座舱操作系统的主流安卓平台为例,过去主要是基于C和C++开发,但内存安全漏洞成为最难以解决的错误代码来源,占到了约70%的高严重安全漏洞比例。
在谷歌看来,Rust有几个关键特性,比如内存安全性、数据并发性、默认情况下不可变的引用和变量、更安全的整数处理、标准库中更好的错误处理等等特点。
去年,谷歌首次表示,一直在为安卓开源项目增加对Rust的支持。但是在Android平台上添加一种新的语言是一项巨大的任务。一些工具链和依赖关系需要维护,测试基础设施和工具必须更新,开发人员需要接受培训。
谷歌的策略,就是从一部分新的代码开发入手。
比如,安卓最新的蓝牙软件栈重写代码名为“Gabeldorsche”,就是用Rust编写。Keystore 2.0模块(存放开发者信息、私钥、公钥的容器)也是用Rust编写。一些行业人士表示,使用Rust写安卓库也是一个重要方向,之前大多数都是基于C/C++。
此外,丰田此前公布的汽车级开发平台OS—Arene,其中的API就是用Rust编写的,是一个预编译的C/C++库(目前是为x86和arm构建的)。它被部署在一个ECU上可以读取、编写和验证丰田官方CAN信息,并将在未来扩展到支持更多车型。
而作为实时操作系统的供应商,风河公司开发的VxWorks,同样支持Rust编程语言,并允许构建和部署多线程的Rust应用程序,作为实时进程运行。
同样,作为汽车芯片IP核的主流供应商,Arm在去年底宣布加入Rust基金会,被视为对这种编程语言未来大范围应用的巨大推动,同时加入的还有丰田汽车。这个基金会由亚马逊、谷歌、华为、微软和Mozilla建立。
这意味着,Rust编程语言已经进入快速发展周期。高工智能汽车研究院监测数据显示,目前国际一线汽车零部件供应商已经开始在大量招聘同时具备Rust和C/C++开发能力的软件工程师。