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

CH6-中断和异常处理

6.1 中断和异常处理概述

中断和异常概述(INTERRUPT AND EXCEPTION OVERVIEW)

  • 中断和异常向量:中断和异常在处理器中都有对应的编号,被称为向量。当中断或异常发生时,处理器会根据向量找到相应的中断处理程序或异常处理程序。

  • 中断源和异常源:中断可以由硬件设备产生,也可以由软件指令产生。异常通常由于程序错误或其他意外情况引起。

  • 异常的分类:异常可以分为故障、陷阱和中止。故障是可修复的错误,陷阱是有意的,中止是不可修复的错误。

  • 程序或任务的重新执行:中断或异常处理程序执行完成后,处理器会返回到被中断的程序或任务。这个过程确保了程序的连续性。

  • 开启和禁止中断:处理器可以通过特殊的指令来开启或禁止中断。禁止中断可以用来保护关键部分的代码,确保它们不会被中断。

  • 异常和中断的优先级:不同的中断或异常有不同的优先级。处理器会根据优先级来确定哪个中断或异常应该被处理。

6.2 异常和中断向量(EXCEPTION AND INTERRUPT VECTORS)

处理器如何处理?

处理器如何为每个特定的异常和中断分配一个独特的标识号,这个标识号被称为向量号。处理器使用这个向量号在中断描述符表中查找对应的处理程序。向量号的范围是0到255,其中0到31被体系结构保留,用于定义特定的异常和中断。32到255的范围用于用户定义的中断,通常用于外部I/O设备。

思考:实模式和保护模式下,中断向量表一样吗?

在实模式和保护模式下,中断向量表并不相同。实模式下,中断向量表是固定的,而在保护模式下,它是由操作系统动态设置的。在保护模式下,中断处理程序的地址是通过中断描述符表(IDT)来获得的。

6.3 中断的来源(SOURCES OF INTERRUPTS)

中断的来源

  • 外部(硬件生成的)中断
  • 软件生成的中断

6.3.1 外部中断External Interrupts

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

6.3.2 可屏蔽硬件中断(Maskable Hardware Interrupts)

通过INTR引脚或本地APIC传递到处理器的任何外部中断都被称为可屏蔽硬件中断。

可以通过INTR引脚传递的可屏蔽硬件中断包括从0到255的所有IA-32架构定义的中断向量;可以通过本地APIC传递的中断包括从16到255的中断向量。EFLAGS寄存器中的IF标志允许将所有可屏蔽硬件中断作为一个组进行屏蔽。

6.3.3 软件生成的中断(Software-Generated Interrupts)

  • INT n 指令允许在软件内部生成中断,只需将一个中断向量号作为操作数提供即可。
  • 通过 INT n 指令生成的软件中断无法被EFLAGS寄存器中的IF标志屏蔽。

6.4 异常的来源(SOURCES OF EXCEPTIONS)

异常的来源

  • 处理器检测到的程序错误异常
  • 软件生成的异常
  • 机器检查异常

6.4.1 程序错误异常(Program-Error Exceptions)

当在应用程序、操作系统或执行器的执行过程中检测到程序错误时,处理器会生成一个或多个异常。Intel 64和IA-32体系结构为每个处理器可检测到的异常定义了一个向量号。

6.4.2 软件生成的异常(Software-Generated Exceptions)

INTO、INT 3 和 BOUND 指令允许在软件中生成异常。这些指令允许在指令流的某些点执行异常条件的检查。

例如,INT 3 会生成断点异常。INT n 指令可以用于在软件中模拟异常;但是有一个限制。如果 INT n 提供了一个体系结构定义的异常的向量,处理器将生成一个中断到正确的向量(以访问异常处理程序),但不会将错误码推送到栈上。即使相关的硬件生成的异常通常会产生一个错误码。异常处理程序在处理异常时仍然会尝试从栈中弹出一个错误码。因为没有错误码被推送,处理程序将弹出并丢弃EIP(代替缺失的错误码)。这将导致返回到错误的位置。

6.4.3 机器检查异常(Machine-Check Exceptions)

P6家族和Pentium处理器为检查内部芯片硬件和总线事务的操作提供了内部和外部机器检查机制。当检测到机器检查错误时,处理器会发出一个机器检查异常(向量18)并返回一个错误码。

6.5 异常分类(EXCEPTION CLASSIFICATIONS)

异常根据它们的报告方式以及引发异常的指令是否可以在不丢失程序或任务连续性的情况下重启,被分类为故障、陷阱或中止。

  • 故障(Faults):故障是一种通常可以纠正的异常,一旦纠正,允许程序在不丢失连续性的情况下重新启动。当报告故障时,处理器将机器状态恢复到执行引发故障指令之前的状态。故障处理程序的返回地址(CS和EIP寄存器的保存内容)指向引发故障的指令,而不是指向引发故障指令后面的指令。

  • 陷阱(Traps):陷阱是在陷阱指令执行后立即报告的异常。陷阱允许继续执行程序或任务,而不会丢失程序连续性。陷阱处理程序的返回地址指向陷阱指令后要执行的指令。

  • 中止(Aborts):中止是一种异常,不总是报告引发异常的指令的精确位置,并且不允许重新启动引发异常的程序或任务。中止用于报告严重错误,例如硬件错误和系统表中的不一致或非法值。

通常作为故障报告的一种子集的异常是不可重启的。这种异常会导致一些处理器状态的丢失。这类情况被视为编程错误。引发这类异常的应用程序应该被操作系统终止。

6.6 程序或任务的重启(PROGRAM OR TASK RESTART)

为了允许在处理异常或中断后重新启动程序或任务,所有的异常(除了中止)都保证在指令边界上报告异常。所有的中断也保证在指令边界上被触发。

6.6.1 故障重启

对于属于故障类别的异常,返回指令指针(处理器生成异常时保存的)指向引发故障的指令。因此,在处理故障后重新启动程序或任务时,会重新执行引发故障的指令。重新启动引发故障的指令通常用于处理当对操作数的访问被阻止时生成的异常。

这类异常的最常见例子是当程序或任务引用位于内存中不存在的页面上的操作数时产生的页面故障异常(#PF)。当发生页面故障异常时,异常处理程序可以将页面加载到内存中,并通过重新执行引发故障的指令继续执行程序或任务。为了确保重启对当前正在执行的程序或任务透明,处理器保存了必要的寄存器和堆栈指针,以允许将状态还原到执行引发故障指令之前的状态。

6.6.2 陷阱重启

对于属于陷阱类别的异常,返回指令指针指向陷阱指令后要执行的指令。如果在执行一个传递执行权的指令时检测到陷阱,返回指令指针会反映这次传递。

例如,如果在执行一个JMP指令时检测到陷阱,返回指令指针将指向JMP指令的目标,而不是指向JMP指令之后的地址。所有的陷阱异常允许在不丢失连续性的情况下重新启动程序或任务。

例如,溢出异常就是一种陷阱异常。在这种情况下,返回指令指针指向测试EFLAGS.OF(溢出)标志的INTO指令之后的指令。此异常的处理程序解决了溢出条件。从陷阱处理程序返回后,程序或任务的执行会继续执行INTO指令之后的指令。

6.6.3 中止重启

属于中止类别的异常不支持可靠地重新启动程序或任务。中止处理程序设计用来收集处理器在发生中止异常时的诊断信息,然后尽可能平稳地关闭应用程序和系统。

6.7 非屏蔽中断 (NMI)

NMI的来源

  • 外部硬件触发NMI引脚。
  • 处理器在系统总线(Pentium 4、Intel Core Duo、Intel Core 2、Intel Atom和Intel Xeon处理器)或APIC串行总线(P6家族和Pentium处理器)上接收到带有传递模式NMI的消息。

当处理器从以上任一来源接收到NMI时,处理器会立即调用由中断向量号2指向的NMI处理程序来处理它。处理器还会调用特定的硬件条件,以确保在NMI处理程序执行完成之前,不会接收到其他中断,包括NMI中断。

6.7.1 处理多个NMI(Handling Multiple NMIs)

在执行NMI中断处理程序时,处理器会阻止后续的NMI传递,直到IRET指令的下一次执行。这种NMI的阻止可以防止NMI处理程序的嵌套执行。

6.8 使能和禁用中断(ENABLING AND DISABLING INTERRUPTS)

6.8.1 屏蔽可屏蔽的硬件中断(Masking Maskable Hardware Interrupts)

IF标志可以禁用通过处理器的INTR引脚或通过本地APIC接收到的可屏蔽硬件中断的服务。

  • 当IF标志清除时,处理器会阻止传递到INTR引脚或通过本地APIC引脚的中断产生内部中断请求;
  • 当IF标志置位时,传递到INTR或通过本地APIC引脚的中断将被处理为普通的外部中断。

IF标志不影响传递到NMI引脚或通过本地APIC传递模式NMI消息的非屏蔽中断,也不影响处理器生成的异常。与EFLAGS寄存器中的其他标志一样,处理器在响应硬件复位时会清除IF标志。

IF标志还受以下操作的影响:

  • PUSHF指令将所有标志存储到堆栈上,可以在那里进行检查和修改。POPF指令可用于将修改后的标志加载回EFLAGS寄存器。
  • 任务切换和POPF以及IRET指令加载EFLAGS寄存器;因此,它们可以用于修改IF标志的设置。
  • 当通过中断门处理中断时,IF标志会自动清除,从而禁用可屏蔽硬件中断。(如果通过陷阱门处理中断,IF标志则不会被清除。)

6.8.2 屏蔽指令断点

EFLAGS寄存器中的RF(恢复)标志控制处理器对指令断点条件的响应。RF标志的主要功能是防止处理器在指令断点上进入调试异常循环。

  • 当RF标志被设置时,它防止指令断点引发调试异常(#DB);
  • 当清除时,指令断点将引发调试异常。

6.8.3 切换堆栈时屏蔽异常和中断

在切换到不同的堆栈段时,软件通常使用一对指令,例如:

MOV SS, AX
MOV ESP, StackTop

处理器会在MOV到SS指令或POP到SS指令之后,直到下一条指令的边界被达到,禁止中断、调试异常和单步陷阱异常。

6.9 同时异常和中断的优先级(PRIORITY AMONG SIMULTANEOUS EXCEPTIONS AND INTERRUPTS)

在这里插入图片描述
处理器首先处理具有最高优先级的异常或中断,将执行转移到处理程序的第一条指令。较低优先级的异常会被丢弃;较低优先级的中断则会保持挂起状态。当中断处理程序将执行返回到程序或任务中发生异常和/或中断的点时,被丢弃的异常会重新生成。

6.10 中断描述符表 (IDT)

中断描述符表 (IDT) 将每个异常或中断向量与处理相关异常或中断的过程或任务的门描述符关联起来。

在这里插入图片描述

构成中断描述符表(IDT)

中断描述符表(IDT)是一个包含各种中断和异常处理程序地址的数据结构。它是由多个描述符组成的数组,每个描述符对应一个特定的中断或异常类型。IDT中的每个描述符都包含了中断或异常处理程序的入口地址和相关的特殊标志。

获取中断处理程序的地址

中断处理程序的地址是存储在IDT的相应描述符中的。当中断或异常发生时,处理器会使用中断向量号(或异常号)作为索引,找到IDT中相应的描述符。描述符中包含了处理程序的地址。处理器使用这个地址来跳转到中断或异常处理程序的代码。

设置中断描述符表寄存器:

为了告诉处理器在哪里可以找到IDT,需要使用中断描述符表寄存器(IDTR)。IDTR是一个64位寄存器,包含了IDT的基地址和限制(IDT的大小减去1)。要设置IDTR,需要将IDT的基地址(即IDT的起始物理地址)和大小(以字节为单位,减去1)加载到IDTR寄存器中。

6.11 IDT 描述符

IDT可以包含三种类型的门描述符:

  • 任务门描述符(Task-gate descriptor): 任务门描述符允许程序切换到不同的任务。它包含了指向任务状态段(TSS)的选择子,当发生任务切换时,处理器将加载TSS中的任务上下文。

  • 中断门描述符(Interrupt-gate descriptor): 中断门描述符用于处理中断。当中断门描述符被调用时,处理器会自动禁用中断(IF标志被清除),以防止嵌套中断。中断门通常用于非可屏蔽中断(NMI)等紧急情况。

  • 陷阱门描述符(Trap-gate descriptor): 陷阱门描述符类似于中断门描述符,但不会禁用中断。当陷阱门被调用时,处理器不会改变IF标志,允许嵌套发生。陷阱门通常用于调试器或系统监视器等需要处理中断的情况。

在这里插入图片描述

6.12 异常和中断处理(EXCEPTION AND INTERRUPT HANDLING)

6.12.1 异常或中断处理程序(Exception- or Interrupt-Handler Procedures)

中断门或陷阱门引用了在当前执行任务的上下文中运行的异常或中断处理程序。门的段选择子指向GDT或当前LDT中的可执行代码段的段描述符。门描述符的偏移字段指向异常或中断处理程序的开始处。
在这里插入图片描述
在这里插入图片描述
当通过IDT中的任务门访问异常或中断处理程序时,会导致任务切换。使用单独的任务处理异常或中断的8优点:

  • 中断的整个上下文会被自动保存。
  • 新的TSS允许处理程序在处理异常或中断时使用新的特权级别0堆栈。如果在当前特权级别0堆栈受损时发生异常或中断,通过任务门访问处理程序可以通过提供处理程序新的特权级别0堆栈来防止系统崩溃。
    通过为其分配一个单独的地址空间(通过单独的LDT),处理程序可以与其他任务隔离。
  • 使用单独的任务处理中断的缺点在于,在任务切换时必须保存的机器状态较多,这使得它比使用中断门慢,导致了增加的中断响应延迟。IDT中的任务门引用了GDT中的TSS描述符。

在这里插入图片描述

一般的中断处理流程:

  • 中断触发: 中断可以由外部硬件、软件指令(例如INT指令)、或者处理器内部发生的错误(例如除以零)触发。当中断发生时,处理器会停止当前正在执行的任务,保存当前的执行上下文。

  • 中断向量的确定: 中断向量是中断类型的唯一标识符。处理器使用中断向量作为索引,从中断描述符表(IDT)中找到相应的中断门描述符。中断门描述符中包含了中断处理程序的地址和代码段选择子。

  • 特权级别检查: 处理器会检查中断门描述符中的特权级别(DPL),确保当前特权级别(CPL)小于或等于中断门描述符中的DPL。如果不满足这个条件,会产生通用保护异常(#GP)。

  • 堆栈切换(如果需要): 如果中断处理程序使用了不同的堆栈,处理器会执行堆栈切换,将当前堆栈指针(ESP)切换到中断处理程序的堆栈。

  • 中断处理程序执行: 处理器跳转到中断处理程序的地址,开始执行中断处理程序的指令。中断处理程序执行期间,它可以访问中断相关的数据,执行必要的操作,最终处理中断。

  • 中断处理完成: 中断处理程序执行完毕后,它需要调用IRET(Interrupt Return)指令返回。IRET指令会从堆栈中弹出保存的执行上下文,包括标志寄存器的值,并将控制权返回到之前被中断的程序。

  • 恢复执行: 一旦中断处理程序执行完毕,处理器会从中断点的下一条指令继续执行。如果中断发生时处于用户模式(CPL=3),处理器会恢复用户模式,并继续执行用户程序。

6.13 错误码(ERROR CODE)

在这里插入图片描述

  • 外部事件(EXT)- 位 0: 当置位时,表示异常是由于程序外部的事件引起的,比如中断或先前的异常。
  • IDT描述符位置(位 1): 当置位时,表示错误码的索引部分指向IDT中的门描述符;当清零时,表示索引指向GDT或当前LDT中的描述符。
  • TI GDT/LDT(位 2): 仅在IDT标志清零时使用。当置位时,表示错误码的索引部分指向LDT中的段或门描述符;当清零时,表示索引指向当前GDT中的描述符。

6.14 64位模式的异常和中断处理(EXCEPTION AND INTERRUPT HANDLING IN 64-BIT MODE)

在64位模式下的中断和异常处理的一些特点:

  • 中断处理程序: 在64位模式下,IDT中的所有中断处理程序都是64位代码(SMI处理程序除外)。
  • 中断栈推送: 中断栈的推送大小固定为64位,处理器使用8字节的零扩展存储。
  • 栈指针(SS:RSP)推送: 在中断发生时,栈指针(SS:RSP)会被无条件地推送到栈上。在传统模式下,这种推送是有条件的,基于当前特权级(CPL)的变化。
  • 新的SS: 如果CPL发生变化,新的SS被设置为NULL。
  • IRET行为: IRET指令的行为发生了变化。
  • 新的中断栈切换机制: 在64位模式下引入了新的中断栈切换机制。
  • 中断栈帧的对齐: 中断栈帧的对齐方式不同。

中断过程调用的流程通常如下:

  1. 触发中断/异常: 当硬件或软件条件满足时,中断或异常会被触发。

  2. 中断处理程序的查找: 处理器使用中断向量(或异常向量)作为索引,查找中断描述符表(IDT)中的对应门描述符。中断描述符表中的门描述符可以是中断门、陷阱门或者任务门。

  3. 根据门类型选择处理方式: 如果是中断门,会将当前处理器状态保存(通常是EFLAGS、CS、EIP等),然后跳转到中断服务例程。如果是陷阱门,不会保存处理器状态,直接跳转到中断服务例程。

  4. 处理中断/异常: 中断服务例程处理中断/异常,可能会修改处理器状态、处理中断/异常相关的操作,执行完中断服务例程后,会根据中断门类型的不同,进行不同的操作。

    • 如果是中断门(Interrupt Gate),执行完中断服务例程后,使用IRET指令恢复被保存的处理器状态,包括EFLAGS、CS、EIP等。IRET会将栈中的内容弹出到相应寄存器,从而返回到之前被中断的程序。

    • 如果是陷阱门(Trap Gate),执行完中断服务例程后,使用IRET指令恢复被保存的处理器状态,同样也会从栈中弹出内容,返回到之前被中断的程序。

  5. 继续执行中断后的指令: 返回到中断后的程序,继续执行中断后的指令。

判断中断处理过程与被中断任务的优先级

通常基于中断门或陷阱门描述符的特权级(DPL字段)。DPL字段表示中断服务例程的权限级别。如果中断服务例程的DPL大于或等于当前CPL(当前特权级别),则可以被执行。如果DPL小于CPL,则会发生“通用保护故障”(General Protection Fault)。

不同优先级上,处理方式可能是不同的。

通常情况下,更高优先级的中断会打断当前正在执行的低优先级任务,以便迅速响应。这是通过中断嵌套(Interrupt Nesting)来实现的。处理高优先级中断时,可能会禁用低优先级中断,以确保高优先级任务的快速响应。在低优先级中断处理结束后,高优先级中断会被重新启用。

如果发生堆栈切换,处理器通常会在堆栈上保存当前的处理器状态(EFLAGS、CS、EIP等)和其他寄存器的值。然后,处理器会将新的堆栈指针(SS:RSP)加载到RSP寄存器,以便中断服务例程使用新的堆栈。

如果没有发生堆栈切换

处理器会继续使用当前的堆栈,不会改变堆栈指针的值。中断服务例程执行完后,处理器会使用IRET指令将之前保存的处理器状态从堆栈中弹出,恢复到中断发生时的状态,然后继续执行中断后的指令。

异常和中断处理过程中的保护通常包括以下几个方面:

  • 栈保护: 确保在中断处理过程中正确使用栈,避免栈溢出或栈下溢。

  • 数据保护: 确保在中断处理过程中不会损坏关键数据,避免数据被错误地修改。

  • 指令保护: 中断服务例程通常是受信任的代码,但仍然需要确保不受到恶意指令注入的影响。

异常和中断处理过程中的标志使用方式通常包括以下几个方面:

  • 中断允许(IF)标志: 当IF标志为1时,处理器可以响应外部中断。在中断服务例程开始执行时,通常会将IF标志清零,以防止被其他中断打断。在中断服务例程结束时,会使用IRET指令将IF标志恢复到先前的值。

  • 方向(DF)标志: DF标志用于字符串操作中的方向。在中断服务例程中,通常需要根据具体需求来设置DF标志。

中断门与陷阱门的唯一区别

在于CPU在使用中断门时会自动将IF(中断允许)标志清零,而在使用陷阱门时不会改变IF标志的值。这意味着,使用中断门时,会在进入中断服务例程前禁用外部中断,而使用陷阱门时,外部中断仍然会被响应,可以嵌套处理中断。

相关文章:

CH6-中断和异常处理

6.1 中断和异常处理概述 中断和异常概述(INTERRUPT AND EXCEPTION OVERVIEW) 中断和异常向量:中断和异常在处理器中都有对应的编号,被称为向量。当中断或异常发生时,处理器会根据向量找到相应的中断处理程序或异常处理…...

Hive的文件合并

背景:Flink数据写入到stage层,然后再入ods层,中间导致hive数据实时性不强,随后做优化,Flink之间以orc格式写入到hive 问题:单表日800亿数据量,产生过多的小文件,影响Impala查询 解决:对hive小文件进行合并, ALTER TABLE lt_ipsy_xdr_temp PARTITION (day20230829, hour9,type…...

Mac删除不在程序坞的程序

现象描述:删除某个程序时(通过‘程序’列表中将该应用移动到废纸篓里),该应用程序正在运行中,删除过程该程序未提示正在运行中,仅仅删除了图标(在此吐槽下该程序的交互,产品没有考虑…...

c#删除数组中符合条件的元素

错误写法 List<int> list new List<int>() { 1, 2, 3, 4 }; for (int i 0; i < sz; i){if (i 1 || i 2)list.RemoveAt(i);}在迭代过程中删除数组元素会有很大的问题&#xff0c;例如删除后位置移动&#xff0c;导致不该被删除的元素被删除。还可能导致数组…...

sqoop 脚本密码管理

1&#xff1a;背景 生产上很多sqoop脚本的密码都是铭文&#xff0c;很不安全&#xff0c;找了一些帖子&#xff0c;自己尝试了下&#xff0c;记录下细节&#xff0c;使用的方式是将密码存在hdfs上然后在脚本里用别名来替代。 2&#xff1a;正文 第一步&#xff1a;创建密码对…...

微信小程序使用CryptoJS加密PassWord(MD5)

微信小程序使用CryptoJS加密PassWord(MD5) 背景及环境&#xff1a; 微信小程序登录页面&#xff0c;需要加密登录密码发送给后端&#xff0c;使用 MD5 来加密密码 开发工具&#xff1a;微信开发者工具 npm安装CryptoJS 查看有哪些crypto的包 npm search crypto 找到自己需要的包…...

国有企业合同领域的合规管理

随着中国经济的快速发展和市场经济体制的完善&#xff0c;国有企业在国民经济中的地位和作用日益凸显。作为经济主体之一&#xff0c;国有企业必须积极适应市场环境的变化&#xff0c;加强合同管理&#xff0c;提高合规水平&#xff0c;以实现持续发展目标。本文将围绕国有企业…...

Joe主题魔改:正文内容实现图片懒加载

引言 有个哥们问我Joe主题的正文部分&#xff0c;如何同样图片懒加载&#xff0c;于是便研究了一下。 探索过程 因为PHP语言我用的很少&#xff0c;并不擅长&#xff0c;于是我去网上搜了一下。 方案一&#xff1a;用一个叫Jquery Lazyload的JavaScript脚本&#xff0c;我尝…...

网络爬虫实践小结

背景 近期工作中要解决两个问题&#xff0c;一个是数据组需要网爬一些图片数据&#xff0c;另外一个是要批量爬取公司用于文档协同的一个网站上的附件。于是乎&#xff0c;就写了两个脚本去完成任务。 爬虫思路 第一步&#xff1a;向确定的url发送请求&#xff0c;接收服务器…...

逍遥魔兽:如何在服务器上挂机器人?

逍遥魔兽是一款备受欢迎的魔兽世界经典版本&#xff0c;对于许多玩家来说&#xff0c;为了提升游戏体验和效率&#xff0c;他们希望能够在服务器上挂机器人。本文将为您详细讲解如何实现在逍遥魔兽服务器上挂机器人&#xff0c;以提高游戏进程的自动化效率。 第一部分&#x…...

软件工程与计算总结(九)软件体系结构基础

目录 ​编辑 一.体系结构的发展 二.理解体系结构 1.定义 2.区分体系结构的抽象与实现 3.部件 4.连接件 5.配置 三.体系结构风格初步 1.主程序/子程序 2.面向对象式 3.分层 4.MVC 一.体系结构的发展 小规模编程的重点在于模块内部的程序结构非常依赖于程序设计语言…...

bootz启动 Linux内核涉及do_bootm_linux 函数

一. bootz启动Linux uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令&#xff0c;例如&#xff0c;bootm命令等等。 本文只分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。具体分析 do_bootm_linux函数执行过程。 本文继上一篇文章&#xff0c;地址…...

ipad有必要用手写笔吗?性价比电容笔排行榜

随着技术的进步&#xff0c;各种新型的数字电子产品不断涌现。比如说&#xff0c;智能手机、ipad、电容笔之类的东西。但事实上&#xff0c;要将iPad的功能发挥到极致&#xff0c;我认为&#xff0c;这款电容笔&#xff0c;就必不可少的了。这就好像我们在ipad平板上书写东西&a…...

jmeter怎样的脚本设计才能降低资源使用

官网地址&#xff1a;Apache JMeter - Users Manual: Best Practices 1、用好断言 频繁的使用断言会加大资源的消耗&#xff0c;尽可能减少断言的使用&#xff0c;或者在使用的过程中断言数据文本尽量精简&#xff0c;断言内容尽量以status/code、msg/message来判断&#xff0…...

如何避免 IDEA 每次重启都index

如何避免 IDEA 每次重启都index 在 IntelliJ IDEA 中&#xff0c;可以通过以下几个步骤来避免每次重启时索引&#xff1a; 打开 File -> Settings 菜单。在左侧的菜单栏中选择 “Appearance & Behavior” -> “System Settings” -> “Synchronization”。 在右…...

ImagePreview查看gif图,关闭之后原图不动了

vant的ImagePreview查看大图&#xff0c;当查看的是gif图的时候&#xff0c;关闭查看大图弹窗&#xff0c;原图不动了&#xff0c;ios上几乎必现。 解决的方案是&#xff0c;监听onclose事件&#xff0c;在关闭的时候把原图的gif图地址重新设置一下就好了 sceneImg(url: stri…...

实现基于 GitLab 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节&#xff0c;也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中&#xff0c;像处理代码那样处理数据库变更呢&#xff1f; DORA 调研报告 DORA&#xff08;DevOps Research &am…...

android关闭键盘方法

Android开发中经常会遇到隐藏键盘的需求&#xff0c;例如登录界面&#xff0c;输入账号密码后需要点击界面其它部位&#xff0c;隐藏键盘。为此&#xff0c;分享前几年自己使用的方法&#xff0c;最近亲自测试&#xff0c;仍然有效。 方法一、Window window getWindow(); Win…...

ACK 云原生 AI 套件:云原生 AI 工程化落地最优路径

作者&#xff1a;胡玉瑜(稚柳) 前言 在过去几年中&#xff0c;人工智能技术取得了突飞猛进的发展&#xff0c;涵盖了机器学习、深度学习和神经网络等关键技术的重大突破&#xff0c;这使得人工智能在各个领域都得到广泛应用&#xff0c;对各行各业产生了深远的影响。 特别值…...

工程企业管理软件源码-综合型项目管理软件

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…...

stm32mp157中断简单应用

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 main.c #include "gpio.h" #include &…...

智慧机场数字孪生大屏升级智慧出行全方位服务

在宁波栎社国际机场的信息中心大楼内&#xff0c;一块大屏幕上展示了一座“数字孪生”机场。通过点击屏幕上的各个板块&#xff0c;可以实时查看现场情况&#xff0c;一旦出现突发状况&#xff0c;还可以立即启动闭环处置流程…… &#xff08;图源自宁波机场&#xff09; 在数…...

微信小程序 js中写一个px单位转rpx单位的函数

大家写东西自然还是会比较喜欢用rpx 但是 事实证明 在js中 还是px好用 因为很多单位交互的函数还是只返回px单位的 理论上将 750 rpx 是整个屏幕的宽度 那么 我们可以这样写一个函数 pxToRpx(px) {//获取整个屏幕的宽度单位 pxlet screenWidth wx.getSystemInfoSync().scree…...

第14章总结:lambda表达式与处理

14.1&#xff1a; lambada表达式 14.1.1&#xff1a;lambada表达式简介 无参数 package fourteen; interface SayhHi{ String say();//抽象方法接口 } public class NoParamDemo { public static void main(String[] args) { //无参数 …...

多尺度retinex图像去雾算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)img_in im2doub…...

蓝桥等考Python组别十八级005

第一部分:选择题 1、Python L18 (15分) 运行下面程序,输入30,输出的结果是( )。 t = int(input()) if t < 30: print(0) else: print(t // 15 * 2) 4102030正确答案:A 2、Python L18 (15分)...

redis在linux系统的安装与使用

一、单机安装Redis。 1.安装redis依赖 在控制台输入 yum install -y gcc tcl2.上传安装包 下载好的安装包上传到/usr/local/src/ 上传方法&#xff1a; 1.确保你拥有Linux服务器的IP地址、用户名和密码。 2.在Windows上&#xff0c;打开命令提示符&#xff08;Command Promp…...

PanoFlow:学习360°用于周围时间理解的光流

1.摘要&#xff1a; 光流估计是自动驾驶和机器人系统中的一项基本任务&#xff0c;它能够在时间上解释交通场景。自动驾驶汽车显然受益于360提供的超宽视野&#xff08;FoV&#xff09;◦ 全景传感器。 然而&#xff0c;由于全景相机独特的成像过程&#xff0c;为针孔图像设计…...

C# - 常用API

Assembly.GetCallingAssembly 方法 获取当前方法的调用程序集: Console.WriteLine("FirstMethod called from: " Assembly.GetCallingAssembly().FullName); Assembly.GetExecutingAssembly 方法 获取包含当前执行的代码的程序集: //获取当前执行的代码的程序集…...

新式茶饮品牌如何写出生活感软文

居民消费水平的提升使新式茶饮品牌的市场不断扩张&#xff0c;在竞争激烈的茶饮市场中&#xff0c;品牌提高知名度的主要方式之一就是软文营销&#xff0c;而生活感软文是茶饮软文中较为常见的类型&#xff0c;它能有效拉进品牌与消费者之间的距离&#xff0c;那么新式茶饮品牌…...