当前位置: 首页 > news >正文

CH2--x86系统架构概览

2.1 OVERVIEW OF THE SYSTEM-LEVEL ARCHITECTURE

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

图中的实线箭头表示线性地址,虚线表示段选择器,虚线箭头表示物理地址

2.1.1 Global and Local Descriptor Tables

在这里插入图片描述

全局描述符表 (GDT)

  • GDT是一个全局的段描述符表,它存储在系统内存中的一个固定位置。通常,GDT被加载到内存中的一个特殊寄存器中,这个寄存器被称为全局描述符表寄存器 (Global Descriptor Table Register, GDTR)。

  • GDT包含了系统中所有进程所需的段描述符,这些段描述符定义了各种段的属性。这些属性包括段的基地址、段的大小、特权级别(Ring)、访问权限、段类型等。

  • GDTR寄存器包含了GDT的线性地址和界限信息。通过加载GDTR寄存器,处理器可以获得对GDT的访问权。

  • 操作系统在启动时负责初始化GDT,并将其基地址和界限加载到GDTR寄存器中。这样,处理器就可以使用GDT中的段描述符来访问内存。

  • 每个段描述符都包含了访问权限信息,指定了谁可以访问该段以及如何访问。这些权限包括特权级别(Ring)、读写权限、执行权限等。

局部描述符表 (LDT)

  • LDT是一个与每个进程关联的段描述符表。与GDT不同,每个进程都可以拥有自己的LDT,这为进程级别的隔离提供了一定的灵活性。

  • LDT允许每个进程定义自己的段描述符,这些描述符定义了进程特定的段,如代码段、数据段等。

  • 每个任务(进程)都有一个关联的LDT描述符。这个LDT描述符的信息存储在一个特殊寄存器中,称为局部描述符表寄存器 (Local Descriptor Table Register, LDTR)。

  • 当处理器执行任务切换时,它会加载LDTR寄存器,从而指向相应任务的LDT。

  • LDT通常在多任务操作系统中使用,用于在不同的进程之间进行隔离。每个进程都可以定义自己的LDT,使其拥有独立的段描述符表,这有助于保护一个进程的内存空间免受其他进程的干扰。

2.1.2 System Segments, Segment Descriptors, and Gates

系统段 (System Segments)

系统段是GDT(全局描述符表)中的一类特殊段,它们用于存储系统信息和控制特定的操作。这些段对操作系统和处理器的内部运行起着重要作用。

比如:

  • 全局描述符表寄存器 (GDTR): 存储了GDT的基地址和界限信息。当处理器需要访问GDT时,它使用GDTR来定位GDT的位置。
  • 任务状态段 (TSS): TSS是一种系统段,用于存储任务(进程)的上下文信息,如通用寄存器、段寄存器和堆栈指针。它在任务切换中起关键作用。

段描述符 (Segment Descriptors)

段描述符是一种数据结构,用于描述段的属性。每个段描述符包含了关于一个段的重要信息,包括但不限于基地址、段大小、特权级别、段类型、读写权限等。
属性信息:

  • 基地址 (Base Address): 段在内存中的起始地址。
  • 段大小 (Segment Size): 段的大小,以字节为单位。
  • 特权级别 (Privilege Level): 描述段的特权级别(通常是0-3,0表示最高特权级别)。
  • 段类型 (Segment Type): 指定段的类型,例如代码段、数据段、系统段等。
  • 读写权限 (Read/Write Permissions): 指定谁可以读取和写入该段。

门 (Gates)

概述:

门是一种特殊的数据结构,用于实现控制转移。它们允许处理器从一个特定的执行点跳转到另一个执行点,通常用于中断和异常处理,以及任务切换。门允许受保护的控制转移,这意味着可以在不同的特权级别之间进行切换,从而提供了一定程度的系统安全性和隔离。

  • 中断门 (Interrupt Gate): 用于处理中断请求,它将控制传递给中断处理程序。
  • 陷阱门 (Trap Gate): 与中断门类似,但不会禁用中断,通常用于陷阱例程。
  • 调用门 (Call Gate): 用于在不同特权级别之间进行子程序调用。
  • 任务门 (Task Gate): 用于任务切换,允许从一个任务切换到另一个任务。

在IA-32e模式下(64位模式),任务门不再被支持。任务切换在这种模式下使用不同的机制。
当特权级别更改时,堆栈段选择器不会从TSS中读取。相反,它们被设置为NULL,这是因为IA-32e模式下的任务切换方式与传统方式不同。

2.1.3 Task-State Segments and Task Gates

任务状态段 (TSS):

任务状态段 (TSS) 是一种系统段,用于存储处理器在执行任务(进程)时的状态信息。包括通用寄存器、段寄存器、堆栈指针和一些特殊寄存器(如EFLAGS和EIP)的值。

  • 任务切换:当操作系统决定切换到不同的任务时,它会加载新任务的TSS,以便处理器能够恢复新任务的状态。

  • 任务切换可能是由外部事件触发的,如定时器中断,也可以是由操作系统内部决策引发的,例如进程切换。

  • 每个TSS与特定的特权级别(通常是0-3,0表示最高特权级别)相关联。任务切换时,处理器会从当前特权级别切换到新任务的特权级别。

  • 保护和隔离:TSS的存在有助于保护不同任务之间的内存空间,因为不同任务的TSS存储在不同的地址空间中,确保了任务之间的隔离性。

任务门 (Task Gate):

任务门 (Task Gate) 是GDT(全局描述符表)中的特殊段描述符,用于在不同任务之间进行切换。任务门包含了指向TSS的偏移量(TSS段在GDT中的偏移地址)以及目标任务的特权级别信息。

  • 任务切换:当要执行任务切换时,处理器会使用任务门来指定目标任务。任务门包含了目标TSS的位置信息,以及要切换到的目标特权级别。
  • 处理器会跳转到任务门,并从任务门中获取目标TSS的地址,然后加载该TSS,最终实现任务切换。
  • 特权级别的切换:任务门还允许在不同特权级别之间进行任务切换。例如,从用户态(Ring 3)切换到内核态(Ring 0)时,任务门可以指定目标特权级别为0。
  • 安全性和隔离:任务门的使用可以确保任务切换是受保护的,不允许不合法的任务切换。这有助于维护系统的安全性和隔离性。

2.1.4 Interrupt and Exception Handling

中断和异常是处理器用来应对外部事件和程序错误的机制。它们允许处理器在运行时停止当前执行的任务,执行特定的处理程序,然后在处理完成后恢复原来的执行流程。

中断(Interrupt )

  • 中断是一种外部事件的通知机制,它通常由硬件设备或其他外部源触发。例如,硬件中断可以是键盘输入、鼠标点击、磁盘I/O等。
  • 当中断发生时,处理器会立即停止当前执行的指令流,保存当前上下文,并跳转到与该中断相关的中断处理程序。

异常 (Exceptions)

  • 异常是由程序错误或异常情况引发的事件。这些异常包括除零错误、页故障(如缺页异常)、非法指令、越界访问等。
  • 异常是通过程序执行期间检测到的,处理器会捕获并触发与异常相关联的异常处理程序。

中断描述符表 (IDT)

中断描述符表 (Interrupt Descriptor Table, IDT) 是一个系统数据结构,它存储了中断和异常处理程序的入口点地址。每个中断或异常都在IDT中有一个条目。

  • 每个IDT入口包括了中断或异常的处理程序的地址(称为中断服务例程,ISR)以及相关的描述符类型和特权级别等信息。
  • 当中断或异常发生时,处理器根据IDT中的条目来确定要执行的处理程序。

中断向量

  • 中断向量是一个唯一的标识符,用于表示IDT中的特定条目。不同的中断或异常有不同的中断向量。
  • 处理器使用中断向量来查找IDT中的相应入口,以确定要执行的处理程序。

中断和异常处理流程:

  • 当中断发生时,处理器会暂停当前执行的任务,保存当前上下文(包括寄存器状态和程序计数器值),并跳转到IDT中相应中断向量的处理程序。
    中断处理程序通常执行与中断相关的操作,然后返回到原来的执行流程。

  • 异常处理与中断处理类似,但通常用于处理程序错误。当异常发生时,处理器会停止当前执行的指令,保存上下文,并跳转到IDT中相应异常向量的处理程序。
    异常处理程序通常会尝试纠正异常或终止进程,具体取决于异常的类型和操作系统的策略。

2.1.5 Memory Management

内存管理的主要任务包括分配、释放和保护内存区域,以及实现地址转换和缓存控制。它还涵盖了内存的组织、优化和回收。

内存管理同时涉及物理内存(RAM)和虚拟内存(通过磁盘上的交换文件实现)。虚拟内存扩展了可用内存,允许多个程序同时运行,而不必担心物理内存的限制。

内存管理机制

  • 分页机制 (Paging):分页是一种内存管理机制,将物理内存和虚拟内存划分为固定大小的页。操作系统负责维护页表,将虚拟内存页映射到物理内存页。分页机制允许操作系统实现内存保护、内存共享和虚拟内存。

  • 分段机制 (Segmentation):分段是另一种内存管理机制,将内存划分为不同的段,每个段具有不同的属性。例如,代码段、数据段、堆栈段等。
    分段机制允许不同的程序区域具有不同的访问权限,提供了更精细的内存控制。

  • 虚拟内存:虚拟内存是一个抽象的内存管理概念,它允许程序使用比物理内存更大的内存地址空间。虚拟内存通过将不常用的内存页存储到磁盘上的交换文件中来扩展物理内存。

Page Map Level 4 (PML4):

PML4是IA-32e架构中的内存管理单元之一,用于虚拟内存到物理内存的映射。它是分页机制的一部分,扩展了传统的分页表结构。

  • 层级结构:PML4位于分页机制的最顶层,以下分别是Page Directory Pointer Table (PDPT),Page Directory (PD),和Page Table (PT)。PML4允许操作系统和硬件更灵活地管理大内存地址空间,以及实现更高级别的内存隔离。

  • 地址映射:PML4将虚拟地址映射到物理地址。每个PML4条目对应一个区域的虚拟地址范围,将其映射到相应的物理页帧上。

2.1.6 System Registers

控制寄存器 (Control Registers)

  • CR0寄存器包含了各种控制标志位,用于控制处理器的基本行为。其中一些标志位包括:
    分页开关(PG):启用或禁用分页机制。
    保护模式开关(PE):进入或退出保护模式。
    协处理器(FPU)开关:启用或禁用浮点处理单元。
    内存写保护(WP):启用或禁用内存写保护。

  • CR2寄存器存储了最近一次引发页面故障(如缺页异常)的线性地址。操作系统使用它来识别和处理内存访问问题。

  • CR3寄存器存储了页目录表的物理地址,用于启用分页机制。它允许操作系统切换不同任务的地址空间。

  • CR4寄存器包含一些额外的控制标志位,用于控制处理器的高级功能,如页大小扩展、物理地址扩展等。

调试寄存器 (Debug Registers):

  • DR0-D3 这些寄存器用于设置断点。当程序执行到指定地址时,处理器会触发一个断点异常,允许调试器或监视程序检查程序状态。

  • DR6寄存器用于指示当前断点的状态。它包含了断点引发的异常类型以及其他相关信息。

  • DR7寄存器用于配置调试寄存器。它允许设置断点的条件、长度和访问类型等。
    其他系统寄存器:

2.1.7 Other System Resources

除了上述寄存器,还有其他一些系统寄存器,如任务寄存器(Task Register,TR)和全局描述符表寄存器(GDTR)等。

2.2 MODES OF OPERATION

IA-32支持三种操作模式和一种准操作模式:

  • 保护模式——这是处理器的本地操作模式。它提供了与现有软件基础的丰富架构特征、灵活性、高性能和向后兼容性。
  • 实时地址模式——这种操作模式提供了英特尔 8086 处理器的编程环境,有一些扩展(例如切换到受保护或系统管理模式的能力)。
  • 系统管理模式 (SMM) - SMM 是所有 IA-32 处理器的标准架构特征,从 Intel386 SL 处理器开始。该模式提供了一个操作系统或执行,具有透明机制来实现电源管理和OEM分化特征。

在这里插入图片描述

从实模式切换到保护模式

  • 加载全局描述符表 (GDT): 保护模式需要使用GDT来描述各种段,包括代码段和数据段。在切换到保护模式之前,需要创建并加载GDT。

  • 设置控制寄存器 (Control Registers): 控制寄存器如CR0和CR3需要进行相应的设置,以启用分页(开启PG标志)和设置CR3以指向新的页目录表。

  • 重新加载段寄存器:在实模式下,段寄存器(如CS、DS、ES、SS等)存储的是段选择符,而在保护模式下,它们存储的是段描述符的索引值。因此,在切换到保护模式时,需要重新加载这些段寄存器以指向新的段描述符。

  • 设置堆栈: 保护模式需要一个堆栈来存储函数调用和中断处理的返回地址以及局部变量。因此,需要设置一个适当的堆栈段和堆栈指针(通常是SS和ESP寄存器)。

  • 清除中断允许位 (IF): 在实模式下,中断是启用的,但在保护模式下,默认是禁用的。因此,在切换到保护模式后,通常需要将IF标志位清零,以启用中断。

  • 跳转到保护模式代码:一旦上述修改完成,操作系统可以通过跳转指令(如JMP指令)切换到保护模式代码段,开始执行保护模式下的程序。

从保护模式切换到实模式

  • 加载全局描述符表 (GDT): 在切换回实模式之前,需要重新加载GDT,以便在实模式下继续使用正确的段描述符。

  • 禁用分页: 实模式不需要分页机制,所以需要将CR0的PG标志位禁用,以停用分页。

  • 重新加载段寄存器:由于实模式下使用的是段选择符,因此需要重新加载段寄存器以恢复实模式下的段选择符。

  • 设置堆栈: 在实模式下也需要一个堆栈,所以需要设置正确的堆栈段和堆栈指针。

  • 清除中断允许位 (IF): 在实模式下,中断是默认启用的,所以需要将IF标志位设置为1,以允许中断。

  • 跳转到实模式代码:一旦上述修改完成,操作系统可以通过跳转指令(如JMP指令)切换到实模式代码段,开始执行实模式下的程序。

切换模式通常是操作系统内核的一部分,并且需要非常小心地管理寄存器和内存,以确保正确的切换和恢复。实模式通常用于启动计算机和操作系统引导过程,而保护模式用于执行用户和内核代码。

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

2.3 SYSTEM FLAGS AND FIELDS IN THE EFLAGS REGISTER

在这里插入图片描述

标志寄存器 EFLAGS

标志寄存器EFLAGS包含了一系列标志位,用于反映处理器的状态和执行结果。

  • ZF (Zero Flag): 当结果为零时被置位,用于判断操作结果是否为零。

  • SF (Sign Flag): 当结果为负数时被置位,用于表示操作结果的符号。

  • OF (Overflow Flag): 当运算结果溢出时被置位,用于检测有符号整数运算的溢出。

  • CF (Carry Flag): 当无符号整数运算产生进位时被置位,用于检测进位。

  • PF (Parity Flag): 当结果的二进制表示中有偶数个1时被置位,用于奇偶校验。

  • AF (Adjust Flag): 用于辅助进位,通常在BCD(二进制编码十进制)运算中使用。

  • TF (Trap Flag): 当设置时,可以用于单步调试,使处理器逐条执行指令。

  • IF (Interrupt Enable Flag): 当设置时,允许外部中断。

  • DF (Direction Flag): 用于指示字符串操作的方向(向上或向下)。

2.4 MEMORY-MANGAGEMENT REGISTERS

2.4.1 Global Descriptor Table Register (GDTR)

GDTR寄存器存储全局描述符表(GDT)的地址。GDT包含系统中所有的段描述符,用于内存访问控制。

2.4.2 Local Descriptor Table Register (LDTR)

LDTR寄存器存储局部描述符表(LDT)的地址。LDT通常与每个任务(进程)相关联,允许任务拥有独立的段描述符表。

2.4.3 Interrupt Descriptor Table Register(IDTR)

IDTR寄存器存储中断描述符表(IDT)的地址。IDT包含了中断和异常处理程序的入口点。

2.4.4 Task Register (TR)

TR寄存器存储任务寄存器的选择符。任务寄存器用于多任务操作系统中,它指向当前任务的TSS(任务状态段)。

2.5 CONTROL REGISTERS

参见2.1.6节

在这里插入图片描述

2.6 EXTENDED CONTROL REGISTERS (INCLUDING XCR0)

  • XCR0是扩展控制寄存器中最为重要的一个,它用于启用和配置高级处理器特性,主要是指向AVX(高级矢量扩展)和SSE(流式SIMD扩展)指令集的使用。这些特性包括高级浮点运算、SIMD操作和高级矢量处理。

  • 除XCR0外,还存在一些未来可能用于其他高级特性的XCR寄存器,目前尚未广泛使用。

2.7 SYSTEM INSTRUCTION SUMMARY

  • LGDT (Load Global Descriptor Table)指令用于加载全局描述符表 (GDT) 的地址和界限值到GDTR寄存器。GDT包含了系统中所有的段描述符,用于内存访问控制。通过LGDT指令,操作系统可以更新GDT,以允许新的段描述符用于内存保护和管理。

  • SGDT (Store Global Descriptor Table)指令用于将GDTR寄存器中的全局描述符表 (GDT) 地址和界限值存储到指定的内存位置。这通常用于操作系统中的一些调试和诊断操作。

  • LIDT(Load Interrupt Descriptor Table)指令用于加载中断描述符表 (IDT) 的地址和界限值到IDTR寄存器。IDT包含了中断和异常处理程序的入口点。通过LIDT指令,操作系统可以更新IDT,以注册新的中断处理程序或修改现有的中断处理程序。

  • SIDT(Store Interrupt Descriptor Table)指令用于将IDTR寄存器中的中断描述符表 (IDT) 地址和界限值存储到指定的内存位置。这可用于操作系统中的一些调试和诊断操作。

  • LLDT(Load Local Descriptor Table)指令用于加载局部描述符表 (LDT) 的选择符(描述符表的索引值)到LDTR寄存器。LDT通常与每个任务(进程)相关联,允许任务拥有独立的段描述符表。LLDT指令通常在任务切换时使用。

  • SLDT(Store Local Descriptor Table)指令用于将LDTR寄存器中的局部描述符表 (LDT) 的选择符存储到指定的内存位置。这通常用于操作系统中的一些调试和诊断操作。

  • LTR (Load Task Register)指令用于加载任务寄存器 (TR) 中的任务选择符,该任务选择符指向任务状态段(TSS)。任务寄存器和TSS用于多任务操作系统中的任务切换。

  • STR (Store Task Register)指令用于将任务寄存器 (TR) 中的任务选择符存储到指定的内存位置。这通常用于操作系统中的一些调试和诊断操作。

相关文章:

CH2--x86系统架构概览

2.1 OVERVIEW OF THE SYSTEM-LEVEL ARCHITECTURE 图中的实线箭头表示线性地址,虚线表示段选择器,虚线箭头表示物理地址 2.1.1 Global and Local Descriptor Tables 全局描述符表 (GDT) GDT是一个全局的段描述符表,它存储在系统内存中的一个固…...

Immutable.js API 简介

Immutable-js 这个库的实现是深拷贝还是浅拷贝?immutable 来源immutable.js三大特性: 持久化数据结构结构共享惰性操作 Immutable.js 的几种数据类型 immutable 使用 使用 npm 安装 immutable: 常用API介绍 MapListList.isList() 和 Map.isMa…...

HLSL 入门(一)

HLSL High Level Shader Language 高级着色语言,是Direct3D中用来编写Shader的语言。其语法类似于C语言。 虽然其主要作用是用来编写例如顶点着色器,像素着色器。但本质是对图形并行管线进行编程,因此也能用来编写用于计算的着色器&#xff…...

【Docker】挂载数据卷

一、Docker数据卷说明及操作 在Docker中挂载数据卷是一种将数据持久化保存的方法,以便容器之间或容器与主机之间共享数据。以下是如何在Docker中挂载数据卷的步骤: 1、创建数据卷 首先,您需要创建一个数据卷。可以使用以下命令创建一个数据卷…...

[技术干货]spring 和spring boot区别

Spring 和 Spring Boot 都是 Java 框架,用于构建企业级应用程序。Spring 是一个完整的框架,提供各种功能,包括依赖注入、事务管理、数据访问、Web 开发等。Spring Boot 是一个基于 Spring 的框架,旨在简化 Spring 应用程序的开发和…...

【hudi】数据湖客户端运维工具Hudi-Cli实战

数据湖客户端运维工具Hudi-Cli实战 help hudi:student_mysql_cdc_hudi_fl->help AVAILABLE COMMANDSArchived Commits Commandtrigger archival: trigger archivalshow archived commits: Read commits from archived files and show detailsshow archived commit stats: …...

RK3588 添加ROOT权限

一.ROOT简介 ROOT权限是Linux和Unix系统中的超级管理员用户帐户,该帐户拥有整个系统的最高权利,可以执行几乎所有操作。ROOT就是获取安卓系统中的最高用户权限,以便执行一些需要高权限才能执行的操作(包括卸载系统自带程序、刷机、备份、还原…...

【云原生】k8s-----集群调度

目录 1.k8s的list-watch机制 1.1 list-watc机制简介 1.2 根据list-watch机制,pod的创建流程 2.scheduler的调度策略 2.1 scheduler的调度策略简介 2.2 Scheduler预选策略的算法 2.3 Scheduler优选策略的算法 3. k8s中的标签管理及nodeSelector和nodeName的 调…...

一键集成prometheus监控微服务接口平均响应时长

一、效果展示 二、环境准备 prometheus + grafana环境 参考博文:https://blog.csdn.net/luckywuxn/article/details/129475991 三、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter...

2023/9/13 -- C++/QT

作业&#xff1a; 1> 将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream> #define MAX 40 using namespace std;template <typename T> class Stack{ private:T *data;int top; public:Stack();~Stack();Stack(const Stack &ot…...

mybatis mapper.xml转建表语句

从网上下载了代码&#xff0c;但是发现没有DDL建表语句&#xff0c;只能自己手动创建了&#xff0c;感觉太麻烦&#xff0c;就写了一个工具类 将所有的mapper.xml放入到一个文件夹中&#xff0c;程序会自动读取生成建表语句 依赖的jar <dependency><groupId>org.d…...

封装使用Axios进行前后端交互

Axios是一个强大的HTTP客户端&#xff0c;用于在Vue.js应用中进行前后端数据交互。本文将介绍如何在Vue中使用Axios&#xff0c;并通过一个企业应用场景来演示其实际应用。 Axios简介 公众号&#xff1a;Code程序人生&#xff0c;个人网站&#xff1a;https://creatorblog.cn A…...

SOA、分布式、微服务

SOA&#xff1a; SOA是一种软件设计架构&#xff0c;用于构建分布式系统和应用程序。它将应用程序拆分为一系列松耦合的服务&#xff0c;这些服务通过标准化的接口进行通信&#xff0c;并能够以可编程方式组合和重用。SOA的目标是提高系统的灵活性、可扩展性和可维护性。 特点&…...

json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割

json数据传输压缩以及数据切片分割分块传输多种实现方法&#xff0c;大数据量情况下zlib压缩以及bytes指定长度分割。 import sys import zlib import json import mathKAFKA_MAX_SIZE 1024 * 1024 CONTENT_MIN_MAX_SIZE KAFKA_MAX_SIZE * 0.9def split_data(data):"&q…...

移动端APP测试-如何指定测试策略、测试标准?

制定项目的测试策略是一个重要的步骤&#xff0c;可以帮助测试团队明确测试目标、测试范围、测试方法、测试资源、测试风险等&#xff0c;从而提高测试效率和质量。本篇是一些经验总结&#xff0c;理论分享。并不是绝对正确的&#xff0c;也欢迎大家一起讨论。 文章目录 一、测…...

【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理

文章目录 前言一、对 Redis 主从结构的认识1.1 什么是主从结构1.2 主从结构解决的问题 二、主从结构创建2.1 配置并建立从节点2.2.1 从节点配置文件2.2.2 启动并连接 Redis 主从节点2.2.3 SLAVEOF 命令2.2.4 断开主从关系 2.2 查看主从节点的信息2.2.1 INFO REPLICATION 命令2.…...

CSS 滚动驱动动画 scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis )

scroll-timelinescroll-timeline-name❤️scroll-timeline-axis 解决问题语法 animation-timeline-nameanimation-timeline-axis scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis ) 在 scroll() 的最后我们遇到了因为定位问题导致滚动效果失效的情况, 当…...

9.19号作业

2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…...

Mybatis学习笔记9 动态SQL

Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景&#xff1a; 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…...

element表格 和后台联调

1.配置接口 projectList:/api/goods/xxx,//产品列表2.请求接口(get请求默认参数page) // 产品列表 pageprojectList(params){return axios.get(base.projectList,{params})}3.获取数据 直接放到created里边去了 刷新页面就可以看到 async projectList(page){let res await t…...

基于SSM的智慧城市实验室主页系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

怒赞,阿里P8推荐的Java面试宝典:41个专题PDF(史上最全+面试必备)

《尼恩Java面试宝典》 40岁老架构师 尼恩 经过对大量 Java面试题 的不断梳理、迭代&#xff0c; 编著成5000页的《尼恩Java面试宝典》&#xff0c;致力于体系化&#xff0c; 系统化&#xff0c;形象化 梳理&#xff0c;形成一个大的知识体系&#xff0c;从而帮助大家 进大厂&a…...

线程池各个参数设置说明

1. corePoolSize 核心线程数 看处理业务属于IO密集型还是属于cpu密集型IO密集型: 通常设置为N1&#xff0c;还有一个计算公式&#xff1a;线程数 cpu数*&#xff08;线程等待时间/线程总的处理时间&#xff09; 但是由于服务器除了这个服务可能还部署有其他服务&#xff0c;…...

springBoot对接多个mq并且实现延迟队列---未完待续

mq调用流程 创建消息转换器 package com.wd.config;import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import o…...

Pytorch从零开始实战04

Pytorch从零开始实战——猴痘病识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——猴痘病识别环境准备数据集模型选择模型训练数据可视化其他模型图片预测 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytor…...

北大C++课后记录:文件读写的I/O流

前言 文件和平常用到的cin、cout流其实是一回事&#xff0c;可以将文件看作一个有限字符构成的顺序字符流&#xff0c;基于此&#xff0c;也可以像cin、cout读键盘数据那样对文件进行读写。 读写指针 输入流的read指针 输出流的write指针 注&#xff1a;这里的指针并不是普…...

详解Linux的grep命令

2023年9月19日&#xff0c;周二晚上 先写这么多吧&#xff0c;以后有空再更新&#xff0c;还要一些作业没写完.... 目录 概述查看grep命令的所有选项grep的常用选项选项-i选项-v选项-n选项-c​编辑选项-l组合使用 概述 grep命令在Linux系统中是一个很重要的文本搜索工具和过…...

spark6. 如何设置spark 日志

spark yarn日志全解 一.前言二.开启日志聚合是什么样的2.1 开启日志聚合MapReduce history server2.2 如何开启Spark history server 三.不开启日志聚合是什么样的四.正确使用log4j.properties 一.前言 本文只讲解再yarn 模式下的日志配置。 二.开启日志聚合是什么样的 在ya…...

glibc: strlcpy

https://zine.dev/2023/07/strlcpy-and-strlcat-added-to-glibc/ https://sourceware.org/git/?pglibc.git;acommit;h454a20c8756c9c1d55419153255fc7692b3d2199 https://linux.die.net/man/3/strlcpy https://lwn.net/Articles/612244/ 从这里看&#xff0c;这个strlcpy、st…...

如何在 Buildroot 中配置 Samba

在 Buildroot 中配置 Samba 在 Buildroot 中配置 Samba 可以通过以下步骤完成&#xff1a; 1. 进入 Buildroot 的根目录。 2. 执行 make menuconfig 命令&#xff0c;打开 Buildroot 的配置菜单。 3. 在配置菜单中&#xff0c;使用键盘导航到 "Target packages" 选…...

企业文化包括哪六个/网站优化 秦皇岛

王可伟 作品 地形篇&#xff08;第十&#xff09;&#xff08;读《孙子兵法》&#xff0c;悟管理、营销之道&#xff09;本篇论述军事地形学上的问题。孙子通过“地有六形”、“兵有六败”的论述&#xff0c;揭示了敌情与军事地理的相互关系&#xff0c;提出了“料敌制胜&#…...

网站开发的图片要求/广告公司推广软文

2018.05.05_day111、执行Python脚本的两种方式 第一种&#xff0c;在命令行输入“python 文件名” 第二种&#xff0c;从解释器打开脚本文件&#xff0c;并运行。2、简述位、字节的关系 位是计算机存储的最小单位&#xff0c;一个位要么是“0”要么是“1”&#xff0c;8个位等于…...

房产采集网站源代码/如何做线上销售和推广

六、Page Control1、安装packageControl(管理插件的工具)打开 https://packagecontrol.io/&#xff0c;点击右侧菜单installation根据版本及提示进行安装ctrl打开console&#xff0c;将import urllib.request,os,hashlib; h eb2297e1a458f27d836c04bb0cbaf282 d0e7a309809277…...

优秀的定制网站建设服务商/建站模板免费下载

Spring Boot 全局捕获异常 假如我们在代码中写错了&#xff1a; 然后我们访问的时候就会出现&#xff1a; 然而我们并不想把错误抛给用户看&#xff0c;这个时候就需要用到全局捕获异常。 ExceptionHandler 表示拦截异常 • ControllerAdvice 是 controller 的一个辅助…...

静态企业网站下载/app优化建议

应盆友需求&#xff0c;自己在闲暇时间整个了Unifier 用户的接口的DEMO&#xff0c;版本 v19.12 当然&#xff0c;通过导入用户EXCEL系统原生也是可以实现的&#xff0c;这里更多考虑的是业务逻辑和操作效率&#xff08;体验&#xff09;&#xff0c;毕竟以集成接口的方式&…...

网站模板种类/如何让自己的网站快速被百度收录

嵌入式软件开发环境1 简介嵌入式软件定义嵌入式系统构成2 环境搭建2.1 Qt2.2 CLion2.3 Source Insight vs code2.4 Vim3参考1 简介 嵌入式软件定义 嵌入式软件与嵌入式系统是密不可分的&#xff0c;嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的…...