首页 > 其他分享 ><转载>bios 关机过程

<转载>bios 关机过程

时间:2024-08-07 15:28:27浏览次数:15  
标签:reset 关机 CNT PM1 system bios PCH 过程 ACPI

[CSDN BIOS关机过程](https://blog.csdn.net/robinsongsog/article/details/50993333)

热启动, 冷启动,关机,这些词相信大家都很熟悉,今天就从BIOS 的角度,说说这三种reset 具体是怎么实现的。

/**
  Reset the system.
  @param ResetType       warm or cold
  @param ResetStatus     possible cause of reset
  @param DataSize        Size of ResetData in bytes
  @param ResetData       Optional Unicode string
**/
VOID
EFIAPI
KbcResetSystem (
  IN EFI_RESET_TYPE   ResetType,
  IN EFI_STATUS       ResetStatus,
  IN UINTN            DataSize,
  IN VOID             *ResetData OPTIONAL
   )
{
  switch (ResetType) {
  case EfiResetWarm:
    ResetWarm ();
    break;
  case EfiResetCold:
    ResetCold ();
    break;
  case EfiResetShutdown:
    ResetShutdown ();
    break;
  default:
    return;
  }
 
  //
  // Given we should have reset getting here would be bad
  //
  ASSERT (FALSE);
}

热启动的代码就这个样子的:

/**
  Calling this function causes a system-wide initialization. The processors
  are set to their initial state, and pending cycles are not corrupted.
  System reset should not return, if it returns, it means the system does
  not support warm reset.
**/
VOID
EFIAPI
ResetWarm (
  VOID
  )
{
  IoWrite8 (R_PCH_RST_CNT, 0x0);
  IoWrite8 (R_PCH_RST_CNT, 0x4);
}

#define R_PCH_RST_CNT 0xCF9

所以它的实现就是往IO先填0, 然后填4.

下面看看CF9 具体有哪些作用:

简单解读一下:

第2位: 当这一位由0变为1的时候,它将触发一次hard 或者soft reset. 至于是hard 还是soft 则由第一位决定。

冷启动的代码是这个样子的:

/**
  Calling this function causes a system-wide reset. This sets
  all circuitry within the system to its initial state. This type of reset
  is asynchronous to system operation and operates without regard to
  cycle boundaries.
 
  System reset should not return, if it returns, it means the system does
  not support cold reset.
**/
VOID
EFIAPI
ResetCold (
  VOID
  )
{
  IoWrite8 (R_PCH_RST_CNT, 0x2);
  IoWrite8 (R_PCH_RST_CNT, 0x6);
}

关机是这样的:

/**
  Calling this function causes the system to enter a power state equivalent
  to the ACPI G2/S5 or G3 states.
 
  System shutdown should not return, if it returns, it means the system does
  not support shut down reset.
**/
VOID
EFIAPI
ResetShutdown (
  VOID
  )
{
  UINT16  PchPmioBase;
  UINT16  Data16;
  UINT32  Data32;
 
  //
  // Firstly, ACPI decode must be enabled
  //
  PciOr8 (
    PCI_LIB_ADDRESS (DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_PMC, PCI_FUNCTION_NUMBER_PCH_PMC, R_PCH_PMC_ACPI_CNT),
    (UINT8) (B_PCH_PMC_ACPI_CNT_ACPI_EN)
    );
 
  PchPmioBase = (UINT16) (PciRead16 (PCI_LIB_ADDRESS (DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_PMC, PCI_FUNCTION_NUMBER_PCH_PMC, R_PCH_PMC_ACPI_BASE)) & ~BIT0);
 
  //
  // Then, GPE0_EN should be disabled to avoid any GPI waking up the system from S5
  //
  Data16 = 0;
  IoWrite16 (
    (UINTN)(PchPmioBase + R_PCH_ACPI_GPE0_EN_127_96),
    (UINT16)Data16
    );
 
  //
  // Secondly, PwrSts register must be cleared
  //
  // Write a "1" to bit[8] of power button status register at
  // (PM_BASE + PM1_STS_OFFSET) to clear this bit
  //
  Data16 = B_PCH_ACPI_PM1_STS_PWRBTN;
  IoWrite16 (
    (UINTN)(PchPmioBase + R_PCH_ACPI_PM1_STS),
    (UINT16)Data16
    );
 
  //
  // Finally, transform system into S5 sleep state
  //
  Data32 = IoRead32 ((UINTN) (PchPmioBase + R_PCH_ACPI_PM1_CNT));
 
  Data32 = (UINT32) ((Data32 & ~(B_PCH_ACPI_PM1_CNT_SLP_TYP + B_PCH_ACPI_PM1_CNT_SLP_EN)) | V_PCH_ACPI_PM1_CNT_S5);
 
  IoWrite32 (
    (UINTN)(PchPmioBase + R_PCH_ACPI_PM1_CNT),
    (UINT32)Data32
    );
 
  Data32 = Data32 | B_PCH_ACPI_PM1_CNT_SLP_EN;
 
  IoWrite32 (
    (UINTN)(PchPmioBase + R_PCH_ACPI_PM1_CNT),
    (UINT32)Data32
    );
 
  return;
}

这里的关机指的是系统进S5.

很容易,我们可以找到 R_PCH_ACPI_PM1_CNT 的值:

define R_PCH_ACPI_PM1_CNT 0x04

即关机的过程是往pmiobase+04的位置填上相应的值。

这个位置,具体是这样描述的:

即在第12:10 填上111b.

summary:

一言以蔽之, 重启就是往CF9里面填相应的值,关机就是往PMBASE + 04h 填上相应的值。

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/robinsongsog/article/details/50993333

标签:reset,关机,CNT,PM1,system,bios,PCH,过程,ACPI
From: https://www.cnblogs.com/jade23/p/18347052

相关文章

  • Leetcode 141. 环形链表(超详图解,解析过程)
    141.环形链表点击跳转leetcode原题给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos......
  • QWen2-72B-Instruct模型安装部署过程
    最近在给我们的客户私有化部署我们的TorchV系统,客户给的资源足够充裕,借此机会记录下部署千问72B模型的过程,分享给大家!一、基础信息操作系统:Ubuntu22.04.3LTSGPU:A800(80GB)*8内存:1TB二、软件信息Python:3.10Pytorch:2.3.0Transformers:4.43.0vLLM:0.5.0cuda:......
  • 升级 Windows AD 域控制器的基本步骤和注意事项,帮助你顺利进行升级并减少潜在的中断风
    简单的初级教程大纲,帮助你理解如何升级WindowsAD域控制器:1. 准备阶段评估当前环境确认当前域控制器的操作系统版本和硬件配置。确保域控制器上的所有关键服务和应用程序支持升级后的操作系统版本。备份使用系统备份工具(如WindowsServerBackup)备份当前域控制器......
  • Linux系统下通过ssh免密实现一键批量关机
     一、实验环境介绍本文通过一台控制端机器对其他多台机器进行远程关机操作,实验IP如下:控制端:192.168.80.177被控制关机端:192.168.80.130,192.168.80.206二、ssh免密登录配置以下操作均在控制端(80.177)上用root用户权限进行操作1、生成私钥密钥对,执行ssh-keygen -t rsa然......
  • BIOS设置与系统分区
    一BIOS1破解密码的前提Windows密码可以使用第三方工具(大白菜)破解------为了预防-----设置BIOS密码(不推荐设置密码)可以使用扣电池破解(CMOS)。。。。。像非实体设备(像QQ)前提:第三方验证实体设备前提:拿到本机重点:绝大多数都是故意预留可以破解密码(因为如果忘记密码,将无法重装系统......
  • 在K8S中,Deployment的升级过程是什么?
    在Kubernetes中,Deployment提供了一种非常强大的方式来更新应用,同时保持应用的可用性。以下是使用Deployment进行应用升级的过程,包括滚动更新、回滚、暂停和恢复更新等操作。1.升级过程准备工作:确保你有一个现有的Deployment。准备新的容器镜像或者其他需要更改的配置......
  • 在K8S中,deployment的创建过程包括什么?
    在Kubernetes(K8S)中,Deployment的创建过程是一个涉及多个组件和步骤的复杂流程。以下是一个详细的步骤说明,包括从创建Deployment配置文件到Pod在集群中实际运行的整个过程:1.创建Deployment配置文件首先,需要准备一个YAML格式的配置文件,用于定义Deployment的属性。这个配置文件包含......
  • C#:具体类=>抽象类=>接口的进化过程详解
    文章目录简单复习继承与多态具体类抽象类及成员使用语法接口抽象类到接口的进化简单复习继承与多态下面,我用一个交通工具的例子来快速复习一下.1.首先我定义一个基类Vehicle,代表交通工具的总称.里面定义了一个可被重写的成员方法Run.classVehicle{......
  • BIOS1101 Evolutionary and Functional
    BIOS1101Evolutionaryand Functional Biology -2024GeneralCourseInformationCourseCode:  BIOS1101Year : 2024Term: Term2CourseDetails&OutcomesCourseDescriptionThis course examines the evolutionary history of life on earth fr......
  • torch.nn.Linear的维度变换过程详解(有图有公式有代码)
    当初在学习nn.Linear时了解到的博客都是关于一维变换的,比如输入3通道,输出6通道;又比如得到(3,4,4)的特征图,需要进行拉平为(48,)的向量,然后通过nn.Linear(48,10)得到10个输出(分类任务很常见)。nn.Linear除了可以进行分类,主要的作用就是改变维度便于下一个卷积层或线形层的输入。但是在实......