DP读书:鲲鹏处理器 架构与编程(十三)操作系统内核与云基础软件

操作系统内核与云基础软件

  • 鲲鹏软件构成
    • 硬件特定软件
  • 鲲鹏软件构成
    • 硬件特定软件
      • 1. Boot Loader
      • 2. SBSA 与 SBBR
      • 3. UEFI
      • 4. ACPI
    • 操作系统内核
      • Linux系统调用
      • Linux进程调度
      • Linux内存管理
      • Linux虚拟文件系统
      • Linux网络子系统
      • Linux进程间通信
      • Linux可加载内核模块
      • Linux设备驱动程序
      • Linux架构相关代码
    • 基础库
    • 开发工具、中间件和应用程序
    • 云基础软件
  • 鲲鹏软件开发模式
    • 原生开发模式
    • 交叉开发模式
    • 云端开发模式

补更,因为前几天画图的原因…

鲲鹏软件构成

硬件特定软件

鲲鹏软件构成

鲲鹏处理器的软件生态是一个不断发展的软件生态,服务器本身也具有复杂度多样性,经过很长时间的发展服务器硬件有不同的操作系统方案,这些操作系统往往还实现了软件的分层组合,很难简单描述其软件架构

本节从一个比较高的层次,主要从GNU/Linux软件生态角度出发,介绍鲲鹏软件的构成。

以下为鲲鹏 GNU/Linux 的软件架构高层视图:

鲲鹏 GNU/Linux 的软件架构高层视图
上图中,底部为鲲鹏服务器硬件,以 鲲鹏处理器为核心的通用服务器设备
在包含ARM核心的硬件系统上运行的软件不可避免的会包含特定系统的代码,此类代码通常以固件形式与其他系统软件分开,本节将此特性的代码称为----硬件特定软件

在服务器领域,服务器的硬件硬件特定软件对服务器“开箱即用”的影响最大,所以这两部分都要满足ARM服务器相关的合规性要求(详见:ARMv8-A 体系结构、鲲鹏软件生态与云服务)

硬件特定软件

硬件特定软件是指ARM服务器中特定系统的、常以固件形式提供的软件,主要包括所谓的Boot Loader 和设备特定固件。

本节将先介绍Boot Loader,然后介绍 ARM 服务器中的固件要求规范 SBSA 和 SBBR,以及其中 涉及到的一些重要元素, 如 UEFI、ACPI 与 ATF( ARM 可信固件)

1. Boot Loader

Boot Loader 即启动加载程序,是 Bootstrap Loader 一词的缩写版,通常是系统上电或重置运行后的第一个软件,因此它是专门针对特定处理器和主板的。

粗略的看启动流程包括三个主要阶段:

  1. 系统上电,硬件加载Boot Loader
  2. Boot Loader 加载操作系统,例如Linux内核;
  3. 操作系统加载应用程序和用户数据,完成启动过程。
系统上电 加载
加载
加载
硬件
BootLoader
操作系统
应用程序和用户数据

其中,Boot Loader的主要作用就是充当硬件与操作系统之间的媒介,用于加载操作系统。为完成这一目的,Boot Loader往往要寻找并释放操作系统,建立操作系统运行的基本环境(例如初始化内存、发现硬件设备参数回传操作系统等)。一些复杂的 Boot Loader还会有很多额外的功能,如支持多阶段启动、多种启动方式(如Flash内存、磁盘、网络、U盘、光盘等)、启动多种操作系统、更新固件、提供运行时服务、支持底层调试等。

在服务器领域,支持 安全启动也是一个很重要的特性。

2. SBSA 与 SBBR

不同操作系统对系统加载过程中的要求是不一样的。在ARM的传统强项——嵌入式设备与移动终端——领域的Soc产品,往往是 定制化、差异化、价格敏感的,用户很少跟换硬件模块操作系统。在这些情况下,定制软件的成本远远小于移除硬件功能带来的成本节省。所以此类情况下使用方案多是高度定制化的,如“启动固件+Boot Loader(u-boot、fastboot)+操作系统(Linux)+应用软件”

但在 服务器和PC领域,软件通常由第三方开发,用户只要考虑“开箱即用”和“模块可更换”。定制硬件的成本远超过软件成本。所以,使用的方案一般为标准化的接口兼容的。

SBSA(Server Base Boot Requirements)和SBBR(Server Base Boot Requirements)是ARM在服务器应用领域对服务器基本启动需求提出的规范。

SBBA的规范是基于ARM 64 位处理器架构的硬件体系结构的规范,详细描述了服务器操作系统软件,如:操作系统、Hypervisor(虚拟机管理器)和固件所依赖的特性和系统架构关键层面,包括 CPU、PCIe、定时器、IOMMU、UART(Universal Asynchronous Recevier / Transmitter,通用异步收发传输器)、看门狗和中断等,目标是有足够标准的
系统架构,来使一个恰当的系统镜像能在所有符合规范的系统硬件上运行。

SBSA标准主要定义了以下方面的要求:

1.服务器在加电自检(POST)阶段应该检查的基本硬件组件,例如处理器、内存、硬盘驱动器、键盘和鼠标等。
2.服务器引导过程中需要加载的最小软件集合,包括固件(如BIOS或UEFI固件)、引导加载器(如GRUB或UEFI引导加载器)以及内核等。
3.服务器在引导过程中应该遵循的基本时序和顺序。
4.对于采用多引导架构的系统,SBSA还规定了引导过程中如何处理多个操作系统的引导选项。

SBBR规范是对系统启动固件的规范,定义了符合SBSA标准的ARM AArch64 架构的服务器上的操作系统或者Hypervisor(虚拟机管理器)要实现开箱即用能力的基本固件需求,包括所需启动和运行时的服务和安全要求,并遵循UEFI(Unified Extensible Firmware Interface,统一可拓展固件接口)和ACPI (高级适配电源管理接口规范)

SBSA/SBBR是针对ARM服务器能够启动OS或监视器等固件上提出的最小需求集,同时遵循了UEFI、ACPI、PSCI、SMBIO等工业标准。其中,SBSA和SBBR虽然名字相似,但它们实际上关注的方面有所不同。SBSA主要关注系统启动和运行的最小需求,包括启动加载程序、运行时服务、固件抽象等,而SBBR则关注引导程序的最小需求,例如UEFI的BootServices、RuntimeServices、Protocol等基础服务及协议接口。

在实现层面,SBSA和SBBR规范主要通过LuvOS这个定制化Linux系统来实现。LuvOS是基于Linux内核的,通过将FWTS(Firmware Test Suite)和SBSA-ACS(ARM Server Base Architecture - Automotive and Server Consortium Starter Kit) 在Linux下的工具与标准Linux内核共同编译获得。

3. UEFI

UEFI最早由Intel推出,是16位 x86“传统”PC BIOS的后继产品,目前由UEFI论坛维护。

UEFI(Unified Extensible Firmware Interface) 是一种在计算机固件中使用的图形化标准接口,它被设计用来替代传统的BIOS。UEFI被定义为一个可扩展的固件接口规范,它提供了一组标准的API,使得操作系统可以在预启动环境下与固件进行交互。

UEFI规范的开源参考实现是edk2 或 EDK Ⅱ,源码位于https://github.com/tianocore/tianocore.github.io/tree/master/edk2
上游开发小组为TianoCore社区

UEFI是以图形化界面展示的,相比传统的BIOS,它更易于使用和定制。此外,UEFI还提供了一些先进的功能,例如网络配置、硬件诊断和安全启动等。

UEFI是由一些行业领先的公司共同制定的,包括AMD、Intel、Microsoft等。随着计算机硬件的发展,UEFI也在不断演进,以满足新的需求。

UEFI 规范中包含一个启动管理器 BOOT Manager,他会根据NVRAM(Non-Volatile Random Access Memory,非易失性随机访问存储器)中的参数决定如何加载可执行文件(可能是Boot Loader 或者其他镜像文件),EFI(可拓展固件接口)可执行文件格式必须符合PE(Protable Executable,可移植可执行)格式,PE是一种广泛应用在Windows平台上

4. ACPI

ACPI(Advanced Configuration and Power Interface)是一种开放式电源管理接口规范,它被设计用来提供一种通用的、标准化的电源管理方式。ACPI定义了在操作系统控制之下对电源管理进行完全控制的一种接口规范。

ACPI主要包含以下几部分:

  1. 用于描述计算机系统中电源状态和设备状态的表(Tables);
  2. 用于操作系统与固件之间进行通信的接口(Interfaces);
  3. 用于描述电源、散热管理及系统配置的规范;
  4. 用于提供运行时电源管理的事件(Events)。

ACPI是一种比较复杂的规范,它提供了丰富的电源管理功能。在计算机领域,许多新的电源管理特性都是基于ACPI实现的。
ACPI的子系统和结构图

操作系统内核

操作系统内核是计算机系统的核心,负责管理硬件资源、调度进程、内存管理等关键任务。Linux内核是一种自由和开放源代码的操作系统内核,为众多计算机系统提供支持,包括个人电脑、服务器、移动设备等。

Linux系统调用

系统调用是应用程序与操作系统内核交互的接口。Linux系统调用是应用程序请求内核服务的一种方式,例如文件操作、进程控制、网络连接等。

Linux进程调度

进程调度是操作系统的关键部分,负责分配计算资源给各个进程。Linux采用基于优先级的抢占式调度算法,支持多处理器和实时任务。
Linux内核

Linux内存管理

内存管理负责分配和管理计算机系统的内存资源。Linux内存管理支持虚拟内存、物理内存管理和页面置换算法等。

Linux虚拟文件系统

虚拟文件系统是Linux内核的一部分,为上层应用程序提供统一的文件系统接口。Linux支持多种文件系统,如ext4、NFS、SMB等。

Linux网络子系统

网络子系统负责管理计算机系统的网络协议栈,包括网络接口、数据包转发、路由等。Linux网络子系统提供了一套丰富的网络编程接口。

Linux进程间通信

进程间通信是操作系统的一部分,允许不同进程之间进行数据交换和协作。Linux提供了多种进程间通信机制,如管道、套接字、共享内存等。

Linux可加载内核模块

可加载内核模块是Linux内核的一部分,可以在需要时动态加载和卸载。这些模块提供了扩展内核功能的能力,而无需修改现有代码。

Linux设备驱动程序

设备驱动程序是操作系统内核与硬件设备之间的接口。Linux设备驱动程序负责管理硬件设备,包括设备初始化、数据传输和控制等。

Linux架构相关代码

Linux内核代码由多个模块组成,每个模块负责特定的功能和子系统。这些模块之间的协作和通信基于Linux内核架构和设计原则。理解Linux内核的架构和代码可以帮助开发人员更好地理解和优化系统性能。

操作系统内核
Linux系统调用
Linux进程调度
Linux内存管理
Linux虚拟文件系统
Linux网络子系统
Linux进程间通信
Linux可加载内核模块
Linux设备驱动程序
Linux架构相关代码
参考

基础库

glibc(GNU 系统库)是GNU/Linux以及运行Linux的基础核心库
glibc是GNU发布的libc库,即c运行库。glibc是Linux系统中最底层的API,几乎其它任何运行库都会依赖于glibc。glibc除了封装Linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于glibc囊括了几乎所有的UNIX通行的标准,可以想见其内容包罗万象。而就像其他的UNIX系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在GNU/Linux系统中,其C函式库发展史点出了GNU/Linux演进的几个重要里程碑,用glibc作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。

glibc是GNU发布的libc库
即c运行库
封装Linux操作系统所提供的系统服务
实现了必要功能服务的实现
UNIX通行的标准
Linux系统中
内含的档案群分散于系统的树状目录结构中
像其他的UNIX系统一样
包含了许多必要功能服务的实现
是GNU/Linux演进的重要里程碑
用glibc作为系统的C函式库

开发工具、中间件和应用程序

开发工具、中间件和应用程序

  1. 软件建模工具:这类工具帮助开发人员在软件开发周期的早期进行设计、规划和模拟。这类工具通常用于创建概念模型、逻辑模型和物理模型,以及进行系统架构设计。
  2. 软件实施工具:这些工具支持编码、编译、调试和集成等开发活动。它们包括IDE(集成开发环境)、编译器、调试器、版本控制系统等。
  3. 软件模拟工具:这些工具模拟软件系统的行为,以便在部署到实际环境之前进行测试和验证。它们可以模拟系统在各种条件下的行为,包括性能、安全性和可靠性。
  4. 软件测试工具:这些工具用于测试软件系统的质量,以确保其符合预期的功能和性能要求。它们包括自动化测试工具、性能测试工具、代码质量分析工具等。
  5. 软件开发支撑工具:这些工具提供开发团队所需的各种支持,包括项目管理工具、需求管理工具、缺陷跟踪工具等。它们帮助开发团队更好地协作,提高开发效率并确保项目的顺利完成。
软件建模工具
软件实施工具
软件模拟工具
软件测试工具
软件开发支撑工具

云基础软件

云基础软件的基础是虚拟化技术,本节云基础软件主要为虚拟化软件与容器。

  1. 虚拟化技术简介:虚拟化技术是一种将物理硬件资源虚拟化成多个逻辑资源的技术,从而实现资源的共享、灵活配置和高效利用。虚拟化技术是云基础软件的基础。
  2. Hypervisor:Hypervisor是一种虚拟化软件,它允许在物理计算机上创建多个虚拟机,每个虚拟机都可以运行独立的操作系统和应用程序。Hypervisor对虚拟机的管理包括资源分配、隔离、备份和恢复等。
  3. 容器:容器是一种轻量级的虚拟化技术,它可以将应用程序及其依赖项打包成一个独立的容器,并在容器中运行应用程序。容器共享宿主操作系统的内核,因此相比于传统的虚拟化技术,容器具有更高的资源利用率和更快的启动时间。
  4. ARM服务器开源主流解决方案: Xen、KVM 和 Docker:ARM服务器是一种基于ARM架构的服务器,具有低功耗、高性能和高密度等优点。Xen、KVM和Docker是ARM服务器开源主流解决方案,分别提供虚拟化和容器技术,以支持ARM服务器的高效运行和管理。
云基础软件
虚拟化技术简介
Hypervisor
容器
ARM服务器开源主流解决方案: Xen KVM 和 Docker

鲲鹏软件开发模式

原生开发模式

原生开发模式

  1. 物理服务器:物理服务器是一种将硬件服务器资源出租给用户的云服务。用户可以自行安装操作系统和应用程序,拥有完全的控制权。但是,由于需要购买硬件设备和维护,成本相对较高。
  2. 云服务器:云服务器是一种将虚拟机出租给用户的云服务。用户可以在虚拟机上安装操作系统和应用程序,拥有完全的控制权。相比物理服务器,云服务器更加灵活,可以按需购买资源,且维护成本较低。
  3. 搭建原生开发环境示例:这里以Node.js开发环境为例。首先,需要安装Node.js运行环境,可以从官网下载安装程序进行安装。然后,使用npm(Node Package Manager)安装需要的第三方模块。最后,配置好应用所需的环境变量和路由规则等,就可以开始进行开发了。
原生开发模式
物理服务器
云服务器
搭建原生开发环境示例

交叉开发模式

要完成这两个任务,您可以按照以下步骤进行操作:

  1. 搭载 ARM GCC 交叉编译环境:

首先,您需要安装 ARM GCC 交叉编译工具链。这个工具链是一组用于将源代码编译成在 ARM 架构上运行的二进制文件的工具。

以下是在 Ubuntu 或其他 Linux 系统中安装 ARM GCC 交叉编译工具链的步骤:

# 更新系统软件包列表
sudo apt-get update# 安装交叉编译工具链
sudo apt-get install gcc-arm-linux-gnueabi

安装完成后,您可以使用 arm-linux-gnueabi-gcc 命令来运行 ARM GCC 编译器。

如果您使用的是其他操作系统,可以参考相关的文档或资源来安装 ARM GCC 交叉编译环境。

  1. 搭建 QEMU 模拟开发环境:

QEMU(Quick Emulator)是一个开源的模拟器,可用于在计算机上模拟不同的硬件平台和操作系统。

以下是在 Ubuntu 或其他 Linux 系统中安装 QEMU 并配置为模拟 ARM 架构的步骤:

# 安装 QEMU
sudo apt-get install qemu# 下载并解压 ARM 镜像文件(例如,使用 Raspberry Pi 的操作系统)
wget http://downloads.raspberrypi.org/raspbian_lite_latest
unzip raspbian_lite_latest.zip# 在 QEMU 中创建一个虚拟机,并指定使用的镜像文件和模拟的 ARM 架构
qemu-system-arm -machine type=qEMU,kernel=kernel.img,initrd=initrd.img,append="root=/dev/sda2 panic=1 rootfstype=ext4" -m 1024M -display vnc=127.0.0.1:0 -vnc :0

上述命令将启动一个使用 ARM 架构的 QEMU 虚拟机,并加载指定的镜像文件。您可以根据自己的需求调整命令中的参数。

请注意,这只是一个简单的示例,具体的配置可能因您的需求和使用的镜像文件而有所不同。您可以参考 QEMU 的官方文档和相关资源以获取更详细的信息和指导。

搭载 ARM GCC 交叉编译环境
搭建 QEMU 模拟开发环境

云端开发模式

  1. CloudIDE基本特性ClouldIDE
    Cloud IDE(Integrated Development Environment)是一种基于云计算技术的集成开发环境,它提供了一个在线的开发平台,使开发人员能够在浏览器中进行软件开发和协作。以下是Cloud IDE的基本特性:
    wangyejietu

  2. 在线开发环境:Cloud IDE提供了一个完整的开发环境,包括代码编辑器、调试器、编译器、版本控制工具等,使开发人员可以直接在浏览器中进行开发,无需在本地安装和配置开发环境。

  3. 多语言支持:Cloud IDE支持多种编程语言,包括但不限于Java、Python、JavaScript、C++、Ruby等,以满足不同项目和开发需求。

  4. 版本控制集成:Cloud IDE通常与版本控制系统(如Git)紧密集成,方便开发人员对代码进行版本管理、协作和团队合作。

  5. 云存储支持:Cloud IDE允许开发人员将代码和文件存储在云端,避免了本地存储的限制和风险,并方便与团队成员共享和访问。

  6. 调试和测试功能:Cloud IDE提供了调试和测试工具,帮助开发人员在开发过程中进行代码调试和单元测试,以确保代码的质量和稳定性。在这里插入图片描述

  7. 协作和分享:Cloud IDE允许多个开发人员同时在同一个项目上进行协作开发,实时共享代码和编辑器状态,提供了更便捷的协作和沟通方式。

  8. 扩展和插件支持:Cloud IDE通常支持扩展和插件机制,开发人员可以根据自己的需求自定义和集成各种工具和功能。

  9. 跨平台访问:由于Cloud IDE在云端运行,开发人员可以通过浏览器从任何设备(如电脑、平板或手机)访问和使用,实现跨平台开发和远程工作。

Cloud IDE的基本特性使其成为开发人员在团队协作、敏捷开发和学习等场景中的有力工具。但也需要考虑网络连接和应用性能等因素对开发体验的影响。

  1. CloudIDE操作流程

以下是典型的Cloud IDE操作流程:

  1. 注册和登录:访问Cloud IDE提供商的网站,注册一个新账号并登录。

  2. 创建项目:在Cloud IDE界面中创建一个新项目或导入现有项目。你可以选择命名项目并指定项目的语言和框架。

  3. 编辑代码:打开项目文件并使用内置的代码编辑器修改代码。Cloud IDE通常提供代码自动完成、语法高亮和代码格式化等功能,以提高开发效率。

  4. 调试与测试:如果需要进行调试和测试,Cloud IDE通常提供集成的调试器和单元测试工具。你可以设置断点、监视变量和执行代码以进行调试,并编写和运行单元测试。

  5. 版本控制:Cloud IDE通常与版本控制系统(如Git)集成,你可以将文件添加到代码仓库、提交更改、拉取和推送代码,并管理分支和合并请求等。

  6. 构建和部署:根据项目需求,Cloud IDE可能提供构建和部署工具,用于将代码构建为可执行文件、库或安装包,并将其部署到测试环境或生产服务器。

  7. 协作开发:Cloud IDE通常支持多人协作开发功能。你可以邀请团队成员加入项目、共享代码、进行实时编辑和交流,并跟踪其他人的更改。

  8. 保存和同步:Cloud IDE会自动保存你的代码更改,并通过云存储服务同步你的项目文件,以便在不同设备上访问和继续开发。

  9. 扩展和定制:根据需要,你可以根据Cloud IDE提供的扩展机制,安装和使用插件来增强编辑器、集成其他开发工具或添加自定义功能。

  10. 导出和部署:一旦你完成了项目开发,你可以导出项目文件并将其部署到实际的生产环境,或打包为可分发的应用程序。

  1. CloudIDE使用示例
    以下是一个示例Cloud IDE的使用流程:
1. 注册和登录:访问Cloud IDE提供商的网站,点击注册按钮创建一个新账号,并使用注册的账号登录。2. 创建项目:在Cloud IDE界面中点击"New Project"按钮,选择一个项目模板或创建一个空项目。输入项目名称并选择语言和框架。3. 编辑代码:在Cloud IDE的编辑器中打开项目文件,开始编写代码。你可以使用代码自动完成、语法高亮和代码格式化等功能来提高开发效率。4. 调试与测试:如果需要调试代码,你可以在编辑器中设置断点,单步执行代码,并查看变量的值以进行调试。另外,你可以编写单元测试并运行测试来验证代码的正确性。5. 版本控制:Cloud IDE通常提供与Git等版本控制系统的集成。你可以将代码添加到本地仓库、提交更改并推送到远程仓库。还可以查看提交历史、分支和合并请求等。6. 构建和部署:根据你的项目需求,Cloud IDE可能会提供构建和部署工具。你可以使用这些工具将代码构建为可执行文件、库或安装包,并将其部署到测试环境或生产服务器。7. 协作开发:Cloud IDE通常支持多人协作开发功能。你可以邀请团队成员加入项目,并共享代码和编辑器状态。这样你们可以一起编辑代码、讨论和解决问题。8. 保存和同步:Cloud IDE会自动保存你的代码更改,并将项目文件同步到云存储中。这样你可以在不同设备上访问和继续开发,而无需担心数据丢失。9. 扩展和定制:根据需要,你可以浏览Cloud IDE提供的插件市场,并安装适合你项目的插件。这些插件可以增强编辑器功能、集成其他工具或添加自定义功能。10. 导出和部署:完成项目开发后,你可以导出项目文件,并将其部署到实际的生产环境。你还可以将项目打包为可分发的应用程序,以便分享给其他人使用
注册和登录
创建项目
编辑代码
调试与测试
版本控制
构建和部署
协作开发
保存和同步
扩展和定制
导出和部署

参考文献:《鲲鹏处理器 架构与编程》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111407.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 项目性能优化 — 实践指南

前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题,所…

自然语言处理(四):全局向量的词嵌入(GloVe)

全局向量的词嵌入(GloVe) 全局向量的词嵌入(Global Vectors for Word Representation),通常简称为GloVe,是一种用于将词语映射到连续向量空间的词嵌入方法。它旨在捕捉词语之间的语义关系和语法关系&#…

Python小知识 - Python中的多线程

Python中的多线程 线程是进程中的一个执行单元,是轻量级的进程。一个进程可以创建多个线程,线程之间共享进程的资源,比如内存、文件句柄等。 在Python中,使用threading模块实现线程。 下面的代码创建了两个线程,一个输…

2023.8.29 关于性能测试

目录 什么是性能测试? 性能测试常见术语及其性能测试衡量指标 并发 用户数 响应时间 事务 点击率 吞吐量 思考时间 资源利用率 性能测试分类 基准性能测试 负载性能测试 压力性能测试 可靠性性能测试 性能测试执行流程 什么是性能测试? 性…

实用的面试经验分享:程序员们谈论他们的面试历程

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

docker 学习-- 04 实践2 (lnpmr环境)

docker 学习 系列文章目录 docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 docker 学习-- 03 环境安装 docker 学习-- 04 实践 1(宝塔) docker 学习-- 04 实践 2 (lnpmr环境) 文章目录 docker 学习 系列文章目录1. 配…

财务数据分析?奥威BI数据可视化工具很擅长

BI数据可视化工具通常是可以用户各行各业,用于不同主题的数据可视化分析,但面对财务数据分析这块难啃的骨头,能够好好地完成的,还真不多。接下来要介绍的这款BI数据可视化工具不仅拥有内存行列计算模型这样的智能财务指标计算功能…

flutter 上传图片并裁剪

1.首先在pubspec.yaml文件中新增依赖pub.dev image_picker: ^0.8.75 image_cropper: ^4.0.1 2.在Android的AndroidManifest.xml文件里面添加权限 <activityandroid:name"com.yalantis.ucrop.UCropActivity"android:screenOrientation"portrait"andro…

Django基础7——用户认证系统、Session管理、CSRF安全防护机制

文章目录 一、用户认证系统二、案例&#xff1a;登陆认证2.1 平台登入2.2 平台登出2.3 login_required装饰器 三、Django Session管理3.1 Django使用Session3.1.1 Cookie用法3.1.2 Session用法 3.2 案例&#xff1a;用户登录认证 四、Django CSRF安全防护机制 一、用户认证系统…

3d激光slam建图与定位(2)_aloam代码阅读

1.常用的几种loam算法 aloam 纯激光 lego_loam 纯激光 去除了地面 lio_sam imu激光紧耦合 lvi_sam 激光视觉 2.代码思路 2.1.特征点提取scanRegistration.cpp&#xff0c;这个文件的目的是为了根据曲率提取4种特征点和对当前点云进行预处理 输入是雷达点云话题 输出是 4种特征点…

透过源码理解Flutter InheritedWidget

InheritedWidget的核心是保存值和保存使用这个值的widget&#xff0c;通过对比值的变化&#xff0c;来决定是否要通知那些使用了这个值的widget更新自身。 1 updateShouldNotify和notifyClients InheritedWidget通过updateShouldNotify函数控制依赖其的子组件是否在Inherited…

vue cli构建的项目出现 Uncaught runtime errors

使用 vue/cli 脚手架构建的项目&#xff0c;在 npm run dev 运行后&#xff0c;页面出现 Uncaught runtime errors 报错遮罩层&#xff0c;如下图所示。 报错原因 这种错误通常是运行时出的问题&#xff0c;可能是网络错误&#xff0c;可能是变量未定义等等。 这种错误默认在开…

七、Kafka-Kraft 模式

目录 7.1 Kafka-Kraft 架构7.2 Kafka-Kraft 集群部署 7.1 Kafka-Kraft 架构 左图为 Kafka 现有架构&#xff0c;元数据在 zookeeper 中&#xff0c;运行时动态选举 controller&#xff0c;由controller 进行 Kafka 集群管理 右图为 kraft 模式架构&#xff08;实验性&#xff…

华为数通方向HCIP-DataCom H12-821题库(单选题:161-180)

第161题 以下关于 URPF(Unicast Reverse Path Forwarding) 的描述&#xff0c; 正确的是哪一项 A、部署了严格模式的 URPF&#xff0c;也能够可以同时部署允许匹配缺省路由模式 B、如果部署松散模式的 URPF&#xff0c;默认情况下不需要匹配明细路由 C、如果部署松散模式的…

Java IDEA Web 项目 1、创建

环境&#xff1a; IEDA 版本&#xff1a;2023.2 JDK&#xff1a;1.8 Tomcat&#xff1a;apache-tomcat-9.0.58 maven&#xff1a;尚未研究 自行完成 IDEA、JDK、Tomcat等安装配置。 创建项目&#xff1a; IDEA -> New Project 选择 Jakarta EE Template&#xff1a;选择…

RT-Thread在STM32硬件I2C的踩坑记录

RT-Thread在STM32硬件I2C的踩坑记录 0.前言一、软硬件I2C区别二、RT Thread中的I2C驱动三、尝试适配硬件I2C四、i2c-bit-ops操作函数替换五、Attention Please!六、总结 参考文章&#xff1a; 1.将硬件I2C巧妙地将“嫁接”到RTT原生的模拟I2C驱动框架 2.基于STM32F4平台的硬件I…

Git小白入门——了解分布式版本管理和安装

Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09; 什么是版本控制系统&#xff1f; 程序员开发过程中&#xff0c;对于每次开发对各种文件的修改、增加、删除&#xff0c;达到预期阶段的一个快照就叫做一个版本。 如果有一…

iOS开发Swift-1-Xcode创建项目

1.创建项目 双击Xcode App&#xff0c;选择Create a new Xcode project。 选择创建一个iOS普通的App项目。选择Single View App&#xff0c;点击Next。 填写项目名&#xff0c;组织名称等&#xff0c;点击next。 选择好文件的存储路径&#xff0c;点击create。 2.为前端添加组件…

Unity3D 如何在ECS架构下,用Unity引擎进行游戏开发详解

前言 Unity3D是一款强大的游戏引擎&#xff0c;它提供了丰富的功能和工具&#xff0c;可以帮助开发者快速构建高质量的游戏。而Entity Component System&#xff08;ECS&#xff09;是Unity3D中一种新的架构模式&#xff0c;它可以提高游戏的性能和可扩展性。本文将详细介绍在…

【链表OJ】相交链表 环形链表1

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 一.leetcode 160. 相交链表 1.问题描述: 2.解题思路: 二.leetcode 141.环形链表 …