随着 ICT 技术的发展,单 SOC 算力可以承担更多业务,网络带宽拓展及低时延、区分服务等特性使得业务部署、功能分配更加灵活,比如 : 感知、融合、规划、控制、执行可分离解耦,汽车业务功能可分可合、可软件定义。电子电气架构从分布式架构到域集中式架构,再到中央集中式架构转变,分散的 ECU功能集成到域控制器甚至车载中央计算机,这就是多域融合。 汽车电子底层硬件不再是由单一芯片提供简单的逻辑计算,而是需要复杂的多核 SoC 芯片提供更为复杂控制逻辑以及强大的算力支持。但是多域业务具有不同的技术需求,比如座舱域 IVI 业务强调交互体验、应用生态丰富,比较适合的操作系统是 Android;仪表盘、辅助驾驶有实时性、可靠性要求,操作系统倾向于 RTLinux、RTOS;智驾域强调大算力融合感知、推演规划,也有实时性、可靠性要求,也会选择 RTLinux、RTOS。在域融合的同时,要保证关键业务的安全可靠,也要考虑应用生态的可持续性兼容,这就需要有资源隔离技术来支撑在同一 SOC 上切分资源,可并发运行多种操作系统,保障互不干扰。 资源隔离技术有多种,从硬件底层逐层向上包括硬件隔离、虚拟化隔离、容器隔离、进程隔离等。硬件隔离的隔离性最好,单隔离域的性能、安全可靠性最好,但灵活性、可配置性差,不能实现硬件共享,导致整个系统的资源利用率差,不能充分达到软件定义汽车的目标。容器隔离、进程隔离可以更轻量级地实现业务隔离,但还是在同一个操作系统内,存在着资源干扰、相互安全攻击的隐患,并且无法支持异构操作系统业务域融合,影响传统业务继承,不利于生态发展。在众多的资源隔离技术中,虚拟化是安全可靠、弹性灵活的优选方案,是软件定义汽车的重要支撑技术。典型应用场景如图 1 所示: 图1 虚拟化典型应用场景 01 技术形态 Hypervisor 直译即 “超级监督者” ,也称为虚拟机监控程序(VMM)。如图 2 所示,Hypervisor处于 SoC 硬件平台之上,将实体资源(如 CPU、内存、存储空间、网络适配器、外设等 ) 转换为虚拟资源,按需分配给每个虚拟机,允许它们独立地访问已授权的虚拟资源。Hypervisor 实现了硬件资源的整合和隔离,使应用程序既能共享 CPU 等物理硬件,也能依托不同的内核环境和驱动运行,从而满足汽车领域多元化应用场景需求。 图2 虚拟化在系统中的位置 在汽车领域,Hypervisior 主要完成以下任务: CPU 虚拟化:为虚拟机提供 VCPU 资源和运行环境; 内存虚拟化:负责为其自身和虚拟机分配和管理硬件内存资源; 中断虚拟化:发生中断和异常时,按需将中断和异常路由到虚拟机进行处理; 虚拟机设备模拟:根据需求创建虚拟机可以访问的虚拟硬件组件; 硬件支持 BSP:提供 Hypervisor 在 SoC 上运行的板级支持包,如串口驱动; 虚拟机资源配置:对虚拟机的 CPU,内存,IO 外设等资源进行配置和管理; 虚拟机通信:为虚拟机提供 IPC,共享内存等通信机制。 虚拟机调度:为虚拟机提供优先级和时间片等调度算法; 虚拟机生命周期管理:创建,启动和停止虚拟机; 虚拟机调测服务:提供控制台,日志等调试功能; 在汽车领域,Hypervisior 还面临如下挑战: 轻量高效。Hypervisor 在带来软件定义的灵活性的同时,也导致了软件栈层次增加,不可避免会有性能损耗。汽车领域的成本敏感特性,注定了降低 CPU、存储、网络、GPU 等外设性能损耗的需求贯穿整车项目始终,因此 Hypervisor 的轻量和高效十分重要; 安全可靠。相较于互联网领域看重的资源动态分配和闲置利用,汽车领域更看重 Hypervisor 的实时性、可靠性、安全性; 便捷适配。在汽车领域,芯片类型和操作系统丰富多样,嵌入式虚拟化的一大特点就是异构,Hypervisor 必须具备快速适配不同的底层硬件和上层操作系统的能力。 02 技术发展趋势 2.1 云边端虚拟化关键技术差异化 虚拟化技术最早可以追溯到 20 世纪 60 年代,IBM 开发了虚拟机监视器软件,将计算机硬件虚拟分割成一个或多个虚拟机,可支持多名用户对大型计算机的同时、交互的访问。随着 21 世纪通用服务器算力的提升,云计算蓬勃发展,作为底层支撑技术的云虚拟化也快速迭代演进。后来算力从云、边、端逐步下沉,也就伴随着出现了边缘虚拟化、端侧嵌入式虚拟化。它们的典型架构、关键技术需求如图 3 所示。 图3 云边端虚拟化典型架构及关键技术需求 (1) 云侧虚拟化 其特点是硬件平台基本同构,大量节点构成集群,架构设计以吞吐能力优先,要支持多业务并发,虚拟化要满足集群负载均衡、节能降耗的资源调度策略,在进行跨节点虚拟机调配过程中,要保证业务无中断迁移。虚拟机故障时,要能保证从检查点恢复,减少业务损失,虚拟机要能支持 CPU 算力、内存、存储空间、网络、GPU、外设等能力的弹性扩展,还要能超分配,以便提升数据中心的运营收益。 (2) 边侧虚拟化 是在某些特定业务的边缘节点上,采用通用 ICT 架构,支持多种业务的动态部署,典型如 SDN、NFV。其技术特点是:基于通用硬件平台、行业定制的管理部署平台,实现软硬解耦、软件定义,多功能节点按需部署、弹性组网,一般会采用 1+1 或者 N+1 冗余方式保证业务高可用,在 5G 电信网元中需要考虑 5G 业务端到端实时性,Hypervisor、虚拟机、通信协议栈都需要设计考虑。 (3) 端侧虚拟化 端侧典型特点是异构,其芯片架构、处理能力都差异较大。一般是单芯片方案,不存在着集群、主备间的虚拟机迁移,因此比较强调高安全、单节点高可靠,比如会有功能安全 ASIL 等级要求,同时对于实时性、确定性有更强的要求。另外,端侧资源更加有限、成本更敏感,因此要求 Hypervisor 轻量化、高性能。 2.2 虚拟化模型趋势 Hypervisor 可以划分为两大类,一类是 Type1 裸机型,Hypervisor 直接运行在硬件设备上的,也叫做 Bare-Metal Hardware Virtualization(裸机虚拟化环境);一类是 Type2 主机托管型,也叫做 Hosted Virtualization (主机虚拟化环境)。图 4 展示了两种 Hypervisor 的分层架构。 图4 Type1和Typer2型Hypervisor Type2 型 Hypervisor 需要借助宿主操作系统来管理 CPU、内存、网络等资源,由于 Hypervisor 和硬件之间存在一个宿主操作系统,Hypervisor 及 VM 的所有操作都要经过宿主操作系统,所以就不可避免地会存在延迟、性能损耗,同时宿主操作系统的安全缺陷及稳定性问题都会影响到运行在之上的 VM(虚拟机),所以 , Type-2 型 Hypervisor 主要用于对性能和安全要求不高的场合,比如 : 个人 PC 系统。 Type1 型的 Hypervisor 不依赖主机操作系统,其自身具备操作系统的基础功能。设计上更简洁,直接运行于硬件之上,整体代码量和架构更为精简,对内存和存储资源要求更少,可满足自动驾驶车控系统功能安全等级要求,也具备进行形式化验证的条件。所以汽车操作系统更适合使用 Type 1 型 Hypervisor。 随着微内核操作系统技术的发展,很多基于微内核操作系统设计的 Hypervisor 依赖的 Host OS 已经非常精简,只包括基本的、不变的功能,如 : CPU 调度和内存管理,设备驱动和其他可变组件处于内核之外,这类 Hypervisor 应当归于 Type1、还是 Type2,业内存在分歧。总体来说,微内核 Hypervisor 更小、更稳定、扩展性更好,更适合用于嵌入式虚拟化场合。 2.3 Hypervisor 与虚拟机协作技术路线 (1) 全虚拟化 最初的虚拟化是通过软件模拟具有完整硬件系统功能的、运行在一个隔离环境中的计算机系统,即通过软件虚拟硬件设备提供给 GuestOS 使用,优点是 GuestOS 不感知外部真实硬件环境、不用改动。由于 Guest OS 中每次访问全虚拟化硬件都要陷入到 Hypervisor 中,直接导致该方式虚拟的硬件性能较差,一般只用来模拟如串口等比较简单的硬件。对硬件的模拟可以在 Hypervisor 中直接模拟,也可以将请求传递到其他 VM 中进行模拟,如在某一 VM 中通过 QEMU 进行模拟。 (2) 硬件辅助虚拟化 Intel 最早提出硬件辅助虚拟化技术,由硬件直接提供共享功能,支持多 GuestOS 的访问,减少软件虚拟技术带来的延时和性能损耗。Intel 提出了分别针对处理器 & 内存、IO、网络的 Intel VT-x、Intel VT-d 和 Intel VT-c 技术等。随着 ARM 算力提升,从移动端向边缘、甚至云算力中心发展,ARM 也在不断增强其硬件辅助虚拟化技术,比如 stage 2 页表转换、虚拟异常等。 (3) 半虚拟化 在硬件辅助虚拟化技术不完善、不强大的发展阶段,或者对于某些复杂外设的共享复用,为避免全虚拟化的性能问题,可以采用 GuestOS 与 Hypervisor 协作的半虚拟化技术。这种技术一般应用于 IO 设备虚拟化,采用前后端的方式来实现 IO 设备虚拟化,在 Guest OS 中实现前端驱动,在 Hypervisor 或 Host OS 中实现后端驱动,前后端一般按照 VirtIO 标准来实现,后端驱动作为硬件的实际访问方。Guest OS 中前端驱动通过 Virt Queue 等通信机制与后端驱动进行通信,前端驱动将 Guest OS 的请求传递给后端驱动,后端驱动将请求发送给硬件驱动,处理完后将结果再传回给前端驱动。半虚拟化相对全虚拟化实现的硬件性能较好,且可实现相对比较复杂的硬件,比如 : 块设备,网卡,显示设备等。具体如图 5 所示。 图5 半虚拟化Pass-through资源分配 Hypervisor 支持将硬件资源直接分配给其上虚拟机中 Guest OS 使用,无需通过 Hypervisor 进行地址和指令翻译。例如 : 串口资源、USB 资源等接口比较丰富的资源可以通过 Pass-through 直接分配给某虚拟机使用。设备控制器一般都是以 MMIO 方式来访问的,所以只需要将控制器地址区域映射到 VM 就可实现设备控制器的分配,同时还需要分配一个设备硬件中断对应的虚拟中断到该 VM,直接透传的方式就是 VM 独占访问该硬件,所以在性能上是最好的。 03 关键技术解读 3.1 CPU 虚拟化和节能降耗技术 车载高性能处理器一般采用多核 CPU 架构。在 SMP(Symmetric Multi-Processing 对称多处理)架构下,Hypervisor 调度器会根据 CPU 的亲和性配置让客户机操作系统在指定的 CPU 上运行,虚拟机的操作系统可按照自己的调度方式,比如:优先级方式在 CPU 上进行任务调度。为了最大化地利用系统资源,Hypervisor 也支持多个虚拟机对某个 CPU 的共享使用。在共享核上,Hypervisor 可通过优先级或时间分区方式对虚拟机进行调度,确保虚拟机运行时间和调度策略是确定的。Hypervisor 的调度算法需要确保不能够出现分区内某个虚拟机出现死循环或故障而长期占用处理器资源,导致其他虚拟机的业务无法得到合理时间配额的问题。 虚拟机调度还需要考虑节能降耗问题,在工作负载较高的情况下系统提升主频提升用户体验,在工作负载较低的情况下系统自动节能降频提升续航。车载高性能处理器本身为了节能降耗需求设计为大小核架构,CPU 以及之上运行的复杂操作系统需要支持大小核调度,动态调频,低功耗设置,关闭 CPU 核,休眠(Suspend to RAM/Suspend to Disk)等节能降耗功能。系统虚拟化后,CPU 等物理资源都需要Hypervisor 才能直接访问,Hypervisor 调度算法也需要完成对虚拟机节能降耗的支持。 3.2 IO 设备虚拟化 出于性能考虑,一般嵌入式领域多使用半虚拟化技术。半虚拟化技术需要 Guest OS 中的前端驱动与Hypervisor 中的后端驱动配合实现。前端驱动将 Guest OS 的请求通过 Hypervisor 提供的通信机制发送给后端驱动,后端驱动通过调用物理驱动实现对设备的访问。这就涉及到不同厂商的 Guest OS 与不同厂商的 Hypervisor 生态对接问题。 Virtio 是目前最流行的一种 I/O 半虚拟化解决方案。Virtio 是 OASIS 标准组管理的开放协议和接口,以使得虚拟机能够标准化方式访问 IO 设备。Virtio 于 2016 年 3 月正式标准化,2020 发布 V1.1 版本。Virtio 标准采用通用和标准化的抽象模型,支持设备类型不断增加,性能高效,在云计算领域广泛应用,开源活跃度高,Linux 等操作系统已有稳定的前端驱动代码。大部分商业和开源 Hypervisor 都已经支持Virtio 标准。 Virtio 是车载行业比较常用的半虚拟化技术的实现,如图 6 所示,在 Guest OS 内部虚拟一条设备总线 Virtio-bus,通过 Virtio Ring 双向通信机制,前端驱动与挂载在 Virtio-bus 上遵循 Virtio 标准的后端虚拟设备,进行访问与通信。Virtio 提供了全面的 Virtio 总线和设备控制接口,包括 virtio-net, virtio-blk, virtio-console, virtio-input 等。 图6 Virtio虚拟化实现模型 利用 virtio-blk 技术实现块设备共享 块设备是使用缓存机制读写的存储设备,分配给 Hypervisor 所在的操作系统进行管理。virtio-blk driver 是符合 virtio 标准的块设备驱动,vdev virtio block 是后端的虚拟块设备,virtio blk driver 通过该vdev 设备完成对物理块设备的读写,并获取执行结果。 利用 virtio-net 技术实现跨系统通信 Virtio-net 实现了多系统间点对点的通信,Guest 系统内部的 virtio-net driver 通过 virtqueue 与Hypervisor 所在系统的 virtio-net 设备进行全双工通信,实现多系统之间的控制类、配置类的指令、数据的交互。适合音视频流以外的数据传输,稳定性较好,因 virtqueue 的控制逻辑复杂,对实时性有一定影响。 利用 virtio 技术实现触摸共享 触摸设备是字符型设备,通过 virtio-input driver、vdev-input 实现前端驱动和后端设备。设备端通过 virtqueue 向驱动上报触摸坐标数据。 3.3 实时性技术 实时性是嵌入式实时操作系统的关键性能指标。Hypervisor 的实时性是整个系统实时性的基础,如果 Hypervisor 无法及时调度到客户机操作系统运行,客户机操作系统也不能取得较好的实时性指标。衡量 Hypervisor 实时性主要指标包括中断延迟和调度延迟。中断延迟以硬件发生中断时刻为起始时间,以虚拟机收到 Hypervisor 注入的中断时刻为截止时间,在各种压力情况下最长延时时间即为中断延时。调度延迟是指以高优先级的虚拟机进程就绪为起始时刻,以该高优先的虚拟机进程得到调度运行为截止时刻,在系统各种压力情况下最长的延时时间即为调度延迟。 中断虚拟化后,当外界中断产生时,Hypervisor 收到并以最快的速度注入到虚拟机,使得 Hypervisor 对虚拟机中断处理时间足够少。Hypervisor 优化虚拟机的切换时间,尽量减少 Hypervisor 上关中断和关抢占的时间,尽量少使用内核锁,当高优先级的虚拟机需要切换运行时,能最快速度切换至高优先级虚拟机上运行。 3.4 安全和可靠性技术 功能安全、信息安全和可靠性是车控操作系统产品可靠安全运行的必要组成部分。Hypervisor 为智能汽车域控制器提供基础运行环境,其安全性和可靠性是保证整个系统功能安全和可靠的基础和核心。Hypervisor 需按照汽车功能安全 ISO26262 ASIL-D 最高标准进行设计,开发和测试,其功能安全需求由域控制器产品的安全需求分解产生。 Hypervisor 上运行了多个虚拟机,一个虚拟机的异常不能传递至其他虚拟机。Hypervisor 能获取到当前系统整体健康状态,当虚拟机发生异常时,Hypervisor 应实时监控系统健康状态,有效地隔离故障,并在最小波及范围内修复异常,保障系统持续可用。 Hypervisor 加入汽车软件栈,会导致纵向上软件栈层次增加,横向上业务软件复杂度增加,而汽车的安全可靠要求强于既有的云侧虚拟化、边缘虚拟化,因此虚拟化安全性正日益得到行业的关注。这些安全性包括: 虚拟机管理器和虚拟机之间的信任链问题。利用虚拟化技术在一个可信物理平台上创建出多个虚拟机,并将从硬件可信根开始构建的信任链传递到每一个虚拟机,从而在一个可信物理平台上构建多个虚拟的可信计算平台,有些解决方案缺乏虚拟机管理器到虚拟机之间的信任链验证; 虚拟机间的攻击:恶意入侵者可以通过利用虚拟机管理程序中的漏洞,通过同一物理主机上存在的另一个虚拟机来获得对虚拟机的控制,从而破坏目标虚拟机; 虚拟机逃逸:利用虚拟机软件或者虚拟机中运行的软件的漏洞进行攻击,以达到攻击或控制虚拟机宿主操作系统的目的。 为了提高 Hypervisor 的安全性,建立相应的安全性目标很重要,下表简要列出相关要求: Hypervisor 的安全性能力可以从三个维度进行提升。 (1) 需要建立安全边界 如图 7 所示,这个边界由 Hypervisor 严格定义并且实施。Hypervisor 安全边界的保密性、完整性和可用性需要得到保证。边界能防御一系列攻击,包括侧向通道信息泄漏、拒绝服务和特权提升。虚拟机监控程序安全边界还提供网络流量、虚拟设备、存储、计算资源和所有其他虚拟机资源的隔离能力。 图7 安全边界 整体虚拟化安全架构如图 8 所示。安全边界的保密性可以通过传统的密码学方法来实施。完整性通过可信度量机制来保障,可信报告机制实现不同虚拟环境的可信互通,监控机制动态度量实体的行为,发现和排除非预期的互相干扰。虚拟技术提供的隔离机制将实体运行空间分开。 图8 整体虚拟化安全架构 安全边界的隔离通过Hypervisor的vCPU调度隔离安全、内存隔离、网络隔离和存储隔离技术来支持,实现了同一物理机上 Hypervisor 和虚拟机、虚拟机之间的隔离。 (2) 需要建立深度防御漏洞的缓解机制 对于安全边界存在的潜在漏洞,Hypervisor 需要有一定的技术手段进行主动防御,这些技术手段包括地址空间布局随机化(ASLR)、数据执行保护(DEP)、任意代码保护、控制流保护和数据损坏保护等。 (3) 建立强大的安全保障流程 与 Hypervisor 相关的攻击面包括虚拟网络、虚拟设备和所有跨虚拟机表面,所有虚拟机攻击面都建议实施威胁建模、代码审核、模糊(fuzzed)测试,通过建立自动化构建及环境,触发定期安全检查。 虚拟化技术作为云计算场景的重要技术,在 10 多年的生产实践中已经积累了很多安全范式,这些经验也可被汽车场景借鉴。但是与云场景相比,汽车场景的虚拟化技术也有其特殊性,如虚拟机不需要动态迁移 / 创建,Hypervisor 有功能安全等级的要求等等,其安全性手段需要在实践中不断丰富和完善。 04 典型应用案例 在汽车智能化发展历程中,虚拟化主要应用于智能座舱、智能驾驶、智能网关等融合场景。智能驾驶受技术成熟度、政策法规所限,基本处于预研、方案原型阶段。智能网关业务功能相对同构,并且有可能进一步融合到其他场景方案中。因此,目前主要的应用案例集中在智能座舱中。 智能座舱域融合也是在近几年启动,正在不断迭代演进中。受芯片算力、虚拟化技术成熟度、生态链对于虚拟化解决方案的掌控能力等因素影响,有些厂商同时采用了硬隔离方案来实现域融合,一方面最大程度地沿用既有技术能力,有确定性保障,但是缺少了软件定义的灵活性,智能化程度有限,是域融合的一种可选方案。在嵌入式虚拟化技术方面,国外的 QNX、OpenSynergy、PikeOS 等有先发优势,尤其在汽车领域已耕耘多年,因此在这两年涌现了较多的应用案例。在智能本土化发展的趋势带动下,国内这几年也出现了不少芯片厂商、独立软件厂商研发嵌入式虚拟化技术、产品、解决方案,如中瓴智行的 RAITE Hypervisor(RHOS)、中兴 GoldenOS、斑马智行的 AliOS Hypervisor、中汽创智 CAIC Hypervisor 等。 4.1 智能座舱域控制器产品 某厂家智能座舱域控制器产品,基于高通 8155、瑞萨 R-Car H3 处理器,采用 QNX Hypervisor,搭载 QNX Host、 Android P/R/S Guest OS, 可配置输出最多 6 块高清大屏独立显示,集成了娱乐系统、液晶仪表、车身控制、DMS、APA 等功能,支持独立四音区、多屏互动和音视频分享,集成度高,在长城、长安、宇通客车等多款车型上适配量产。 另外,国产化方案芯驰 X9HP+ 平台,采用硬分区、Hypervisor 两种方案灵活配置实现中低端智能座舱域控制器产品。 4.2 RHOS 智能座舱域控制器平台 (1) NXP I.MX8QM 座舱域控制器 某厂家基于自研的 Type-1 型虚拟化软件 RHOS(Raite Hypervisor OS),适配支持了 NXP I.MX8QM,提供一个轻量、灵活的汽车智能座舱虚拟化解决方案,已在东风车型量产上市。其系统架构如图 11所示: 图11 NXP I.MX8智能座舱系统架构 在 SoC 上运行 Hypervisor 后可支持同时运行多个操作系统,比如 Linux 系统可以运行实时性和安全性较高的业务,如全液晶仪表等,可以扩展运行 DMS、HUD 等业务。另外一个虚拟机运行 Android 操作系统,上面部署信息娱乐等安全性和实时性要求较低的业务。为保证系统具备良好的市场竞争力,域控制器兼容 TBOX 功能需求,系统能够支持休眠唤醒和快速启动。 Linux 和 Android 虚拟机可按需进行资源的配置,包括内存、CPU、存储空间、外设等。该架构支持系统升级,包括对虚拟机和 Hypervisor 的升级,支持异常日志记录,包括虚拟机内核和 Hypervisor 日志。 多屏交互是智能座舱重要的应用场景,Android 的 APP 应用程序可以通过 Hypervisor 推送到 Linux仪表进行显示。 图12 虚拟机多屏交互架构 Android 和 Linux 仪表交互的方案如图 12 所示。NXP I.MX8QM 芯片有两个以上显示接口,每个显示接口可以接 2 个显示屏,当 Android 系统需要投射信息到仪表屏幕时,仪表显示屏的 Overlay 图层可以进行投屏内容的显示。系统交互零延迟、零拷贝,多系统交互不额外占用 CPU 和 GPU 资源。通过Hypervisor 虚拟化技术实现跨系统多屏交互,有效提高了行车安全性,并降低智能座舱的硬件成本。 (2) MT8675 座舱域控制器 RHOS 通过适配支持MT8675,形成一个功能丰富、性价比高的一机多屏智能座舱域控制器解决方案,已获得多个车厂量产项目。其总体系统架构如图 13 所示: 图13 MT8675智能座舱系统架构 MT8675 只提供了一个 GPU,座舱域需要在仪表和中控上共享使用 GPU 资源。RHOS 实现了 GPU虚拟化共享,并通过性能优化,达到业界领先的虚拟化效果(损耗)。
在现代电池应用的广阔领域中,电池管理系统(Battery Management System,简称 BMS)发挥着至关重要的作用。从电动汽车到便携式电子设备,从大规模储能电站到各类工业应用,BMS 的身影无处不在,它全方位地呵护着电池的健康,确保电池系统高效、安全且稳定地运行。下面,我们将深入剖析电池管理系统的各个方面。 一、BMS 的定义 电池管理系统是一种用于监控、管理和保护电池系统的电子装置。它通过实时采集电池的各项参数,如电压、电流、温度等,并依据这些参数进行精确的分析和计算,进而对电池系统实施有效的控制和管理。其核心目标在于确保电池在各种复杂的工作条件下,始终处于最佳的工作状态,最大限度地发挥电池的性能优势,同时有效延长电池的使用寿命,保障电池使用过程中的安全性。简单来说,BMS 就是电池系统的 “智慧大脑”,负责协调电池系统内各个部分的工作,使其发挥出最佳效能。 二、BMS 的功能 (一)电池状态监测 电压监测:精确监测电池组中每一个单体电池的电压,以及整个电池组的总电压。通过对电压的实时监测,BMS 能够判断电池的充电状态(SOC)、健康状态(SOH)等关键信息。例如,当单体电池电压过高或过低时,可能意味着电池存在过充、过放或其他故障问题,BMS 会及时发出警报并采取相应措施。 电流监测:准确测量电池充放电过程中的电流大小和方向。电流数据对于计算电池的充放电量、评估电池的功率输出能力以及监测电池的工作状态至关重要。通过监测电流,BMS 可以实时掌握电池的能量流动情况,防止过大的充放电电流对电池造成损害。 温度监测:实时监测电池的温度分布,由于电池在充放电过程中会产生热量,温度过高或过低都会对电池的性能和寿命产生严重影响。BMS 通过在电池组中布置多个温度传感器,精确感知各个部位的温度变化,一旦发现温度异常,便会启动散热或加热装置,将电池温度控制在适宜的范围内。 (二)电池保护 过充保护:当电池充电达到满电状态时,BMS 会及时切断充电电路,防止电池过充。过充可能导致电池内部压力升高、电解液分解、甚至引发起火爆炸等严重安全事故。BMS 通过监测电池电压和充电电流等参数,精确判断电池的充电状态,一旦检测到过充迹象,立即采取保护措施,确保电池安全。 过放保护:在电池放电过程中,BMS 会实时监测电池电压,当电压降至设定的最低保护值时,BMS 会自动切断放电电路,避免电池过度放电。过度放电会导致电池容量永久性损失,缩短电池使用寿命,BMS 的过放保护功能能够有效防止这种情况发生。 过流保护:当电池充放电电流超过允许的最大值时,BMS 会迅速切断电路,以防止过大的电流对电池造成热失控、电极材料损坏等问题。过流保护功能能够在瞬间响应,保护电池免受异常电流的冲击。 过热保护:如前文所述,电池温度过高会严重影响其性能和安全性。当 BMS 监测到电池温度超过安全阈值时,会立即启动散热风扇、水冷系统等散热装置,或者降低充放电电流,减少电池产热,确保电池温度在安全范围内。 (三)电池均衡管理 在电池组中,由于单体电池在制造工艺、材料特性等方面存在细微差异,长时间使用后,各单体电池之间会出现容量、电压等不一致的情况,即所谓的 “不均衡” 现象。这种不均衡会导致部分电池过度充放电,从而加速整个电池组的老化和性能衰退。BMS 的均衡管理功能旨在通过主动或被动的方式,使电池组中各个单体电池的电量保持一致,提高电池组的整体性能和使用寿命。 主动均衡:主动均衡是指通过能量转移的方式,将电量较高的单体电池中的能量转移到电量较低的单体电池中,使各单体电池的电量趋于一致。常见的主动均衡方法包括电容均衡、电感均衡和 DC - DC 变换器均衡等。主动均衡能够快速、有效地实现电池均衡,尤其适用于对电池性能要求较高的应用场景。 被动均衡:被动均衡则是通过在单体电池上并联电阻等耗能元件,当某个单体电池电压高于其他电池时,通过电阻将多余的能量以发热的形式消耗掉,从而实现电池均衡。被动均衡方法简单、成本较低,但存在能量浪费的问题,均衡速度相对较慢。 (四)电池状态估计 剩余电量(SOC)估计:准确估计电池的剩余电量对于用户合理使用电池设备至关重要。BMS 通过多种算法,如安时积分法、开路电压法、卡尔曼滤波法等,综合考虑电池的电压、电流、温度等参数,对电池的剩余电量进行精确估算。SOC 估计的准确性直接影响用户对设备续航能力的判断,BMS 会不断优化算法,提高 SOC 估计的精度。 健康状态(SOH)估计:SOH 反映了电池的老化程度和性能衰退情况。BMS 通过监测电池的内阻变化、容量衰减等指标,结合数学模型和算法,对电池的 SOH 进行评估。准确的 SOH 估计有助于用户及时了解电池的健康状况,提前做好电池更换或维护计划,避免因电池故障导致设备无法正常使用。 三、BMS 的组成部分 (一)硬件部分 主控单元(MCU):作为 BMS 的核心处理器,主控单元负责接收来自各个传感器的数据,进行数据处理和分析,并根据预设的算法和策略,发出相应的控制指令。它具备强大的运算能力和数据处理速度,能够快速响应电池系统的各种变化,确保 BMS 的高效运行。 电压采样电路:用于采集电池单体和电池组的电压信号。电压采样电路需要具备高精度、高可靠性和良好的抗干扰能力,以确保采集到的电压数据准确无误。通常采用专用的电压采样芯片或模块,通过分压、滤波等处理后,将电压信号传输给主控单元。 电流采样电路:负责测量电池充放电电流。电流采样电路一般采用霍尔电流传感器、分流器等元件,将电流信号转换为电压信号,经过放大、滤波等处理后,输入到主控单元进行分析和计算。准确的电流测量对于电池状态监测和保护功能的实现至关重要。 温度采样电路:通过温度传感器(如热敏电阻、热电偶等)采集电池的温度信息。温度采样电路将温度传感器输出的信号进行调理和转换,使其符合主控单元的输入要求。由于电池组不同部位的温度可能存在差异,通常需要在多个关键位置布置温度传感器,以全面监测电池的温度分布。 通信接口电路:BMS 需要与外部设备(如整车控制器、充电设备、上位机等)进行数据通信,以实现信息交互和协同控制。常见的通信接口包括 CAN 总线、LIN 总线、RS485 等。通信接口电路负责将主控单元的数据进行编码和转换,通过相应的通信协议与外部设备进行数据传输。 保护电路:包括过压保护、过流保护、欠压保护等电路,用于保护 BMS 硬件本身以及电池系统免受异常电压、电流的损害。当检测到异常情况时,保护电路会迅速动作,切断相关电路,防止硬件损坏和安全事故发生。 (二)软件部分 数据采集与处理程序:负责控制硬件电路实时采集电池的电压、电流、温度等数据,并对采集到的数据进行滤波、校准、存储等处理。数据采集与处理程序需要具备高效、准确的特点,确保数据的可靠性和及时性。 电池状态估计算法:如前文所述,包括 SOC、SOH 等估计算法。这些算法是 BMS 软件的核心部分,通过对采集到的数据进行分析和计算,精确估计电池的状态。算法的优劣直接影响 BMS 的性能和精度,研发人员不断优化和改进算法,以提高电池状态估计的准确性。 保护控制策略程序:根据电池的状态信息,依据预设的保护规则和策略,生成相应的控制指令,实现过充、过放、过流、过热等保护功能。保护控制策略程序需要具备快速响应、可靠性高的特点,确保在异常情况下能够及时有效地保护电池系统。 均衡控制程序:负责实现电池均衡管理功能,根据电池的不均衡情况,控制主动或被动均衡电路的工作,使电池组中各单体电池的电量趋于一致。均衡控制程序需要根据不同的均衡方式和电池特性,采用合适的控制算法,提高均衡效率和效果。 通信协议栈程序:实现与外部设备通信所需的各种通信协议,如 CAN 通信协议、LIN 通信协议等。通信协议栈程序负责数据的打包、解包、发送和接收,确保 BMS 与外部设备之间的数据通信稳定、可靠。 四、BMS 的工作原理 BMS 的工作过程可以简单概括为数据采集、数据分析与处理、控制决策与执行三个主要环节。 数据采集:电压采样电路、电流采样电路和温度采样电路实时采集电池的电压、电流和温度等参数,并将这些模拟信号转换为数字信号,传输给主控单元。 数据分析与处理:主控单元接收到传感器采集的数据后,首先对数据进行滤波处理,去除噪声干扰,然后根据预设的算法和模型,对电池的状态进行分析和计算,如估算 SOC、SOH 等。同时,主控单元还会将当前电池的状态数据与预设的安全阈值进行比较,判断电池是否处于正常工作状态。 控制决策与执行:当主控单元判断电池出现异常情况(如过充、过放、过流、过热等)时,会根据预设的保护控制策略,立即发出相应的控制指令,通过驱动电路控制保护电路动作,切断充放电回路,或者启动散热、均衡等装置,对电池进行保护和管理。在正常工作情况下,BMS 也会根据电池的状态信息,对充电设备或负载进行合理的控制,优化电池的充放电过程,提高电池的使用效率和寿命。 五、BMS 的技术发展趋势 (一)高精度的电池状态估计技术 随着对电池性能要求的不断提高,研发更加精确的电池状态估计技术成为 BMS 的重要发展趋势。未来,BMS 将结合更多的传感器数据和先进的算法,如机器学习、深度学习算法等,对电池的 SOC、SOH 等状态进行更准确的估计,为用户提供更可靠的电池信息。 (二)高效的电池均衡技术 为了进一步提高电池组的性能和寿命,开发更高效、快速且节能的电池均衡技术是关键。新型的主动均衡技术,如基于无线能量传输的均衡技术、多端口 DC - DC 变换器均衡技术等,将逐渐得到应用和推广,以实现电池组中各单体电池的精准均衡。 (三)高可靠性和安全性设计 在电动汽车、储能电站等对安全性要求极高的应用场景中,BMS 的可靠性和安全性至关重要。未来,BMS 将采用冗余设计、故障诊断与容错控制等技术,提高系统的可靠性和安全性,降低电池系统发生故障的风险。同时,加强对电池系统的热管理和安全防护设计,确保在极端情况下电池系统的安全运行。 (四)智能化与网络化发展 随着物联网、大数据、云计算等技术的发展,BMS 将向智能化和网络化方向迈进。通过与互联网连接,BMS 可以实现远程监控、诊断和管理,用户可以随时随地通过手机、电脑等终端设备获取电池的状态信息,并对电池进行远程控制。同时,BMS 还可以将大量的电池运行数据上传至云端,通过大数据分析挖掘潜在的价值,为电池的优化设计、维护管理提供依据。 六、BMS 在不同领域的应用 (一)电动汽车领域 在电动汽车中,BMS 是确保车辆安全、高效运行的核心部件之一。它不仅能够实时监测电池的状态,保护电池免受过度充放电和过热等损害,还能通过优化电池的充放电过程,提高电池的使用效率和续航里程。此外,BMS 还与整车控制器进行通信,协调车辆的动力输出和能量回收等功能,提升电动汽车的整体性能。 (二)储能领域 在储能系统中,无论是电网储能、可再生能源储能还是家庭储能,BMS 都起着至关重要的作用。它能够对储能电池进行有效的管理和保护,确保电池在频繁的充放电循环中保持良好的性能和寿命。同时,BMS 还可以根据电网的需求和储能电池的状态,实现储能系统的优化调度和控制,提高储能系统的经济性和可靠性。 (三)便携式电子设备领域 对于智能手机、平板电脑、笔记本电脑等便携式电子设备,BMS 虽然相对简单,但同样不可或缺。它可以监测电池的状态,提供准确的电量显示,防止电池过充过放,延长电池的使用寿命,为用户提供更好的使用体验。 综上所述,电池管理系统作为电池系统的核心组成部分,在保障电池安全、提高电池性能和延长电池寿命等方面发挥着不可替代的作用。随着新能源技术的不断发展和应用领域的不断拓展,BMS 的技术水平也在不断提升,其功能将更加完善,性能将更加卓越,为推动新能源产业的发展和实现能源的可持续利用提供有力支持。
DeepSeek 现象级突破的技术解码 DeepSeek 无疑是一个具有“国运级”意义的现象级产品。它的技术突破主要体现在三个方面:低成本训练范式革新、国产算力适配突破和场景化模型蒸馏技术。 首先, DeepSeek 采用了极简架构,能够以 3% 到 5% 的行业成本实现模型训练,大幅降低了资源占用。这种低成本训练模式加上开源的方式,极大地降低了模型开发门槛,让众多企业和研究机构能够参与其中。 其次,国产算力适配突破是 DeepSeek 带来的另一个重要影响。此前,国产芯片一直在努力适配国外框架,而 DeepSeek 的出现让国产芯片找到了用武之地。特别是华为的昇腾芯片,与 DeepSeek 的适配性非常好,推动了国内 GPU 厂商的发展。昇腾 910B 等产品与 DeepSeek 深度合作,实现了从硬件到技术链路的全面国产化,加速了国产化进程。如今,许多企业都在咨询如何私有化部署 DeepSeek 模型,这也为国产算力的发展提供了新的机遇。 最后, DeepSeek 不仅推出了 671B 的满血版模型,还通过蒸馏技术开发了多种轻量级版本,32B、18B 和 7B 等。这种从满血版到轻量版的跨越,为企业提供了灵活选择的空间,能够根据不同场景的需求进行适配。例如,企业可以根据自身业务蒸馏出投资版、制造业版、化工行业版或汽车零部件版等专属模型。同时,DeepSeek 在动态部署方面也具有优势,能够在复杂决策场景中使用满血版模型,在高并发交互场景中使用轻量级模型,实现混合式部署。 DeepSeek 爆火背后的“冷思考” 在 DeepSeek 爆火的当下,每个人似乎都在谈论它,仿佛不参与讨论就显得自己与 IT 圈脱节。朋友圈里每天都在刷屏,某某产品接入了 DeepSeek,仿佛不接入 DeepSeek 的产品都成了“垃圾产品”。而最引人注目的还是股票市场——DeepSeek 概念股的兴起确实带动了整个经济氛围的活跃。与此同时,我也发现,最近很多人在交流中对经济的信心似乎又回来了,这不得不说是一个非常积极的现象。 在 全民 AI 的时代,DeepSeek 如此火爆的背后,我们也需要进行一些“冷思考”。真正的问题是:DeepSeek 到底能用来做什么? 作为技术人,我们尤其需要避免陷入“技术自嗨”的陷阱。如今,很多人都在分享 DeepSeek 背后的技术实现逻辑,但 关键在于我们如何将它真正应用到实际场景中。 在短视频平台上,大家都在宣传如何部署 DeepSeek,搭建个人 AI 知识库。但当你在自己的电脑上搭建起这样一个知识库后,你会发现它的能力其实非常有限。因为电脑本身的性能有限,你最多只能运行 7B 或 8B 的模型,而这些小模型的能力是远远不够的。搭建一个简单的 AI 知识库并不难,但当你的文件数量超过两三千份时,多路召回的效果会变得极差。在文件数量较少时,知识库的效果可能还不错,但要让它真正产生价值、提升生产力,还有很长的路要走。 另一方面,很多新媒体人在宣传所谓的“DeepSeek+”,比如“DeepSeek+ 王炸组合”,声称可以成倍提升功能效率。确实,DeepSeek 在办公效率方面,比如写作(如 Kimi)、图像处理(如剪映、PS)等工具的使用上,确实能带来一些帮助。但对我们技术人来说,更重要的是如何将 DeepSeek 更好地应用到更多实际场景中去,而不仅仅是停留在表面的效率提升。 如何打造差异化竞争优势 在当前 AI 技术快速发展的背景下,无论是个人还是公司,都需要思考如何打造差异化竞争优势。随着 AI 的兴起,作为技术人需要结合自身优势和经验,找准定位。拿我本人来说,有近 20 年的开源经验,同时也有七八年的创业经验,因此我希望将开源与商业化相结合,分享 AI 技术的同时,探讨如何提升决策能力。于是,我将自己的公众号从“Asta 聊工业”改为“AI 进厂的 Asta”,专注于分享 AI 在编程、开源和商业化方面的内容。在内容创作上,我尝试用 AI 辅助写作,提纲和核心内容仍需自己撰写,完后再让 AI 优化,这样既能保持个人写作风格,又能提升效率。 个人工具的全面 AI 化是提升效率的关键。我目前常用的 AI 工具包括以下几种: Cursor:我每天都会用它来编写代码,尤其是前端开发,效率提升显著。 DeepSeek 和 Claude:将两者结合使用,Claude 在长文本创作上更符合我的写作风格,而 DeepSeek 则用于联网搜索技术报告。 Grok 3:其 Deep Search 功能非常强大,我正在不断尝试。 Ideogram:这是一个类似 Midjourney 的文生图工具,生成的图片设计感很强,我经常用它来生成图片。 Napkin:它可以将文档一键生成脑图或 PPT 格式的图表,非常适合快速制作 PPT。 Notion:我用它来收集各种想法和计划,同时也会将 Claude 生成的内容整理到 Notion 中。 即梦 AI:我用它生成海报,效果不错,尤其是中文显示效果很好。 创客贴:主要用于海报设计,其 AI 设计功能非常实用。 Gamma:用于快速生成 PPT,设计简洁且支持导出 PDF 和 PPT 格式。 我从 2009 年开始接触 Go 语言,而 GopherChina 也是从 2015 年开始举办,至今已经十年了。这十年间,Go 社区不断成熟,技术话题也逐渐趋同化。比如,大家讨论的大多是云计算、K8S 容器、微服务、监控等热门领域。这些内容在过去十年里已经被分享得非常充分,社区的成熟也意味着技术发展进入了一个稳定阶段。 随着 AI 时代的到来,技术人不能固步自封,必须勇敢拥抱变革。因此,我决定将 Go 社区全面升级为一个 AI 社区——ThinkIn AI。这个社区目前还处于起步阶段,但已经展现出巨大的潜力。在这个过程中,我们做了以下两件事: 第一,开发了一个 DeepSeek 模型兼容性检测工具。这个工具的灵感来源于朋友的提问:他们的电脑配置能否部署某个型号的 DeepSeek 模型,比如 1.5B、7B 或 8B 等。基于这个需求,我利用业余时间用 React 写了一个网页工具,通过显存和内存的检测,自动判断用户电脑能够部署的最大模型。这个工具开发过程非常高效,仅用了一个晚上的时间,而且完全通过对话式编程完成,我没有手写一行传统代码。推出后,这个工具受到了广泛关注,很多人反馈企业也有类似需求,希望了解服务器配置如何满足不同模型的部署要求。因此,我们又开发了一个企业部署服务器配置计算器。用户可以根据自己的需求选择模型大小(如 70B、671B 或 14B)、量化类型、序列长度、批次大小等参数,工具会计算出所需的显存、CPU 配置、模型参数占用等信息,并推荐适合的硬件配置,包括 GPU、CPU、内存和网络等。同时,我们在工具底部宣传了 ThinkIn AI 社区,目前社区已经吸引了大量用户,14 个群几乎都满了,这说明大家对 AI 的热情非常高涨。 第二,我们开始探索 DeepSeek 部署后的应用场景。目前,虽然已经有 Chatbox 和 Open Web UI 等客户端可以连接 DeepSeek,但我们认为 DeepSeek 客户端可以实现更多功能,尤其是对于企业私有化部署来说,需要更强大的智能体开发。因此,我们决定自己开发一个开源的客户端——DeepChat。这个项目完全开源,采用 Apache 协议,今天刚刚发布了 0.02 版本,支持联网功能,可以通过搜索引擎结合 DeepSeek 进行更强大的处理。我们的目标是将 DeepChat 打造成连接强大 AI 与个人世界的智能助手。未来,人们会越来越多地通过终端设备处理各种事务,包括电脑、平板和手机。我们希望在终端设备上开发更多小应用,比如下一个版本将支持文件上传和内容总结功能,用户可以上传多个文件并输出自己想要的格式。DeepChat 不仅可以连接企业的大脑,也可以连接个人电脑,用户可以选择连接本地的小 AI,也可以连接公网上的满血版 AI。我们还计划全面对接 MCP 协议,将个人智能体的功能整合进来,充分发挥终端设备的潜力。我们希望通过开源的方式,像 DeepSeek 一样,毫无保留地分享技术,打造一个全球知名的 AI 应用生态。 对于我们企业而言,从个人到社区,再到企业层面,我们的差异化优势其实非常明确。比如,我们将 Go 社区转型为以 DeepSeek 为核心的 AI 社区,这一转变本身就体现了我们的独特性。我们始终以开源项目为驱动,围绕 AI 编程、开源项目、DeepSeek 工具链以及 MCP 社区的终端应用展开工作。这种以开源为基础、以技术为核心的发展路径,是我们区别于其他社区和企业的关键所在。 在企业层面,我们面临的挑战是 如何在 DeepSeek 私有化部署这一竞争激烈的市场中找准自己的定位。如今,许多企业都在涉足 DeepSeek 的私有化部署,但我们必须思考:用户为什么选择我们?如何在众多竞争者中脱颖而出?这正是我们需要解决的问题。 我认为,实现差异化的核心在于“行业 Know-How + AI”。我们需要找到自己真正擅长的行业领域,并深入理解该行业的核心数据和业务流程。只有当我们清楚地知道行业数据的价值和业务流程的关键节点时,才能将 AI 技术精准地嵌入其中,从而发挥出我们的差异化优势。这种结合行业深度知识与 AI 技术的能力,才是我们能够在市场中立足的关键。 AI 技术商业化落地的“道”与“术” 所谓“道”,是指我们对场景选择和用户痛点的深刻理解。首先,我们必须从用户的真实痛点出发,这是商业化的基础。其次,商业模式的验证至关重要,需要从一开始就设计好盈利模式,思考如何持续赚钱。用户痛点的发现并非孤立的,而是通过与不同行业人士的交流逐渐明晰的。例如,有医院希望部署 DeepSeek 的私有化方案,但面临技术选型和硬件适配的难题;还有企业希望通过小模型解决特定业务问题,需求千差万别。这些痛点背后,反映出行业对 AI 技术的迫切需求,也凸显了我们作为技术提供方的机会。 仅仅发现痛点还不够,我们需要结合行业 Know-How 与 AI 技术,找到数据和业务流程中的关键点,将 AI 嵌入其中,实现差异化价值。比如,金融行业可以通过 AI 优化风险控制,医疗行业则可以利用 AI 提升诊断效率。这种结合行业深度知识与 AI 技术的能力,才是我们能够在市场中立足的关键。 在“术”的层面,我们则需要关注技术的成熟度和数据的积累。选择成熟的技术可以降低风险,而数据的积累和算法的优化则是持续迭代的基础。AI 技术的快速迭代要求我们不断优化模型,以适应市场的变化。 小 结 在 AI 时代,每个人都有机会成为超级个体,无论是个人创业还是小团队创业,都需要 从技术的迷恋转向技术的实用化,从产品思维转向用户价值思维。技术本身并不重要,重要的是技术与场景的结合。同时,从单打独斗转向生态协同也是必然趋势。AI 的商业化落地需要构建完整的生态,包括技术提供方、数据支持方和应用场景方。
NB的架构师都要具备足够的技术深度,然后才能透过问题看本质,所谓技术深度就是扎实的基础知识,要不断深入,反复研究学习,打磨自己的硬实力。不论从事云计算、虚拟化、容器、大数据、人工智能,几乎都是基于 Linux 服务器部署服务。 一、linux系统结构 linux系统看似纷繁复杂,单其核心只有一点,那就冯洛伊曼体系“存储计算”,万变不离其宗。就像一颗大树一样,枝叶繁多,但主干却很清晰简单。 Linux系统一般有4个主要部分:programs/utilities/tools 内核、shell/工具(GUN工具)、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。 Computer Resources:硬件资源 Kernel:内核 GUN工具: Shell:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器 Programs/Utilities/Tools:库函数、工具等 File systems:文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。 User Application:Linux应用,标准的Linux系统一般都有一套被称为应用程序的程序集,它包括文本编辑器、编程语言、X Window、办公套件、Internet工具和数据库等 Linux开机后,内核启动,激活内核空间,抽象硬件、初始化硬件参数等,运行并维护虚拟内存、调度器、信号及进程间通信(IPC)。内核启动后,再加载Shell和用户应用程序,用户应用程序使用C\C++编写,被编译成机器码,形成一个进程,通过系统调用(Syscall)与内核系统进行联通。进程间交流需要使用特殊的进程间通信(IPC)机制。 二. Linux系统1: linux内核组成 Linux内核是世界上最大的开源项目之一,内核是与计算机硬件接口的易替换软件的最低级别。它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。 内核是操作系统的核心,具有很多最基本功能,其核心功能就是:管理硬件设备,供应用程序使用。硬件设备包括CPU、Memory(内存和外存)、输入输出设备、网络设备和其它的外围设备。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图: 系统调用接口: SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。 1、内存管理 负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。 内存管理系统在操作系统中,不同的进程有不同的内存空间,这些内存空间需要统一的管理和分配,这就需要内存管理系统。 对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。 不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。 为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。 2 .进程管理 进程管理系统在操作系统中,进程的执行也需要分配CPU来执行,所以,为了管理进程,我们还需要一个进程管理系统。如果运行的进程很多,则一个CPU会并发地运行多个进程,这就需要CPU的调度能力了。 进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。 进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。 通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。 内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。 3. 文件系统 Linux系统,一切皆文件: 1)启动一个进程,需要一个二进制文件。 2)启动进程时,需要加载一些配置文件如yml, properties等,这是文本文件 3)把日志打印到控制台上,是标准输出stdout文件 4)一个进程的输出作为另一个进程的输入,称为管道,管道也是一个文件 5)进程可以通过网络和其他进程通信,建立的socket,也是一个文件 6)进程需要访问的外部设备,也是一个文件 7)文件夹也是一个文件每个文件,Linux都会分配一个文件描述符(File Descriptor),这是一个整数。有了这个文件描述符,我们就可以使用系统调用,查看或干预进程运行的方方面面。 和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统. 虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。 虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。 VFS 在用户和文件系统之间提供了一个交换层: 在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。 文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。 因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2 文件系统中的文件一样使用它们。 4. 设备驱动程序 设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。 5.网络接口(NET) 提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。 网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。 需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享 二、Linux系统1: 内核运行原理 百度搜索:漫画趣解Linux内核:内容大概如下: 一幅来自 TurnOff.us 的漫画 “InSide The Linux Kernel” 。TurnOff.us 是一个极客漫画网站,作者 Daniel Stori 画了一些非常有趣的关于编程语言、Web、云计算、Linux 相关的漫画。 整体架构画面分为三层:(按我个人理解) 最下面一层看起来像是一个仓库,就是文件系统(File System); 地面层有很多人(大部分都是企鹅)在各种忙碌,代表着进程表(Process Table); 还有一个跃层,代表着人机交互界面(Terminals And Termina process); 这些就是Linux内核的基本层次架构,所有程序执行、资源调度、系统功能都在这个内核中运行和实现。 关于操作系统处理任务/服务的大体流程简单归纳为:1.输入—2.中断/异常处理——3.调度进程——4.服务进程处理——5.输出结果: 接下来我们按照漫画的分层分开说明一下这些流程: 1、顶层的半层:输入输出交互界面 交互界面是一个跃层,说明它是内核的一部分,但和进程管理大厅联系紧密。这里墙上有很多屏幕,代表它通过可视化的界面来处理信息,实际上就是系统和人的交互界面。 屏幕有很多个,代表系统可以同时处理多路的命令交互。屏幕上的内容都有不同,有的屏幕还没有开启,有的屏幕是字符界面,有的还有图形界面,代表不同的GUI的交互状态。 这里有两个进程来管理这些屏幕。有一个进程面向屏幕,正在一个控制板上进行操作,笔者的理解是它是一个输出进程,可以控制各个屏幕的不同状态和输出内容;另一个进程面向大厅,手中拿着一份文件,应该正在向大厅里面的进程下达质量,所以它是一个输入控制进程。这样我们也能够理解为什么这里是一个半层,因为它需要一个开放的架构来连接输入输出和执行进程。 跃层有很多不同的屏幕,每个屏幕上写着 TTY(这就是对外的终端)。比如说最左边 tty4 上输入了 “fre” ——这是想输入 “freshmeat…” 么 :d ;它旁边的 tty2 和 tty3 就正常多了,看起来是比较正常的命令;tty7 显示的图形界面,对,图形界面(X Window)一般就在 7 号终端;tty5 和 tty6 是空的,这表示这两个终端没人用。等等,tty1 呢? 跃 层,也是最接近用户的一层。两只企鹅在名为 TTY 的窗口面前工作,一只企鹅在控制台前戳戳点点,另一只在仔细端详程序的输出。TTY 中文为电传打字机,关于 TTY,可以追溯到计算机的远古时代,那时候我们使用的还只是没有主机的打字机。设备的输入要经过长长的串行线路才能到达那昂贵的大型主机 (Mainframe Computer)。 作为 Unix-like 的 Linux 也继承了这一特性,在 /dev 目录下和 ps 命令的输出中我们都可以看到它的身影。 TTY(终端)是对外沟通的渠道之一,但是,不是每一个进程都需要 tty,某些进程可以直接通过其他途径(比如端口)来和外部进行通信,对外提供服务的,所以,这一层不是完整的一层,只是个跃层。 2、中间层:进程和进程调度 中间层则体现的是流程中的:调度,服务以及输出, 进程调度处理任务:忙碌的大厅,各司其职。 大厅里,就是各种进程运行和忙碌的主要场所了。 大厅的中心,是一张长条桌。这里应该就是主进程表了,一个主进程正在和一堆进程开会,可能正在协调它们的运行;这些进程神态和状态各异,有的认真听讲,有的不屑一顾,有的左顾右盼,有的沉默不语...,确实很像系统中各种任务执行的状态。 大厅一角堆了很多管道,这是Linux处理信息的 应用进程(企鹅): 图中有很多企鹅,它们通常代表着在Linux内核中运行的进程。之所以使用企鹅,应该是因为Linux的Logo和形象代表就是一个企鹅。但如果我们认真观察,会发现虽然它们都是企鹅,但是它们的装扮、动作甚至神态都是不一样的,隐喻着它们有不同的特性和状态。一般情况下,企鹅的胸前会挂着一个写有数字的工牌,代表着这个进程的进程编号。 初始化(init)进程:左上角有一个小企鹅,站着,仿佛在说些什么这显然是一位家长式的人物,不过看起来周围坐的那些小企鹅不是很听话 —— 你看有好多走神、自顾自聊天的 —— “喂喂,说你呢,哇塞娃(171),转过身来”。它代表着 Linux 内核中的初始化(init)进程,也就是我们常说的 PID 为 1 的进程。桌子上坐的小企鹅都在等待状态(Wait)中,等待工作任务。 监控进程(看门狗):除了企鹅之外,我们还看到有几条小狗。这些都是看门狗(Watch Dog)。它们负责在系统内部进行巡查,处理各种异常状况。当小企鹅们不听话时,它就会汪汪地叫喊起来。 异常进程: 最后还有一个小丑,应该就代表着系统内部的异常进程,比如病毒木马等恶意软件。 cron 进程:看它急得头上都冒汗了,这位老弟不断的看着手表,执行着周期性任务。 web守护进程:一只 PID 为 1341 的小企鹅就是大名鼎鼎的 Apache HTTP 服务器进程。它坚守在 80 端口提供 HTTP 服务。它头上的羽毛就是 Apache 的标志。 ssh守护进程:墨镜的企鹅守护着 22 端口。它看着要比其他的企鹅要更加有威严,脸上彷佛写着生人勿进四个字。原来它看护的是用于 SSH 服务的 22 端口,SSH 服务常常用于远程登陆,所以必须要仔细审查。 进程交互:管道 两位企鹅累的满头大汗,任劳任怨的在搬动着管道。一只小企鹅可以把自己手上的东西通过这个管道,传递给后面的小企鹅。 进程端口号:门 这个大厅里面,有几扇门,代表着和外部世界沟通的网络端口。 通用web端口号80: 左边的那个门上面的编号是80,这是标准的HTTP的端口号,所以这是一个标准Web端口;端口旁边有一个守卫进程,熟悉网络编程的同学应该可以看出来它就是Apache Tomcat,因为它头上戴着那个熟悉的羽毛。 ssh端口号22:右边那个门编号是22,就是SSH的端口,旁边那个戒备森严,戴墨镜耳机的保安,表明了这个端口的安全级别比较高。 ftp端口21:中间角落里面那个门的门牌都歪了,因为它已经年久失修。因为它是ftp端口(端口编号21),现在已经基本上没人用了。 系统交互:楼梯 和shell界面交互:SSH旁边的楼梯,可以上到交互界面层; 和文件系统交互:而21端口旁边,还有一个隐蔽的楼梯,上面FS的指示牌,表明从这里可以下到文件系统层。 3、地基层:文件系统 文件系统是单独的一层。这里面有很多柜子,按照行列码放整齐,表明了文件系统保存文件的方式和结构。文件放在柜子的抽屉里面,而且也是按照索引依次存放。 大部分抽屉都是关闭的,说明现在还没有人来访问。库房里有编号是421(PID(Process ID) 为 421 的进程)的一个进程正在查看文件;还有一个柜子已经打开,但旁边却没有人,可能是那个进程打开了文件,却由于某种原因没有正常关闭(比如异常或强行退出,甚至进程本身就忘了要关闭文件句柄),所以需要一条看门狗(右下角有一只小狗Watchdog)来进行处理,这代表对文件系统的监控。 4、总结、使用银行柜台业务总结linux系统处理任务流程: 这里像不像去银行柜台办理业务处理:1.请求输入—2.中断/异常处理——3.调度进程——4.服务进程处理——5.输出结果: 大家应该都去过银行办业务,由于银行的柜台就那么几个,办业务的人数又多,所以,去银行的第一件事就是排队取号: 银行柜台办理不同的业务类型: 普通业务(存取款)柜台(80web端口服务线程池):、例如有个有两个固定普通业务窗口(核心线程数为2)3位工作人员(最大线程数为3),等候座位(任务队列),一个规则《超出银行最大接待能力处理办法》(饱和等待策略)。 vip业务柜台(22 ssh端口直接优先处理): 办卡业务(办卡机直接办理):直接shell脚本处理。 如果大家办理普通业务, 首先是内存管理(叫号系统的号码): 由于银行的普通业务柜台就那么2个,办业务的人数又多。所以,去银行的第一件事就是排队取号,注意这个号号,并不代表去哪个柜台办业务,只是说你前面等待办业务的人数,不过需要等着叫号系统叫到你之后,才能办理业务,而且最终办理业务的柜台是随机的。好了,类比一下就是,银行柜台好比是物理内存,而排队序号就是虚拟地址,我们想办业务只能通过手里拿着的这个 “虚拟地址”,然后,必须通过叫号系统,将虚拟地址,即排队序号 翻译成具体的物理地址,即柜台号,我们才能办理业务。 进程管理: 进程属性: 每个柜台窗口都有窗口id(进程ID和服务端口号) 进程调度: 按照叫号系统的指示,办理普通业务的客户被安排到普通业务窗口,办理办卡业务的客户被安排办卡机办理。 线程调度: 例如有个有两个固定普通业务窗口(核心线程数为2)3位工作人员(最大线程数为3),等候座位(任务队列),一个规则《超出银行最大接待能力处理办法》(饱和拒绝策略)。 A客户(任务A)去银行(线程池)办理业务,但银行刚开始营业,窗口服务员还未就位(相当于线程池中初始线程数量为0),于是经理(线程池管理者)就安排1号工作人员(创建核心线程1去执行任务)接待A客户。 在A客户业务还没办完时,B客户(任务B)又来了,于是经理(线程池管理者)就安排2号工作人员(创建核心线程2去执行任务)接待B客户。 在A、B客户都没有办完业务的情况下,C客户(任务C)来了,于是经理(线程池管理者)就安排C客户先坐到等候座位上,并告知他:如果1、2号工作人员空出,C客户就可以前去办理业务。 此时D客户(任务D)又来了,(两个窗口都在忙,等候座位也满了)于是经理(线程池管理者)赶紧安排3号工作人员(创建非核心线程3去临时执行任务D)在大堂站着给D客户办理业务。 假如前面的业务都没有结束的时候E客户(任务E)又来了,此时2位窗口工作人员,和1位临时工作人员都在忙,等候座位也满了,于是经理只能按《超出银行最大接待能力处理办法》(饱和处理机制)拒接接待E客户。 如果是vip客户,可以直接被被安排到前面,抢占其他客户的时间办理,这显然是调度算法显然调高了vip客户(某个应用程序)的优先级,可以快速抵达“柜台”。 这当于Linux中进程的调度,它的头脑十分强大,需要按照各个应用程序的优先级顺序,必要时可以进行“抢占式调度”,抢占调度指的是一个高优先级进程是否可以强行夺取低优先级进程的处理器资源。如果可以强行夺取,就是可抢占的调度。这也是础光Linux实时性改造的一大亮点。 中断处理: 中断是指CPU接受到I/O设备发送的中断信号的一种响应。CPU会暂停正在执行的程序,保留CPU环境后自动转去执行该I/O设备的中断处理程序。执行完毕后回到断点。继续执行原来的程序。中断是由外部程序引起的所以称为外中断。小企鹅们会根据各类中断请求来进行CPU的工作安排。 类比银行业务,当前窗口柜台的客户X办理业务需要一些手续盖章而中断一段时间,但业务员可以继续办理其他客户业务,当客户X办理业务的手续盖章完成了,业务员继续唤醒客户X来办理。 三 . linux系统2: shell shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。 在Linux系统上,通常有好几种Linux shell可用。不同的shell有不同的特性,有些更利于创建脚本,有些则更利于管理进程。所有Linux发行版默认的shell都是bash shell。bash shell由GNU项目开发,被当作标准Unix shell。目前主要有下列版本的shell: 1.Bourne Shell:是贝尔实验室开发的。 2.BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。 3.Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。 4.C Shell:是SUN公司Shell的BSD版本。 1、shell的类型 linux启动什么样的shell程序取决于用户ID配置。 在/etc/passwd文件中,在用户ID记录的第7个字段中列出了默认的shell程序。只要用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行。例如:用户root使用/bin/bash(bash shell)作为自己的默认shell程序. 不过还有另外一个默认shell是/bin/sh,它作为默认的系统shell,用于那些需要在启动时使用的系统shell脚本。你经常会看到某些发行版使用软链接将默认的系统shell设置成bash shell,如CentOS发行版: $ ls -l /bin/sh /bin/sh 相当于 /bin/bash --posix,使用 sh 调用执行脚本相当于打开了bash 的 POSIX 标准模式,它们之间的各种差异都是来自 POSIX 标准模式和bash的差异。 2、shell的父子关系 用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell。 在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。 例如:使用ps -f 使用ps -f的时候,显示出了两个进程: 第一个bash shell程序,也就是父shell进程,进程ID是3966191,运行的是bash shell程序。 第二个bash shell程序,即子shell进程,进程ID为3972365,对应的是命令ps -f。 在生成子shell进程时,只有部分父进程的环境被复制到子shell环境中。 3、常用的GUN命令总结 GUN是GNU的一种小工具,它是“GNU即不仅仅是UNIX”的缩写。GNU工具集是一系列用于UNIX操作系统的自由软件工具。这些工具提供了强大的功能,可以用于文件操作、文本处理、版本控制、编译和调试等任务。 下面是一些常见的GUN工具及其含义: 1). 文本处理工具 grep:用于在文件中搜索指定的字符串,并返回匹配的行。它支持正则表达式,可以进行高级搜索。 awk:一种强大的文本处理工具,它可以根据指定的规则对输入文件进行处理。它常用于提取、转换和格式化文本数据。 sed:流编辑器,用于对输入流进行文本转换。它可以在文件中查找和替换字符串,删除或插入行,并执行其他编辑操作。 2). 文件管理工具: GUN命令集还包含了用于文件管理的工具。 ls:命令用于列出目录内容, cp:命令用于复制文件, mv:命令用于移动或重命名文件, rm:命令用于删除文件等。 find:用于在指定目录中查找文件。它可以基于文件属性(如文件名、大小、时间戳等)进行搜索,并支持复杂的逻辑操作。 tar:用于创建和提取归档文件。它可以将多个文件和目录打包成一个单独的文件,也可以提取已打包的文件。 gzip:用于压缩文件。它使用Lempel-Ziv算法对文件进行压缩,以减小文件大小。 这些工具提供了对文件系统的基本操作。 3). 进程管理和系统监控: GUN命令集中的一些工具可用于管理和监控系统中运行的进程。 ps:命令用于列出当前运行的进程, top:命令用于实时监视系统资源的使用情况, kill:命令用于终止正在运行的进程等。 4). 网络工具 GUN命令集包含了一些网络工具,用于管理和配置网络连接。 ifconfig:命令用于配置网络接口, ping:命令用于测试网络连接的可达性, netstat:命令用于显示当前网络连接和端口状态等。 5). 软件包管理: GUN命令集中还包含了一些用于软件包管理的工具。 apt-get命令:用于在Debian和Ubuntu系统中安装和升级软件包, yum命令:用于在Red Hat和CentOS系统中进行相同的操作。 这些工具简化了软件安装和更新的过程。 6). 软件编译相关: make:用于自动构建软件项目。它根据指定的规则和依赖关系,自动编译和链接源代码文件,生成可执行文件或库文件。 gcc:GNU编译器集合,用于编译C、C++和其他支持的编程语言。它将源代码文件编译成可执行文件。 gdb:GNU调试器,用于调试程序。它可以在程序运行过程中暂停执行,并提供查看变量、堆栈和内存的功能。 四 . linux系统3: 文件管理系统 各操作系统使用的文件系统并不相同,例如,Windows98 以前的微软操作系统使用 FAT(FAT16)文件系统,Windows 2000 以后的版本使用 NTFS 文件系统,而 Linux 的正统文件系统是 Ext2。 在 CentOS 6.3 系统中,默认的文件系统是 Ext4,它是 Ext3(Ext2) 文件系统的升级版,在性能、伸缩性和可靠性方面进行了大量改进,变化可以说是翻天覆地的,比如: 向下兼容 Ext3; 最大 1EB 文件系统和 16TB 文件; 无限数量子目录; Extents 连续数据块概念; 多块分配、延迟分配、持久预分配; 快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等; Linux支持的常见文件系统 Linux 系统能够支持的文件系统非常多,除 Linux 默认文件系统 Ext2、Ext3 和 Ext4 之外,还能支持 fat16、fat32、NTFS(需要重新编译内核)等 Windows 文件系统。也就是说,Linux 可以通过挂载的方式使用 Windows 文件系统中的数据。Linux 所能够支持的文件系统在 "/usr/src/kemels/当前系统版本/fs" 目录中(需要在安装时选择),该目录中的每个子目录都是一个可以识别的文件系统。我们介绍较为常见的 Linux 支持的文件系统,如表 1 所示。 五 . linux系统4: 应用程序,用户态和内核态 应用程序是无法直接访问硬件资源的,需要通过通过内核SCI 层提供的接口来访问硬件资源。 Linux系统将自身划分为两部分,一部分为核心软件,即是kernel,也称作内核空间,另一部分为普通应用程序,这部分称为用户空间。 区分用户空间和内核空间的目的是为确保系统安全。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。因为如果应用程序和内核在同一个保护级别,那么应用程序就有可能有意或者不小心进入了内核空间,破坏了内核空间的代码和数据,系统崩溃就不足为奇。所以CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3, 内核空间级别为“RING0”, 用户空间级别为RING3。 linux的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。 当应用程序进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(RING0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(RING3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。 内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, 如上所提到的intel cpu提供Ring0-Ring3四种级别的运行模式,Ring0级别最高,Ring3最低。Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。 内核空间和用户空间 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。64位内核地址空间划分是不同的。 32位与64位具体地址分布如下图: 64位地址时将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间。参见定义: #define TASK_SIZE_MAX ((1UL << 47) - PAGE_SIZE),注意这里还减去了一个页面的大小做为保护。 而0xffff,8000,0000,0000以上为系统空间地址。注意:该地址前4个都是f,这是因为目前实际上只用了64位地址中的48位(高16位是没有用的),而从地址0x0000,7fff,ffff,ffff到0xffff,8000,0000,0000中间是一个巨大的空洞,是为以后的扩展预留的。 而真正的系统空间的起始地址,是从0xffff,8800,0000,0000开始的,参见: #define __PAGE_OFFSET _AC(0xffff,8800,0000,0000, UL) 而32位地址时系统空间的起始地址为0xC000,0000。 另外0xffff,8800,0000,0000 – 0xffff,c7ff,ffff,ffff这64T直接和物理内存进行映射,0xffff,c900,0000,0000 – 0xffff,e8ff,ffff,ffff这32T用于vmalloc/ioremap的地址空间。 而32位地址空间时,当物理内存大于896M时(Linux2.4内核是896M,3.x内核是884M,是个经验值),由于地址空间的限制,内核只会将0~896M的地址进行映射,而896M以上的空间用做一些固定映射和vmalloc/ioremap。而64位地址时是将所有物理内存都进行映射。 内核态与用户态 用户态Ring3状态不能访问内核态Ring0的地址空间,包括代码和数据。(例如32位Linux进程的4GB地址空间,3G-4G部 分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据)。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必 须切换到Ring0,然后进入内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能 随意操作内核地址空间,具有一定的安全保护作用。 处理器总处于以下状态中的一种: 1、内核态,运行于进程上下文,内核代表进程运行于内核空间; 2、内核态,运行于中断上下文,内核代表硬件运行于内核空间; 3、用户态,运行于用户空间。 从用户空间到内核空间有两种触发手段: 1.系统调用: 用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。 2.中断: 硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。例如网卡发送一个数据包或硬盘驱动器提供一次 IO 请求等。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。
智慧物流是现代物流的发展趋势之一,通过智慧物流,能够解决传统物流中存在的一些问题。为增进大家对智慧物流的认识,本文将对智慧物流以及智慧物流的重要性予以探讨。如果你对智慧物流具有兴趣,不妨继续往下阅读...
服务器是信息时代的重要设备之一,在缺少服务器的情况下,我们将无法高效地同其它通信设备进行通信。依据服务器类型的不同,服务器可以分为高防服务器、游戏服务器等等。在本文中,小编将对云服务器予以介绍,主要...
在前两篇文章中,小编对云服务器的发展历史以及云服务器的12大优势有所阐述。为增进大家对云服务器的认识,本文将对云服务器提供的服务以及云服务器性能予以解析。如果你对云服务器具有兴趣,不妨和小编继续往下阅...
在汽车智能化、网联化的大背景下,ADAS技术的不断革新、车载多媒体持续推进、各种智能化功能的推陈出新以及大数据、云计算等一系列技术的发展,极大推进了车载网络容量需求的爆发式发展。
c/c++后端开发程序员往往都是被大厂所青睐,因为需要掌握的技术范畴大,有一定的技术难度,从技术层面上形成一定