Linux x86_64 BIOS 启动

文章目录

  • 前言
  • 一、BIOS简介
  • 二、MBR
  • 三、Linux BIOS 启动
    • 3.1 BIOS stage
    • 3.2 Boot Loader Stage
      • 3.2.1 boot.img
      • 3.2.2 core.img
      • 3.2.3 *.mod
    • 3.3 Kernel Stage
  • 参考资料

前言

本文以 centos 6/7 (2.6.32/3.10.0 ),x86_64平台为例。

固件保存在主板上的 ROM 中,是计算机上电后执行的第一段程序。固件启动阶段的核心功能包括硬件初始化、硬件自检和加载 bootloader,最终会把控制权转交给给 bootloader。
固件启动阶段主要有两种启动方式:Legacy BIOS 和 UEFI。

这篇文章描述了Linux x86_64 UEFI 启动过程:Linux x86_64 UEFI 启动,接下来描述Linux x86_64 UEFI 启动过程。

VMware Workstation Pro安装虚拟机默认都是BIOS启动:
在这里插入图片描述

其启动过程如下:

在这里插入图片描述
详细过程:
在这里插入图片描述

一、BIOS简介

在计算机领域,BIOS(Basic Input/Output System,基本输入/输出系统)是一种固件,用于为操作系统和程序提供运行时服务,并在引导过程(开机启动)中执行硬件初始化。BIOS固件预装在IBM PC或IBM PC兼容系统主板上,并存在于一些基于UEFI的系统中,以保持与不支持UEFI本机操作的操作系统的兼容性。这个名字起源于1975年CP/M操作系统中使用的基本输入/输出系统。最初专有于IBM PC的BIOS已被一些公司(如Phoenix Technologies)逆向工程,用于创建兼容系统。原始系统的接口成为事实上的标准。

在旧版PC中,BIOS初始化和测试系统硬件组件(自检或POST),并从存储设备加载引导加载程序,然后初始化内核。在DOS时代,BIOS为键盘、显示器、存储和其他输入/输出(I/O)设备提供了BIOS中断调用,标准化了应用程序和操作系统的接口。更近期的操作系统在启动后不再使用BIOS中断调用。

大多数BIOS实现都专门设计用于特定的计算机或主板型号,通过与各种设备特别是系统芯片组进行接口交互。最初,BIOS固件存储在PC主板上的ROM芯片中。在后期的计算机系统中,BIOS内容存储在闪存存储器中,因此可以在不移除主板上的芯片的情况下进行重写。这使得用户可以轻松更新BIOS固件,以添加新功能或修复错误,但也为计算机感染BIOS恶意软件提供了可能性。

统一可扩展固件接口(UEFI)是传统PC BIOS的后继者,旨在解决其技术限制。自2019年起,所有面向英特尔平台的PC不再支持传统BIOS。

二、MBR

主引导记录(Master Boot Record,MBR)是位于计算机分区的固定磁盘或可移动驱动器等大容量存储设备的前几个扇区中的一种引导扇区类型,用于与IBM PC兼容系统及更高版本的系统一起使用。MBR的概念在1983年的PC DOS 2.0中首次公开引入。

MBR保存了关于磁盘扇区(也称为"块")如何划分为分区的信息,每个分区理论上包含一个文件系统。MBR还包含可执行代码,用作已安装操作系统的加载程序,通常通过将控制权传递给加载程序的第二阶段或与每个分区的卷引导记录(Volume Boot Record,VBR)结合使用。这段MBR代码通常被称为引导加载程序。

MBR中的分区表组织方式将分区磁盘的最大寻址存储空间限制为2 TiB(232 × 512字节)。采用32位算术或4096字节扇区来略微提高这个限制的方法没有得到官方支持,因为这将破坏与现有引导加载程序、大多数MBR兼容的操作系统和相关系统工具的兼容性,并在狭义的系统环境之外使用时可能导致严重的数据损坏。因此,基于MBR的分区方案正在逐步被GUID分区表(GUID Partition Table,GPT)方案取代。GPT可以与MBR共存,以提供对旧系统的某种有限的向后兼容性。

MBR由位于驱动器的第一个扇区中的512字节组成。

一个经典的通用MBR的结构:

AddressDescriptionSize(bytes)
0x0000 (0)Bootstrap code area446
0x01BE (446)Partition entry №116
0x01CE (462)Partition entry №216
0x01DE (478)Partition entry №316
0x01EE (494)Partition entry №416
0x01FE (510)0x551
0x01FF (511)0xAA1
446 + 16 *4 + 1 + 1 = 512

0~446 字节保存 bootloader;447~510 字节保存分区信息,共四个,每个 16 字节;511~512 字节保存启动签名,内容为 0xAA55,0xAA表明这是一个可启动设备。

三、Linux BIOS 启动

bootloader 启动阶段的核心功能是加载内核和 initramfs,并将控制权交给内核。

主要是:BIOS + MBR + grub2 和 UEFI + GPT + grub2

这里只介绍 BIOS+MBR+grub2 启动方案,这种引导方式,固件 BIOS 从启动设备的第一个扇区读取 bootloader。

过程如下:

boot.img(mbr 446B)  =>  core.img(diskboot.img + kernel.img + *mod)==> /boot/grub2/grub.cfg ==> vmlinuz 和 initramfs

上述 boot.img、core.img 都是 bootloader的一部分,他们被硬编码到启动盘上,不是以文件的形式存在于文件系统中。

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)

# ls -l /boot/grub2/i386-pc/*.img
-rw-r--r--. 1 root root   512 Dec  9  2021 /boot/grub2/i386-pc/boot.img
-rw-r--r--. 1 root root 26676 Dec  9  2021 /boot/grub2/i386-pc/core.img
# file /boot/grub2/i386-pc/boot.img
/boot/grub2/i386-pc/boot.img: x86 boot sector; partition 4: ID=0xd4, starthead 205, startsector 4277266767, 0 sectors, code offset 0x63

# file /boot/grub2/i386-pc/core.img
/boot/grub2/i386-pc/core.img: data

Grub由2个image组成:boot.img + core.img。其中boot.img大小固定为512Byte。

Centos7系统/boot/grub2/i386-pc/*目录下存在2个image镜像文件,这些文件会被grub2-install命令安装到硬盘的相应位置。当BIOS执行完毕后,就会被加载并引导系统完成启动。

LINUX引导过程包括三个阶段:
(1) The BIOS stage.
(2)The Boot loader stage.
(3)The Kernel stage.
如下图所示:
在这里插入图片描述

3.1 BIOS stage

ROM中包含JUMP函数的形式的指令,告诉CPU启动BIOS。

Linux的引导过程始于BIOS阶段。BIOS是安装在主板上的一个小型存储模块。BIOS使用存储在CMOS芯片中的信息,CMOS芯片是安装在主板上的另一个存储模块,其中包含有关系统硬件配置的信息。

(1)BIOS执行电源自检(POST)-检查硬件可用性的过程。BIOS会向每个设备发送一个电脉冲。如果设备回应(ACK),则表示硬件工作正常且准备就绪。如果设备不回应(NACK),则将将其视为故障设备或从系统中移除的设备。BIOS会维护一个连接到计算机的设备列表。它会更新列表以适应任何新的硬件,并在下次启动时使用该列表。

(2)如果BIOS在POST过程中发现任何错误,它会通过一系列的蜂鸣声或在屏幕上显示的文本消息通知用户。在这个阶段发生的错误几乎总是硬件问题。

(3)激活安装在计算机中不同卡上的其他BIOS芯片-例如,SCSI(小型计算机系统接口)和图形卡通常都有自己的BIOS芯片。

(4)它通过执行对每个内存地址的读/写测试来验证RAM。它初始化寄存器、电源管理和显示设置。

(5)然后,BIOS查看在CMOS芯片中以特定顺序标识为启动设备的存储设备序列。BIOS将尝试从第一个设备开始启动序列。如果BIOS找不到启动设备,它将尝试列表中的下一个设备。如果在设备上找不到正确的文件,启动过程将停止。

请注意:要使设备可引导,它必须在其第一个/最后一个扇区(取决于制造商,通常是硬盘的第一个扇区)中具有主引导记录(MBR),也称为引导扇区。您需要格式化磁盘以在其引导扇区中添加MBR。MBR的大小为512字节(一个扇区)。

MBR包含以下详细信息:
(1)主引导加载程序代码(446字节)。
(2)分区表(64字节)。
(3)魔数(2字节)。

主引导加载程序代码:该代码提供引导加载程序信息以及实际引导加载程序代码在硬盘上的位置细节。这对CPU加载引导加载程序的第二阶段非常有帮助。

分区表:64字节的数据,用于存储诸如每个分区的起始地址和结束地址、分区大小、分区类型(主分区、扩展分区、逻辑分区或交换分区)等信息。

魔数:魔数用作MBR的验证检查。如果MBR损坏,可以使用魔数来恢复它。

MBR无法处理超过2 TB容量的磁盘。MBR最多支持四个主分区 - 如果您需要更多分区,您必须将其中一个主分区设置为“扩展分区”,并在其中创建逻辑分区。每个分区在MBR中需要占用16个字节的空间,因此最多可以获得4个分区(16 * 4 = 64)。

在现代计算机中,MBR已被UEFI(统一固件接口)取代。

3.2 Boot Loader Stage

在初始化第一个启动设备后,BIOS将控制权交还给CPU。现在,CPU将加载MBR并读取MBR的第一部分,以获取实际引导加载程序/第二阶段引导加载程序的位置。实际引导加载程序位于MBR之后硬盘的前30千字节,此空间用于存储文件系统驱动程序和模块;并加载到RAM中以读取其配置并显示引导菜单,以选择要加载到内存中的内核。

两个最常用的Linux引导加载程序是:
Linux Loader(LILO)和 Grand Unified Bootloader(GRUB)。

大多数现代LINUX版本使用GRUB而不是LILO。

GRUB的过程包括三个阶段,分别称为Stage 1、Stage 1.5和Stage 2。引导加载程序加载后,CPU可以访问磁盘和内存,并从磁盘上存储的/boot/grub/grub.conf配置文件中读取。它创建一个临时虚拟文件系统的镜像,称为INITRD或初始RAM磁盘,然后挂载INITRD镜像并加载内核。GRUB指定了一个分区,其中包含压缩的内核映像、必要的模块和initramfs(initrd)。
如下图所示:
在这里插入图片描述

3.2.1 boot.img

boot.img是Grub2第一个被运行的程序,它被写入到MBR(Master Boot Record),固定大小为512B。boot.img功能很简单,主要是读取磁盘中core.img中的第一个扇区(sector)到内存中并执行相应的代码,因为仅有512B,boot.img不能够加载文件系统,并且只能从硬盘固定的位置加载。

3.2.2 core.img

core.img是GRUB2的核心,由 grub-mkimage 动态创建,包括了 diskboot.img、kernel.img 和一系列模块。通常core.img包含了足够的模块(modules)为了访问xfs/ext4文件系统/boot/grub2目录,并且从/boot/grub2下加载所有剩余的模块,这些模块包含了启动目录处理,加载操作系统等等功能。目前disk限制core.img安装必须小于32KB,core.img一般被安装在硬盘特殊区域:embedding area。

Grub2认识并支持更多的文件系统,并且可以通过Grub2的主程序直接在文件系统中搜寻kernel文件:
core.img 可以直接从文件系统中读取 grub.cfg,路径为 /boot/grub2/grub.cfg,根据 grub.cfg 文件读取加载内核和 initramfs,并将控制权交给内核。

(1)diskboot.img
diskboot.img 由 grub2-pc-modules 包提供,大小 512B,组成 core.img 的第一个扇区,功能是读取 core.img 的剩余部分(kernel)到内存中,并跳转到 kernel.img。

当从硬盘启动的时候这是core.img第一个扇区(sector)的内容,主要功能是读取剩下的core.img到内存中并开始运行kernel.img。同样diskboot.img没有文件系统的功能,当读取剩余的core.img时候,依然从硬盘固定位置读取。

(2)kernel.img
kernel.img 由 grub2-pc-modules 包提供,大小 50K 左右,grub 的核心代码,包含了 GURB 的基本运行时的基础设备:设备和文件处理框架、环境变量、救援模式命令行解析器等。kernel.img 很少单独使用,一般会构建到 core.img 中(.text 和 .data 段)

3.2.3 *.mod

# ls /boot/grub2/i386-pc/*.mod | wc -l
257

/boot/grub2/i386-pc/目录下有许多.mod文件,大部分模块会被core.img在运行时自动动态加载,其中小部分被整合到core.img中,比如文件系统xfs.mod等。

3.3 Kernel Stage

以centos 6为例:

一旦内核加载到内存中,它会解压缩initrd镜像(使用zlib压缩成zImage或bzImage格式)并进行挂载。内核使用INITRD镜像创建虚拟根文件系统(VFS)并运行LINUXrc程序。该程序为内核准备真实的文件系统。
即内核使用Initial RAM Disk(initrd)建立一个临时根文件系统,直到安装了真正的文件系统。

内核检查新的硬件并加载任何所需的设备驱动程序。使用initrd镜像中的程序(例如insmod和rmmod)来加载和卸载内核模块。然后,内核按照grub.conf文件中的指定,挂载实际的根文件系统,并卸载initrd镜像,并释放磁盘映像占用的所有内存。

最后,它运行init进程。

初始化进程(init)是由内核启动的第一个进程(初始化进程)。它是所有进程的父进程。init进程的PID(进程ID)始终为1。该进程持续存在直到计算机停机。它负责系统的整个状态。该进程的设置存储在其配置文件/etc/inittab中,它是一个初始化表,定义了系统程序的启动方式。init进程使用/etc/inittab文件中的参数加载其余的系统守护进程。

备注:Centos 6 虚拟文件系统为initrd,呼叫第一个进程init;Centos 7 虚拟文件系统initramfs,呼叫第一个进程systemd。
Centos 6 :

$ cat /proc/1/comm 
init

Centos 7:

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)

# cat /proc/1/comm
systemd
# readlink /proc/1/exe
/usr/lib/systemd/systemd

初始化进程会查看/etc/inittab文件来决定系统要引导到哪个Linux运行级别。总共有7个运行级别,编号从0到6。它们分别是:

运行级别0:将系统停止运行。

运行级别1:以单用户模式运行Linux,并提供命令行界面(CLI)。

运行级别2:以多用户模式运行Linux,禁用网络,并提供CLI。

运行级别3:以多用户模式运行Linux,启用网络,并提供CLI。

运行级别4:默认情况下未定义,允许具有必要权限的用户通过编辑"/etc/inittab"文件定义自定义的运行级别。

运行级别5:以多用户模式运行Linux,启用网络,并提供图形用户界面(GUI)和CLI。

运行级别6:重新启动系统。

centos 6 :

$ cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:

初始化进程开始执行与所选运行级别相对应的脚本。脚本信息存储在/etc/文件夹中的不同文件夹中:

/etc/rc0.d/ - 包含在运行级别0中运行的启动/停止脚本
/etc/rc1.d/ - 包含在运行级别1中运行的启动/停止脚本
/etc/rc2.d/ - 包含在运行级别2中运行的启动/停止脚本
/etc/rc3.d/ - 包含在运行级别3中运行的启动/停止脚本
/etc/rc4.d/ - 包含在运行级别4中运行的启动/停止脚本
/etc/rc5.d/ - 包含在运行级别5中运行的启动/停止脚本
/etc/rc6.d/ - 包含在运行级别6中运行的启动/停止脚本

一旦初始化进程完成,init进程会运行另一个文件/etc/rc.local,其中包含在初始化进程或引导过程中运行的最后一批命令。一切完成后,控制权交还给内核。

一旦内核获得控制权,它会启动多个"getty"实例,等待控制台登录,然后生成用户的shell进程,并提供用户提示符以进行登录。

centos 7 (systemd 代替 inittab):

# cat /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#
[root@localhost ~]# cat /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

SysVInit 是Linux中经典的初始化进程。初始化进程依赖于各个服务在/etc/init.d目录安装相关脚本。此外,这些脚本必须支持标准的命令,如start(启动)、stop(停止)和status(状态)。这个init系统的主要特点之一是它是一个一次性的启动过程,启动后不再跟踪各个服务。可以使用service命令从终端运行这些init脚本。

SystemD是一个近期的初始化系统,旨在取代SysVInit。事实上,大多数Linux发行版,如Debian和Red Hat,已经将SystemD作为默认的init系统。与SysVInit不同,SystemD在初始化完成后会作为一个守护进程持续运行。此外,它们还通过cgroups来主动跟踪服务。systemctl命令是用户与SystemD进行交互和配置的入口点。

传统的SysVinit进程使用运行级别(如前面讨论中提到的),但Systemd引入了目标(targets)的概念,提供了对系统在引导和运行时行为的更灵活和精细的控制。

参考资料

https://www.linkedin.com/pulse/linux-boot-process-sandeep-sharma-p
https://www.linkedin.com/pulse/linux-boot-procedure-sriram-ramanujam

https://mp.weixin.qq.com/s/N_lSjtorg0Ho_hSBiM5uKA
https://blog.csdn.net/Anhui_Chen/article/details/106988113
https://www.cnblogs.com/chaplain/p/16167738.html
https://www.wxtechblog.com/grub/grub-install

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

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

相关文章

传统后端SQL数据层替代解决方案: 内置数据源+JdbcTemplate+H2数据库 详解

内置数据源 我们回顾一下druid数据源的配置方式 通过type属性指定数据源的类型 导入依赖 starter就使用了spring的自动装配功能 格式二是在引入druid的依赖的基础上 进行的一种配置方式 Tomcat内部也可以进行数据源的配置 轻量级中最快的数据源对象 我们切换德鲁伊连接池 我…

自动控制理论---线性时不变系统的单位脉冲响应

1、实验设备 PC计算机1台,MATLAB软件1套。 2.实验目的: 学习并理解线性时不变系统的单位脉冲响应的计算方法。掌握MATLAB编程,计算整个系统的单位脉冲响应。 3.实验原理说明: 单位脉冲响应是指在输入信号为单位脉冲序列时&am…

数仓建模—OLTP 和 OLAP

数仓建模—OLTP 和 OLAP 前面我们在数仓建模—数仓初识 中提到了OLTP 和 OLAP 两个概念 OLAP 是 On-Line Analytical Processing(联机分析处理)的缩写。广义的 OLAP 泛指数据查询分析,像报表、即席查询、多维分析都属于 OLAP 的范畴。 OLTP 和 OLAP 最大区别在于前者会产…

『 Linux 』 进程地址空间与动态库地址

文章目录 逻辑地址进程地址空间指令的执行惰性加载(Lazy Loading)/延迟加载 动态库的地址 逻辑地址 在程序加载进内存之前,即编译之后就已经形成了地址,在编译之后的地址被称为 逻辑地址; 逻辑地址 逻辑地址是程序在编译时产生的地址; 在编译阶段,编译器会为程序中的每个变量…

电商领域利器来了!港大阿里联合提出MimicBrush,对参考图模仿进行零样本图像编辑,万物皆可编辑。

阿里和港大提出的MimicBrush可以通过对参考图模仿进行零样本图像编辑。将一张图片的某一部分融合到领一张图片上去。用在电商商品展示上或者单纯的图片编辑和内容迁移很有用。从官方演示来看效果也很好。 MimicBrush,它会随机选择视频剪辑中的两帧,遮盖其…

足底筋膜炎怎么治疗才能彻底除根

现代快节奏的生活中,足底筋膜炎作为一种常见的足部疾病,困扰着越来越多的人。长时间的站立、行走,以及不正确的运动姿势,都可能成为足底筋膜炎的诱因。足底筋膜炎带来的疼痛和不适,严重影响了人们的生活质量和日常工作…

AI Stable diffusion 报错:稳定扩散模型加载失败,退出

可能是内存不够,看看你最近是加了新的大的模型,可以把你的stable-diffusion-webui\models\Stable-diffusion目录下的某个ckpt删除掉,可能ckpt太大,无法加载成功; Stable diffusion model failed to load, exiting 如图…

SpringBoot+Vue实现Excel文档导入和导出

1.准备工作 1.1.前端程序 在前端首先加上批量导出的按钮&#xff0c;如下 <el-button size"small" type"warning" plain click"exportData"> 批量导出 </el-button> 在添加了点击事件之后&#xff0c;在methods中要与之对应的添加上…

高考志愿填报,选专业应该考虑哪些因素?

这是一个复杂的社会&#xff0c;各种影响就业的因素层出不穷&#xff0c;也从未断绝。对于高考生而言&#xff0c;高考刚结束&#xff0c;短暂的放松后&#xff0c;就必须考虑自身以后应该就读什么专业&#xff0c;如果不对就读专业进行评估&#xff0c;仔细挑选&#xff0c;毕…

【设计模式深度剖析】【8】【行为型】【备忘录模式】| 以后悔药为例加深理解

&#x1f448;️上一篇:观察者模式 设计模式-专栏&#x1f448;️ 文章目录 备忘录模式定义英文原话直译如何理解呢&#xff1f; 3个角色1. Memento&#xff08;备忘录&#xff09;2. Originator&#xff08;原发器&#xff09;3. Caretaker&#xff08;负责人&#xff09;类…

每日一题——Python实现PAT乙级1028 人口普查 Keyboard(举一反三+思想解读+逐步优化)六千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 题目链接​编辑我的写法 专业点评 时间复杂度分析 空间复杂度分析 总结 我要更强…

Star-CCM+自动网格执行方法与设置技巧

在Star中进行一个仿真项目时,有时会创建多个自动网格。网格创建结束后需要执行。在Star中,网格执行可以分为三种。分别是:单独执行操作;多个执行操作;全部执行操作。接下来将三种执行操作的方法与步骤进行介绍。 其次,如果不习惯用自定义控制网格,有时在一个项目中就会…

认识一些分布函数-Gumbel分布

1. Gumbel分布 Gumbel分布(也称为古贝尔型)是一种常用的非对称极值分布( Extreme Value Distribution,EVD),用于建模极大值和极小值,也就是所谓的EVD Type I分布。例如,EVD Type I 被用来预测地震、洪水和其他自然灾害,以及在风险管理中建模操作风险和那些在一定年龄…

关于阿里云效流水线自动部署项目教程

1、登录阿里云效:阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 2、点击左侧流水线&#xff1a; 3、在流水线界面&#xff0c;新建流水线 4、我的是php代码&#xff0c;因此选择php模版 5、创建之后添加流程线源&#xff0c;如下图 6、选择相应的源头。比…

eclipse中报出Invaild project path

一、问题&#xff1a; 二、提示分析&#xff1a; 资源路径位置类型无效的项目路径&#xff1a;找到重复的路径条目 项目路径中有一个名为"/eclipse_rtt_demo"的条目被多次定义&#xff0c;这在Eclipse的构建路径设置中是不允许的。这个重复的条目既被标记为系统包含…

Studio One软件最新版下载及详细安装教程

Studio One 6是一款功能丰富、专业级的音乐制作软件&#xff0c;它具备灵活的工作流程和高效的团队协作能力&#xff0c;能帮助用户实现高质量的音乐创作和制作。 智能模板更快的启动&#xff0c;全新的智能模板为你手头的任务提供了必要的工具集&#xff0c;包括基本录制、混音…

【个人云盘连接助手】解决多个用户账号无法同时映射到本地磁盘问题

问题 家里买了个联想个人云盘&#xff0c;但是使用SAMBA映射到windows本地磁盘时&#xff0c;每次只能连接到一个账户上&#xff0c;于是想着写个小工具&#xff0c;方便切换多个用户账户&#xff0c;自动映射到本地磁盘 开发简介 开发语言&#xff1a;python 主要实现功能&…

训练营第三十六天| 337.打家劫舍 III121. 买卖股票的最佳时机

337.打家劫舍 III 力扣题目链接(opens new window) 在上次打劫完一条街道之后和一圈房屋后&#xff0c;小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为“根”。 除了“根”之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察…

工业屏:千万不要以为电脑显示啥样,工业屏就啥样,注意色差。

重要的事情说三遍&#xff1a;一定要放到实际场景下调色&#xff0c;定要放到实际场景下调色&#xff0c;定要放到实际场景下调色。 工业控制屏的色域通常比普通电脑显示器要小。工业控制屏主要用于工业环境中&#xff0c;需要满足特定行业的需求和标准。由于工业控制屏的设计…

深度剖析淘宝扭蛋机源码:打造趣味性电商活动的秘诀

在当今电商市场中&#xff0c;如何吸引用户的注意力、提升用户的参与度成为了各大电商平台竞相追求的目标。淘宝扭蛋机作为一种新型的电商活动形式&#xff0c;以其趣味性和互动性深受用户喜爱。本文将深度剖析淘宝扭蛋机源码&#xff0c;探讨其如何打造趣味性与互动性并存的电…