第二天:系统从BIOS/UEFI到GRUB/bootloader的启动过程

目录

  • **一、BIOS/UEFI初始化阶段**
  • **二、引导加载程序(GRUB)的启动过程**
    • **1. BIOS模式下的GRUB分阶段加载**
    • **2. UEFI模式下的GRUB加载**
  • **三、操作系统内核加载与初始化**
  • **四、关键组件与配置文件**
  • **五、故障排查与恢复**
  • **总结**
  • 常见问题
    • 如何在UEFI模式下修复GRUB引导加载程序?
    • BIOS与UEFI在硬件初始化阶段有哪些具体的不同?
    • GRUB配置文件`/boot/grub/grub.cfg`的详细编辑指南是什么?
    • initramfs的作用及其在系统启动过程中的具体步骤是什么?
      • initramfs的作用
      • initramfs在系统启动过程中的具体步骤
      • initramfs与initrd的区别
      • 实际应用
    • 在多操作系统环境中,如何配置GRUB以支持多系统启动?

一、BIOS/UEFI初始化阶段

  1. 硬件自检(POST)

    • BIOS/UEFI通电后首先执行硬件自检(Power-On Self Test),检查CPU、内存、硬盘等设备的运行状态,确保硬件正常。
    • UEFI相比传统BIOS更先进,支持**GPT分区表、安全性增强(如Secure Boot)**和更快的启动速度。
  2. 硬件初始化与配置加载

    • BIOS/UEFI初始化系统硬件,读取CMOS(或NVRAM)中的配置参数,如启动顺序、时间设置等。
    • UEFI还会加载**内置驱动程序(如网络驱动、USB驱动)**以支持更多外设。
  3. 启动设备搜索

    • 根据配置的启动顺序(如硬盘、光驱、USB),BIOS/UEFI识别可引导设备并加载其引导记录:
  • BIOS模式:加载硬盘的主引导记录(MBR,512字节),其中包含引导代码(446字节)和分区表(64字节)。
  • UEFI模式:直接加载EFI分区中的引导程序(如EFI/BOOT/bootx64.efi)。

二、引导加载程序(GRUB)的启动过程

1. BIOS模式下的GRUB分阶段加载

  • Stage 1

    • BIOS将MBR中的引导代码(Stage 1)加载到内存地址0x7C00并执行。

    • Stage 1代码会跳转到MBR后的未分配空间(或分区表后的空间),加载Stage 1.5。

  • Stage 1.5

    • 处理文件系统(如ext4、NTFS),定位并加载Stage 2的GRUB核心模块。
    • 此阶段支持GRUB的高级功能,如菜单选择、内核参数编辑。
  • Stage 2

    • 加载GRUB配置文件(如/boot/grub2/grub.cfg),显示启动菜单,允许用户选择操作系统或内核版本。
    • 根据配置加载内核(如vmlinuz)和初始化内存文件系统(initramfs)到内存。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. UEFI模式下的GRUB加载

  • UEFI直接加载EFI分区中的GRUB二进制文件(如/EFI/BOOT/bootx64.efi),跳过MBR阶段。
  • GRUB在UEFI环境中同样执行Stage 2的加载流程,但无需Stage 1的中继。

三、操作系统内核加载与初始化

  1. 内核加载

    • GRUB将内核镜像(如vmlinuz)和initramfs加载到内存。
    • 内核参数(如root=/dev/sda1 ro quiet splash)通过GRUB传递给内核。
  2. 内核初始化

    • 内核接管系统控制权,初始化硬件(如CPU模式切换、内存管理)、挂载根文件系统(通过initramfs)。
    • 启动第一个用户空间进程(PID 1),通常是systemd(现代Linux)或init(传统系统)。

在这里插入图片描述

四、关键组件与配置文件

  • GRUB配置文件/boot/grub2/grub.cfg定义了启动菜单选项及内核参数。
  • initramfs:临时文件系统,用于在真实根文件系统挂载前提供驱动和工具。
  • /boot目录:存放内核镜像、GRUB模块和其他引导文件。

五、故障排查与恢复

  • 引导修复:若MBR损坏,可通过grub-install命令重新安装GRUB。
  • 紧急模式:通过GRUB菜单编辑参数(如init=/bin/bash)进入紧急Shell。
  • 密码恢复:在GRUB菜单编辑启动参数(如rw init=/bin/bash)绕过登录。

总结

系统启动流程从BIOS/UEFI的硬件初始化开始,通过引导加载程序(如GRUB)加载内核和initramfs,最终由内核启动用户空间进程。BIOS与UEFI的核心区别在于引导方式(MBR vs. EFI分区)和功能扩展,而GRUB作为灵活的引导管理器,支持多系统选择和内核参数定制。

常见问题

如何在UEFI模式下修复GRUB引导加载程序?

在UEFI模式下修复GRUB引导加载程序,可以按照以下步骤进行:

  1. 确认UEFI模式
    首先,确保你的系统是UEFI模式。可以通过检查/sys/firmware/efi/efi system目录是否存在来确认。

  2. 进入Live系统
    使用Live CD或Live USB启动系统。这将允许你在不破坏现有系统的情况下进行修复操作。

  3. 挂载分区
    在Live系统中,挂载你的根分区。例如,如果根分区是/dev/sda1,可以使用以下命令:

   sudo mount /dev/sda1 /mnt
  1. 进入chroot环境
    进入挂载的根分区,使其成为当前的工作目录:
   sudo chroot /mnt
  1. 更新GRUB配置
    在chroot环境中,运行以下命令来更新GRUB配置:
   update-grub

这将扫描系统并更新GRUB配置文件。

  1. 安装GRUB到EFI分区
    使用以下命令将GRUB安装到EFI分区:
   grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

确保/boot/efi目录已经存在并且包含EFI分区。

  1. 更新GRUB配置文件
    再次运行update-grub命令,确保所有启动项都被正确识别和添加到GRUB菜单中。

  2. 重启系统
    重启系统,检查GRUB是否正常启动。如果一切正常,你应该能看到GRUB菜单,并能够选择启动不同的操作系统。

  3. 检查Secure Boot状态
    如果你的系统启用了Secure Boot,可能需要禁用它才能正常启动GRUB。可以通过BIOS设置来禁用Secure Boot。

  4. 其他注意事项

  • 如果GRUB仍然无法启动,可以尝试使用efibootmgr工具来手动设置启动项。例如,使用以下命令查看当前的EFI启动项:
      efibootmgr -v

然后,使用以下命令设置新的启动项:

      efibootmgr -c -d /dev/sda -p 1 -l /EFI/your-distribution/grubx64.efi 

其中,/dev/sda是包含EFI分区的设备,1是EFI分区的分区号,grubx64.efi 是GRUB的启动文件。

通过以上步骤,你应该能够在UEFI模式下成功修复GRUB引导加载程序。

BIOS与UEFI在硬件初始化阶段有哪些具体的不同?

BIOS(基本输入输出系统)和UEFI(统一可扩展固件接口)在硬件初始化阶段存在一些具体的不同。以下是详细的对比:

  1. 初始化过程的复杂性和速度

    • BIOS:BIOS在启动时会执行基本的硬件自检(POST),包括内存、显卡、键盘等组件的检测。这个过程相对简单,但速度较慢,通常需要几秒钟的时间来完成所有检测和初始化工作。
    • UEFI:UEFI的初始化过程更为精细和高效。它不仅检测和初始化所有连接的硬件设备,如CPU、内存、硬盘、显卡等,还可以利用多核处理器并行处理这些任务,显著缩短了初始化时间。
  2. 硬件支持

    • BIOS:BIOS主要支持32位硬件接口,因此在处理现代硬件时可能会遇到限制。例如,BIOS通常不支持超过4GB的内存。
    • UEFI:UEFI支持64位硬件接口,可以处理更大的内存容量,支持更大的硬盘容量,并提供更多的硬件支持。
  3. 启动加载程序

    • BIOS:BIOS使用MBR(主引导记录)格式的引导加载程序,这种格式主要用于硬盘分区和引导加载程序的加载。
    • UEFI:UEFI使用GPT(GUID分区表)格式的引导加载程序,这种格式不仅提供了更灵活的分区管理,还支持更大的硬盘容量和更快的启动速度。
  4. 安全性

    • BIOS:BIOS的安全性较低,容易受到恶意软件的攻击。
    • UEFI:UEFI提供了更高的安全性,包括安全启动、固件签名验证和安全启动验证等功能。
  5. 启动流程

    • BIOS:BIOS启动流程包括系统开机、POST、读取主引导记录(MBR)并执行其代码、加载引导程序。
    • UEFI:UEFI启动流程包括系统开机、POST、加载UEFI固件、读取固件中的引导条目以确定要启动的引导应用、加载引导应用(可能来自内核、Arch引导器或根文件系统)、执行引导应用。
  6. 平台初始化(PI)阶段

    • BIOS:BIOS没有明确的平台初始化阶段,直接进入引导加载程序的加载。
    • UEFI:UEFI的平台初始化(PI)阶段包括PEI(Pre-EFI初始化)、DXE(Driver Execution Environment)、BDS(Boot Services Driver)、TSL(Temporary System Services)和RT(Run Time)等阶段。这些阶段确保了从操作系统接管到上电的整个过程,包括处理器、芯片组和平台配置,以及内存初始化。

总结来说,BIOS和UEFI在硬件初始化阶段的主要区别在于初始化过程的速度和复杂性、硬件支持能力、启动加载程序的格式、安全性和启动流程的细节。

GRUB配置文件/boot/grub/grub.cfg的详细编辑指南是什么?

GRUB配置文件/boot/grub/grub.cfg 是GRUB启动加载程序的核心配置文件,通常位于/boot/grub//boot/grub2/目录下。该文件由grub-mkconfig工具自动生成,包含了GRUB启动菜单的所有配置项。编辑此文件时需要特别小心,因为错误的配置可能导致系统启动失败。

  1. 编辑前的准备
    在编辑grub.cfg 文件之前,建议进行以下准备工作:
  • 备份原始文件:使用命令sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg original备份原始文件。
  • 确认编辑器:确保使用正确的编辑器,例如sudo nano /boot/grub/grub.cfg
  • 设置文件为可写状态:使用命令sudo chmod +w /boot/grub/grub.cfg
  1. 配置文件结构
    grub.cfg 文件通常包含以下部分:
  • 全局设置(Global Settings) :定义GRUB的全局设置,如默认启动项、超时时间、终端输出等。
  • 菜单项(Menu Entries) :定义每个操作系统或内核的启动项,每个启动项以menuentry关键字开头。
  • 模块和扩展(Modules and Extensions) :包含GRUB加载的特定模块,如图形界面、密码保护等。
  1. 常见配置项
    以下是一些常见的配置项及其用途:
  • 设置默认启动项:使用set default=0设置默认启动项。
  • 添加支持:例如,使用insmod jpeg支持JPEG图片格式,使用insmod tga支持TGA或PNG背景图片。
  • 设置root分区:使用root=(hd0,7)指定root分区。
  • 设置超时时间:使用timeout=10设置启动菜单的超时时间。
  • 设置背景图片:使用background_image /boot/grub背景图片.jpg设置背景图片。
  • 设置终端配置:包括终端字体、分辨率、颜色等。
  • 添加Linux引导项:使用menuentry 'Ubuntu' --class ubuntu --id ubuntu --record --linux /boot/vmlinuz-4.15.0-166-generic --initrd /boot初始化/vmlinuz-4.15.0-166-generic --rootUUID=UUID=12345678-1234-1234-1234-1234567890abcdef --ro'添加自定义启动项。
  • 添加Windows引导项:使用类似的方法添加Windows系统的启动项。
  1. 其他注意事项
  • 避免直接编辑:由于grub.cfg 文件是自动生成的,直接编辑可能会在更新GRUB时被覆盖。建议通过修改/etc/default/grub文件并执行sudo update-grub来生成新的grub.cfg 文件。
  • 使用注释:在需要临时禁用条目时,可以在条目前添加#字符。
  • 遵循GRUB语法:例如,指定内核路径时使用linux而不是Linux
  1. 示例配置
    以下是一个简单的示例配置,展示了如何设置默认启动项、添加支持和设置背景图片:
set default=0
insmod jpeg
insmod tga
root=(hd0,7)
search --no-floppy --label --set UUID=12345678-1234-1234-1234-1234567890abcdef
timeout=10
background_image /boot/grub背景图片.jpg
  1. 更新配置
    完成编辑后,需要更新GRUB配置以应用更改:
sudo update-grub

initramfs的作用及其在系统启动过程中的具体步骤是什么?

initramfs(Initial RAM Filesystem)在Linux系统启动过程中扮演着至关重要的角色。它是一个临时文件系统,包含了内核启动所需的文件系统模块和驱动程序,确保内核能够顺利加载真正的根文件系统。以下是initramfs的作用及其在系统启动过程中的具体步骤:

initramfs的作用

  1. 提供必要的文件系统支持:initramfs中包含了内核启动所需的文件系统模块和驱动程序,使得内核能够顺利加载真正的根文件系统。
  2. 简化内核启动过程:通过提前加载必要的文件系统和驱动程序,initramfs减少了内核启动时的复杂性,提高了系统启动的稳定性和可靠性。
  3. 支持特定的启动需求:initramfs可以根据系统的需求定制,包含特定的文件系统和驱动程序,以满足特定的启动需求。

initramfs在系统启动过程中的具体步骤

  1. 硬件初始化:系统启动后,首先进行硬件初始化,包括CPU、内存、I/O设备等的初始化。
  2. 加载内核和initramfs:bootloader将内核和initramfs加载到内存中。此时,initramfs作为一个临时文件系统被挂载到/目录下。
  3. 内核内核加载:内核开始执行,加载必要的驱动模块和设备工具。
  4. 运行initramfs中的程序:initramfs中包含的程序开始运行,探测硬件设备并加载所需的驱动程序。这些程序通常包括init脚本,用于执行一系列初始化任务。
  5. 挂载真正的根文件系统:在initramfs中加载的驱动程序和设备工具准备好后,系统会卸载initramfs并挂载真正的根文件系统。此时,initramfs被解压并释放内存。
  6. 切换到用户空间:系统切换到用户空间,执行/sbin/init或其他指定的启动脚本,进入正常运行状态。

initramfs与initrd的区别

initramfs与传统的initrd(Initial RAM Disk)相比,具有以下优势:

  1. 动态扩展性:initramfs基于RAMFS技术,具有动态扩展和自动内存管理的特点,可以根据需要按需加载驱动,保持系统的灵活性和稳定性。
  2. 减少内核负担:initramfs将许多驱动和工具从内核中分离出来,避免了将所有驱动编译进内核的复杂性。

实际应用

在实际应用中,initramfs可以用于多种场景,例如:

  1. 系统修复:在系统启动失败时,可以通过修改initramfs来修复系统。
  2. 轻量级启动:通过构建最小的initramfs文件系统,可以实现轻量级启动,减少内核启动时间。
  3. 密码重置:在某些情况下,可以通过修改initramfs来重置root用户密码。

在多操作系统环境中,如何配置GRUB以支持多系统启动?

在多操作系统环境中,配置GRUB以支持多系统启动需要遵循以下步骤:

  1. 安装GRUB
    • 首先,确保GRUB已经安装在你的系统中。通常,GRUB会自动安装在BIOS或UEFI启动分区上。如果未安装,可以使用以下命令进行安装:
     sudo grub-install /dev/sda

其中/dev/sda是你的启动盘设备名。

  1. 生成GRUB配置文件
    • 使用grub-mkconfig命令生成GRUB配置文件。这个文件包含了GRUB的启动菜单和启动项配置。通常,这个文件位于/boot/grub/grub.cfg 。可以使用以下命令生成配置文件:
     sudo grub-mkconfig -o /boot/grub/grub.cfg 

这个命令会根据当前的系统配置生成一个新的grub.cfg 文件。

  1. 编辑GRUB配置文件
    • GRUB配置文件通常位于/etc/default/grub。你可以通过编辑这个文件来修改GRUB的行为。例如,你可以设置默认启动的系统、菜单项停留时间等。编辑该文件时,可以使用以下命令:
     sudo nano /etc/default/grub

在文件中,你可以找到类似以下的配置项:

     #GRUB_DEFAULT=0
     #GRUB_TIMEOUT=10

其中,GRUB_DEFAULT表示默认启动的系统索引,GRUB_TIMEOUT表示菜单停留时间(秒)。你可以根据需要修改这些值。

  1. 更新GRUB配置
    • 修改完配置文件后,需要重新生成GRUB配置文件以应用更改:
     sudo grub-mkconfig -o /boot/grub/grub.cfg 

这样,GRUB会根据新的配置文件重新生成启动菜单。

  1. 处理特定操作系统的启动项
    • 如果你有多个操作系统(如Windows、Linux等),需要确保每个操作系统的启动项都能被GRUB正确识别。例如,对于Windows,可能需要手动添加启动项。可以使用以下命令手动添加Windows启动项:
     sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub

其中,/boot/efi是EFI分区的挂载点。

  1. 验证GRUB配置

    • 最后,可以通过启动计算机并检查GRUB菜单来验证配置是否正确。如果一切正常,你应该能看到所有可用的操作系统启动选项。
  2. 注意事项

    • 在多系统环境中,确保每个操作系统的引导加载程序(如Windows的NTLOADER、Linux的GRUB)都正确安装在各自的启动分区上。
    • 如果遇到GRUB无法识别某些操作系统的启动项,可以尝试使用Windows的启动修复工具来修复Windows的引导加载程序。
    • 在某些情况下,可能需要调整BIOS或UEFI设置中的启动顺序,以确保GRUB能够正确加载所有操作系统的启动项。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

113,【5】 功防世界 web unseping

进入靶场 代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;方便开发者查看代码结构和内容 highlight_file(__FILE__);// 定义一个名为 ease 的类 class ease {// 私有属性 $method&#xff0c;用于存储要调用的方法名private $method;// 私有属性 $args&…

图解BWT(Burrows-Wheeler Transform) 算法

Burrows-Wheeler Transform (BWT) 是一种数据转换算法, 主要用于数据压缩领域. 它由 Michael Burrows 和 David Wheeler 在 1994 年提出, 广泛应用于无损数据压缩算法(如 bzip2)中. BWT 的核心思想是通过重新排列输入数据, 使得相同的字符更容易聚集在一起, 从而提高后续压缩算…

DeepSeek辅助学术写作【句子重写】效果如何?

句子重写(功能指数:★★★★★) 当我们想引用一篇文章中的一-些我们认为写得很好的句子时&#xff0c;如果直接将原文加人自己的文章&#xff0c;那么即使我们标注上了引用&#xff0c;也依旧会被查重软件计算在重复比例中。查重比例过高的话&#xff0c;会影响投稿或毕业答辩送…

【CAD】卸载清理注册表后安装失败/错误 1402无法打开主键:UNKNOWN Components DAFE。。。

这是因为注册表中的 CurrentVersion\Installer\UserData二级子目录中Components的文件缺少权限&#xff0c;只需要将权限添加为administors即可 一图流&#xff0c;就是把权限给到Administrators&#xff0c;然后就再以管理员权限安装就可以了&#xff0c;还有如果破解的软件可…

w192中国陕西民俗网的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

2.6日学习总结

题目一&#xff1a; AC代码&#xff1a; #include <stdio.h>// 宏 _for 用于简化 for 循环 #define _for(i, a, b) for (int i (a); i < (b); i)// 最大节点数 #define MAXN 1000010// 树节点结构体 typedef struct {int left;int right; } Node;// 树节点数组 Nod…

【数据结构】(4) 线性表 List

一、什么是线性表 线性表就是 n 个相同类型元素的有限序列&#xff0c;每一个元素只有一个前驱和后继&#xff08;除了第一个和最后一个元素&#xff09;。 数据结构中&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列。 二、什么是 List List 是 Java 中的线性…

工控机的主要功能有那些?

工控机的主要功能包括&#xff1a;数据采集与处理&#xff0c;工控机可以连接多种传感器和输入设备&#xff0c;实时采集数据&#xff0c;并进行必要的处理和分析。其次 就是控制执行&#xff1a;在自动化生产线或机器人控制系统中&#xff0c;工控机根据预设的程序或实时数据执…

链式结构二叉树(递归暴力美学)

文章目录 1. 链式结构二叉树1.1 二叉树创建 2. 前中后序遍历2.1 遍历规则2.2 代码实现图文理解 3. 结点个数以及高度等二叉树结点个数正确做法&#xff1a; 4. 层序遍历5. 判断是否完全二叉树 1. 链式结构二叉树 完成了顺序结构二叉树的代码实现&#xff0c;可以知道其底层结构…

凝思60重置密码

凝思系统重置密码 - 赛博狗尾草 - 博客园 问题描述 凝思系统进入单用户模式&#xff0c;在此模式下&#xff0c;用户可以访问修复错误配置的文件。也可以在此模式下安装显卡驱动&#xff0c;解决和已加载驱动的冲突问题。 适用范围 linx-6.0.60 linx-6.0.80 linx-6.0.100…

MDPI的论文书写

一、作者信息 二、摘要 1、先写背景&#xff0c;将问题放到大背景里面&#xff0c;然后重点说明研究的目的。

2-kafka服务端之延时操作实现原理

文章目录 背景案例延时生产实现原理延时拉取实现原理 总结 背景 上篇我们说到了kafka时间轮是延时操作内部实现的重要数据结构&#xff0c;这篇我们来说下kafka内部的延时操作实现原理。这里我们以延时生产和延时拉取为例说明延时操作的实现原理。 案例 延时生产 我们知道如…

无心剑七绝《深度求索》

七绝深度求索 深研妙理定乾坤 度世玄机启智门 求路千难兼万险 索萦华夏自为尊 2025年2月1日 平水韵十三元平韵 无心剑七绝《深度求索》以平水韵十三元平韵写成&#xff0c;意境深远&#xff0c;气势磅礴。诗中“深研妙理定乾坤”开篇点题&#xff0c;展现出对深奥道理的钻研与探…

C++多级指针图解

AudioResample **pResample 指针的地址图解AudioResample **pResample; // pResample 存储 AudioResample* 的地址 AudioResample *ar *pResample; // ar 现在指向 AudioResample 结构体 pResample → 指向 AudioResample* 的地址 (0x2000)*pResample → 取出 AudioResample…

oracle基础语法

oracle基础语法 1、增删改查1.1查询语句1.2 修改语句1.3 删除表1.4 删除数据1.5 增加数据1.6 创建视图1.7 添加视图字段注释 1、增删改查 oracle与sql server语法上大致相同&#xff0c;但有些细微的不同&#xff0c;以下是我个人记录工作中常用到的一些语法句。 1.1查询语句…

数据库------------

一 mysql ----数据库就相当于一个端口 1. 三层结构 1&#xff09;数据库中 表的本质仍然是文件 1.1 mysql常用数据类型---&#xff08;即 mysql列类型&#xff09; 1&#xff09; 数值类型 2&#xff09; 文本类型 3&#xff09; 二进制数据类型 4&#xff09;日期类型 2. sq…

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中&#xff0c;模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别&#xff0c;如何高效、稳定地将深度学习模型部署到…

25/2/6 <机器人基础> 运动学中各连杆的变换矩阵求法

变换矩阵 机器人通常包含多个关节和连杆&#xff0c;每个关节和连杆都有自己的局部坐标系。变换矩阵能够将一个点或向量从一个坐标系转换到另一个坐标系&#xff0c;从而实现对机器人各个部件位置和姿态的统一描述 变换矩阵能够将复杂的运动分解为旋转和平移的组合。通过矩阵乘…

CS 与 BS 架构的差异

在数字化的今天&#xff0c;选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式&#xff0c;了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现&#xff0c;当时用户直接从主机获取数据。随着客户端和服务端…

Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践

Vuex 是 Vue.js 中的状态管理模式&#xff0c;广泛应用于 Vue 2 和 Vue 3 中&#xff0c;其内部实现存在一些差异。 1. 什么是 Vuex &#xff1f; Vuex 是 Vue.js 官方提供的状态管理库&#xff0c;用于集中管理应用的所有组件的状态。主要是通过一种集中化的方式来管理共享状…