崔浩评论|孙书娟众所周知,HarmonyOS拥有分布式软总线、分布式数据管理和分布式安全三大核心能力。实现各种设备间硬件互助和资源共享的关键技术。同时实现了分布式软总线、分布式设备虚拟化、分布式数据管理、分布式任务调度等功能。被这些眼花缭乱的功能包围着,我们往往忽略了HarmonyOS的内核技术。HarmonyOS采用多核设计,支持为不同资源受限的设备选择合适的OS内核。由于HarmonyOS需要适配不同的硬件资源,内核需要灵活、可扩展、可靠、可移植,还需要支持分布式系统。因此,微内核的应用成为了HarmonyOS的核心。首选。今天,我就带大家了解一下微内核及其在鸿蒙OS中的应用。1、鸿蒙OS的技术架构与其他操作系统类似。鸿蒙OS整体遵循分层设计,如图1所示,从下到上依次为内核层、系统服务层、框架层、应用层。系统功能按照“系统>子系统>功能/模块”逐步扩展。在多设备部署场景下,一些非必须的子系统或功能/模块支持根据实际需求进行裁剪。图1鸿蒙OS的技术架构如图1所示,我们可以看到鸿蒙OS的整体架构,但是在本文中我们需要重点关注内核层的架构。内核层由内核子系统和驱动子系统组成。内核子系统:鸿蒙OS采用多内核设计,支持为不同资源受限的设备选择合适的OS内核。内核抽象层(KAL)通过屏蔽多核差异向上层提供基本的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理、外设管理等。驱动子系统:硬件驱动框架(HDF)是鸿蒙OS开放硬件生态的基础,提供统一的外设接入能力、驱动开发和管理框架。内核子系统中包含LiteOS的内核就是今天的主角,也就是我们要说的微内核。为什么鸿蒙OS在有LinuxKernel的情况下还要引入LiteOS微内核技术作为补充?接下来,让我们走进微内核的世界。2.宏内核和微内核在介绍微内核之前,有必要了解一下什么是内核。我们都知道一台电脑是由很多硬件组成的,包括:CPU、内存、磁盘、网卡、显示器、键盘、鼠标等等。为了能够管理和组织这些硬件资源,我们创建了操作系统,而内核是操作系统的核心部分。就像我们常用的Windows操作系统、Unix和Linux操作系统一样,它们都有内核。目前市场上绝大多数操作系统都是宏内核,典型代表是Linux。宏内核中的“宏”二字,表示将内核服务作为一个整体,所有服务“触手可及”。也就是说,控制计算机的各个模块都集中在内核中,便于管理。如下图2所示,CPU调度、文件系统、内存管理、应用程序管理调度、中断处理、设备驱动都放在了内核中。如果应用程序需要申请内存,内核直接使用“内存管理”为应用程序分配内存,使用“应用程序管理进程调度”为应用程序分配进程,无需额外消耗。图2Macrokernelmacrokernel的做事方式就像一家公司将所有职能部门拉到一个办公室。这个办公室有很多张办公桌,每个办公桌上都有各个职能部门的文员。操作系统必须处理什么?一切都是通过宏内核这个大办公室来解决的,所以解决问题效率很高。但问题也很明显。随着系统的不断发展,内核中会加入各种模块,就好像一个大办公室需要更多的桌子来容纳更多的人。内核中越来越多的模块需要更高的硬件资源来支持。同时,模块的增加也增加了系统的复杂度,增加了系统崩溃的风险。比如内核中某个模块挂掉了,就会导致整个内核Crash。为了解决宏内核所面临的问题,引入了微内核的概念,它是内核的简化形式。它将与宏内核集成的系统服务分离出来,使这些服务模块按需加载,即使这些服务成为可选的而不是强制的,如果需要的话,将这些服务作为内核的扩展。如果需要升级系统内核,只需要用新模块替换旧模块,或者在原有服务的基础上扩展新服务即可。这样就无需更改整个操作系统的内核。图3宏内核和微内核对比如图3所示,微内核和宏内核的区别在蓝色部分,微内核将宏内核蓝色部分的系统服务拆解,留下一些重要的服务在内核,例如:进程间通信、虚拟内存、进程调度等。但是,其他服务是放在内核之外的,这些服务直接运行在用户态。内核态的一些核心服务会与这些剥离出来的服务进行交互,以保证进程间的通信。同时,这些用户态服务将直接服务于应用程序。如果将图3简化,可以得到图4。如图4所示,在宏内核时代,所有的服务都在内核中,内核中的服务为应用程序提供服务。在微内核时代,一些服务从内核中移到了外部,这些被移出的服务在内核中仍然与核心服务保持着联系,同时为应用程序服务。微内核结构使用水平层代替传统的垂直层。微内核之外的所有操作系统组件都实现为服务进程,它们可以通过微内核传递消息来相互通信。因此,微内核还可以对消息进行鉴权,授权访问硬件,微内核还具有保护功能,阻断非法信息等。例如,如果一个应用程序要打开一个文件,它会向文件系统服务发送一个消息,如果它要创建进程或线程,它会向进程服务进程发送消息。每个服务进程都可以相互通信,调用微内核中的函数。图4宏内核和微内核示意图根据图4的运行,微内核包含的服务数量会减少,实现这些服务的代码量也会大大减少。微内核尽可能地简化内核,将更多的用户服务程序放在内核之外。内核只放置最核心和最常用的程序代码。如果我们还是用办公室来类比,微内核把大办公室缩小了,把一些办公桌搬到了办公室外面,在大办公室外面设置了多个小办公室来容纳这些办公桌。只有重要的核心服务放在大办公室,管理和协调小办公室的工作。鸿蒙OS在发布会上强调了多项特性,强调鸿蒙OS作为操作系统的突破和优势。事实上,使用微内核后,鸿蒙OS具备以下四大能力:该架构可以实现跨终端的能力互助共享。低延迟和高性能IPC带来流畅的用户体验。基于微内核技术的可信执行环境通过形式化方法提升内核安全性,全面提升全场景终端设备的安全能力。鸿蒙OS可以支持开发者实现一次性开发,多端部署,最终实现跨端生态共享。3、微内核的优点上面我们介绍了什么是微内核以及宏内核和微内核的区别。让我们来看看微内核的优点。提供一致的接口:进程不需要区分内核服务和用户服务,全部传递消息;可扩展性:当需要增加新的服务时,只需要增加新的服务进程,不需要修改内核;灵活性:服务流程可定制,例如分布式系统需要增加安全相关的服务流程;可移植性:大部分处理器相关的代码都在微内核中,如果需要移植到其他处理器只需要修改少量代码;可靠性:可以对足够小的微内核进行充分测试,以提供更稳定的代码。仅提供少量API和交互方法,减少组件间的交互;分布式系统支持:如果客户端向服务进程发送消息,该消息包含所请求服务的标识符。在配置为所有进程和服务都具有唯一标识符的分布式系统中,微内核将为这些标识符提供单独的系统映像,使进程消息传输透明;适用于面向对象设计:微内核设计与运行系统模块化的开发可以依赖面向对象的原理。例如,一种方式是构造组件,组件通过构建接口进行交互,它们可以通过构建块来构建软件。4、LiteOS的内核模块前面提到鸿蒙OS采用微内核来提高操作系统的灵活性、可扩展性、可靠性和可移植性,为分布式系统的设计提供支持。接下来,我们来看看LiteOS内核是如何实现微内核的。在文章的第一部分提到了LiteOS是在鸿蒙OS的内核子系统中实现的。LiteOS是华为面向物联网开发的基于实时内核的轻量级操作系统。支持任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件,更好的支持低功??耗场景,支持tickless机制,支持定时器对齐。这里先说说LiteOS的四大核心模块。任务管理任务是竞争系统资源的最小操作单元。LiteOS支持多任务运行。一个任务代表一个线程,任务之间可以进行切换和通信。LiteOS的任务管理模块提供了创建、删除、延迟、暂停和恢复任务、改变任务优先级、锁定和解锁任务调度、根据任务控制块查询任务ID、根据ID查询任务控制块信息等功能.LiteOS使用抢占式调度内核。高优先级的任务可以打断低优先级的任务,相同优先级的任务会按循环时间片进行调度。同时,每个任务都包含一个任务控制块(TCB),其中包含任务的所有状态和运行信息。T具体包括:上下文栈指针(stackpointer)、任务状态(包括就绪、运行、阻塞、退出4种状态)、任务栈大小(任务中保存的局部变量、寄存器、函数参数、函数返回地址等)栈)、任务优先级、任务ID、任务名称等信息。任务服务初始化时,会先申请TCB需要的内存空间。任务初始化完成后,系统初始化TCB内容。当用户创建任务时,系统会初始化任务堆栈并预设上下文。另外,系统还会将“任务入口函数”的地址放在相应的位置。内存管理LiteOS的内存管理模块对系统的内存资源进行管理,主要包括内存的初始化、分配和释放。其目的是管理用户和操作系统对内存的使用,优化内存的利用率和效率,最大程度地解决系统的内存碎片问题。LiteOS的内存管理分为动态内存管理和静态内存管理。动态内存管理在动态内存池中分配用户指定大小的内存块。优点:按需分发。缺点:碎片化是可能的。静态内存管理在静态内存池中分配用户固定(预设配置)大小的内存块。优点:分配和释放效率高,无碎片。缺点:不能按需申请。中断管理在LiteOS中,用户可以申请中断,注册中断处理程序,指定CPU响应中断请求时要执行的具体操作。避免了CPU花费大量时间等待和查询外设的状态,从而大大提高系统的实时性和执行效率。根据硬件,中断可以分为三类:设备、中断控制器和CPU本身。Device:中断源。当设备需要请求CPU时,产生一个中断信号,连接到中断控制器。中断控制器:中断控制器是CPU的众多外设之一。它一方面接收其他外设中断引脚的输入,另一方面向CPU发送中断信号。可以通过对中断控制器的编程来设置中断源的优先级、触发方式、打开和关闭源等。CPU:CPU会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。信号量管理信号量(Semaphore)是一种任务间通信的机制,可用于任务间的同步或对关键资源的互斥访问。如图5所示,信号量可以由任务线程获取,不同的信号量由信号量索引号唯一确定,每个信号量有一个计数值和一个任务队列。通常信号量的计数值代表有效资源数,即剩余可占用的互斥资源数。当任务申请(Pend)信号量时,如果申请成功,信号量的计数值会递减。如果应用程序失败,它将被挂起在信号量的等待任务队列中。一旦一个任务释放了信号量,它就会等待任务队列中的任务被唤醒,开始执行。图5信号量操作示意图信号量的用法在上面已经说过了。因为是资源使用的计数器,所以信号量经常出现在以下两种场景。任务互斥:当多个任务同时访问一个临界资源时,会为这个资源维护一个信号量,初始值为1。当有任务线程访问时,这个值会减1。此时,如果其他任务线程也访问这个资源,会先检查信号量,如果小于等于0则等待。当上一个任务线程访问时,释放资源时信号量加1,其他任务线程此时可以访问该资源。资源计数:生产者和消费者的场景可以通过增加或减少信号量来指示资源的状态。5.总结本文从鸿蒙OS的架构特点入手,发现内核子系统采用了LiteOS的微内核架构,由此引出微内核在鸿蒙架构中的特殊作用。为了解释什么是微内核,我们先从操作系统内核说起,然后再介绍集成所有服务的通用宏内核。为了提高灵活性、可扩展性、可靠性和可移植性,微内核将一些非核心服务从内核中剥离出来,只在内核中留下一些核心服务,以减少内核的容量,降低出错的风险。最后回到最开始介绍的LiteOS,介绍它的四个核心模块,包括:任务管理、内存管理、中断管理和信号管理。作者介绍崔浩,社区编辑,资深架构师。他拥有18年的软件开发和架构经验,以及10年的分布式架构经验。他曾经是惠普的技术专家。乐于分享,撰写了多篇阅读量超过60万的热门技术文章。《分布式架构原理与实践》作者。
