openbmc hwmon与sensor监控

1.说明

参考文档:

  • https://github.com/openbmc/entity-manager/blob/master/docs/entity_manager_dbus_api.md
  • https://github.com/openbmc/entity-manager/blob/master/docs/my_first_sensors.md

1.1 简单介绍

注意: 本节是快速浏览整个sensor框架,了解大致openbmc sensor的运行机制。难免会有相关描述不当,谨慎阅读。

本节主要简述怎么让sensoropenbmc上运行起来。 sensor包含物理硬件数据的读取与sensor相关的配置信息,例如阈值,sensor名字(ipmitool sensor list出来的名字)。

openbmc上讲究的均为功能分离,模块化的管理。因此,简单说涉及到几个文件:

  • 内核hwmon: 底层实际和物理硬件通信,获取实际的数据。
  • https://github.com/openbmc/dbus-sensors,实际应用层获取sensor数据,暴露到dbus
  • https://github.com/openbmc/entity-manager,sensor的配置信息,暴露到dbus上。

1.2 文件关系与文档

  • 内核hwmon: 底层实际和物理硬件通信,获取实际的数据。
  • https://github.com/openbmc/dbus-sensors,实际应用层获取sensor数据,暴露到dbus
  • https://github.com/openbmc/entity-manager,sensor的配置信息,暴露到dbus上。

hwmon介绍上描述的均为让温度、电压、风扇、电源等设备管理的更加的方便。

摘抄一下文件:linux-aspeed/drivers/hwmon/hwmon.c中的描述:

hwmon.c - part of lm_sensors, Linux kernel modules for hardware monitoring
This file defines the sysfs class "hwmon", for use by sensors drivers.

所以,简单说,hwmon定义了sysfs接口,硬件监控的数据获取均从sysfs接口拿到。

参考阅读文档:

  • linux/Documentation/hwmon/hwmon-kernel-api.rst
  • linux/include/linux/hwmon-sysfs.h

分析hwmon会发现openbmc将物理sensor的数据获取下放到kernel driver层。这还是对于驱动的稳定性抱很大的信心哪。

2.分析hwmon

2.1 目录内容

查看目录,可以看到如下图所示内容:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 驱动分析

驱动代码位置在:kernel/linux/drivers/hwmon/hwmon.c,先分析一下该文件,然后延申,了解整个驱动框架做了什么事情。

2.2.1 文件kernel/linux/drivers/hwmon/hwmon.c分析

1.入口函数

入口函数为:hwmon_init(),调用内容如下:

static int __init hwmon_init(void)
---> hwmon_pci_quirks(); 
	---> #if defined CONFIG_X86 && defined CONFIG_PCI //不定义这2项,函数代码是不执行的
---> class_register(&hwmon_class);

看一下hwmon_class的定义:

static struct class hwmon_class = {
	.name = "hwmon",
	.owner = THIS_MODULE,
	.dev_groups = hwmon_dev_attr_groups,
	.dev_release = hwmon_dev_release,
};

总体而言,初始化之后,在openbmc下显示的效果为在目录/sys/class下创建了hwmon目录。

2.结构体.dev_groups = hwmon_dev_attr_groups

定义如下:

static const struct attribute_group *hwmon_dev_attr_groups[] = {
	&hwmon_dev_attr_group,
	NULL
};

其中:

static const struct attribute_group hwmon_dev_attr_group = {
	.attrs		= hwmon_dev_attrs,
	.is_visible	= hwmon_dev_name_is_visible,
};

另外:

static struct attribute *hwmon_dev_attrs[] = {
	&dev_attr_name.attr,
	NULL
};

看到全局定义一个结构体:

static DEVICE_ATTR_RO(name);

找到文件:linux/include/linux/device.h,定义如下:

#define DEVICE_ATTR_RO(_name) \
	struct device_attribute dev_attr_##_name = __ATTR_RO(_name)

找到文件:linux/include/linux/sysfs.h,定义如下:

#define __ATTR_RO(_name) {						\
	.attr	= { .name = __stringify(_name), .mode = 0444 },		\
	.show	= _name##_show,						\
}

因此,文件中定义了内容:

struct device_attribute dev_attr_name = 
{
	.attr	= { .name = __stringify(_name), .mode = 0444 },
	.show   = name_show,
}

在看一个函数name_show(struct device *dev, struct device_attribute *attr, char *buf)的定义:

static ssize_t
name_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "%s\n", to_hwmon_device(dev)->name);
}

所以,整个框架基本成型,hwmon利用sysfs接口对外提供数据接口能力。

那它当前支持哪些硬件的监控? 可以看文件linux/include/linux/hwmon.h中的如下代码:

enum hwmon_sensor_types {
	hwmon_chip,
	hwmon_temp,
	hwmon_in,
	hwmon_curr,
	hwmon_power,
	hwmon_energy,
	hwmon_humidity,
	hwmon_fan,
	hwmon_pwm,
	hwmon_intrusion,
	hwmon_max,
};

即,包含了:hwmon_temphwmon_inhwmon_currhwmon_powerhwmon_energyhwmon_humidityhwmon_fan等硬件。

3.硬件设备支持

可以看到,有3种函数调用关系:

  • 第一种,描述的是过时的调用关系,使用函数hwmon_device_register():
struct device *hwmon_device_register(struct device *dev)
---> 	dev_warn(dev,
		 "hwmon_device_register() is deprecated. Please convert the driver to use hwmon_device_register_with_info().\n");
---> __hwmon_device_register(dev, NULL, NULL, NULL, NULL);
  • 第二种, 使用函数hwmon_device_register_with_info():
struct device *
devm_hwmon_device_register_with_info(struct device *dev, const char *name,
				     void *drvdata,
				     const struct hwmon_chip_info *chip,
				     const struct attribute_group **groups)
---> hwdev = hwmon_device_register_with_info(dev, name, drvdata, chip,
						groups);
	---> if (chip && (!chip->ops || !chip->ops->is_visible || !chip->info))
		return ERR_PTR(-EINVAL);
	---> __hwmon_device_register(dev, name, drvdata, chip, extra_groups);
  • 第三种,使用函数devm_hwmon_device_register_with_groups():
struct device *
devm_hwmon_device_register_with_groups(struct device *dev, const char *name,
				       void *drvdata,
				       const struct attribute_group **groups)
---> hwdev = hwmon_device_register_with_groups(dev, name, drvdata, groups);
	---> __hwmon_device_register(dev, name, drvdata, NULL, groups);

4.举例

拿一个简单的代码例子:linux/drivers/hwmon/ad7314.c:

static int ad7314_probe(struct spi_device *spi_dev)
---> hwmon_dev = devm_hwmon_device_register_with_groups(&spi_dev->dev,
							   spi_dev->modalias,
							   chip, ad7314_groups);

另外,ad7314_groups定义如下:

ATTRIBUTE_GROUPS(ad7314);

#define ATTRIBUTE_GROUPS(_name)					\
static const struct attribute_group _name##_group = {		\
	.attrs = _name##_attrs,					\
};	

static struct attribute *ad7314_attrs[] = {
	&sensor_dev_attr_temp1_input.dev_attr.attr,
	NULL,
};

#define SENSOR_DEVICE_ATTR_RO(_name, _func, _index)		\
	SENSOR_DEVICE_ATTR(_name, 0444, _func##_show, NULL, _index)

static SENSOR_DEVICE_ATTR_RO(temp1_input, ad7314_temperature, 0);

#define SENSOR_DEVICE_ATTR(_name, _mode, _show, _store, _index)	\
struct sensor_device_attribute sensor_dev_attr_##_name		\
	= SENSOR_ATTR(_name, _mode, _show, _store, _index)

static ssize_t ad7314_temperature_show(struct device *dev,
				       struct device_attribute *attr,
				       char *buf)


参考文件:

  • linux/include/linux/hwmon-sysfs.h
  • linux/include/linux/sysfs.h
  • linux/include/linux/device.h
  • linux/include/linux/hwmon.h

3.分析dbus-sensors

3.1 dbus-sensors的目标

  • dbus-sensors的实现仓库为: https://github.com/openbmc/dbus-sensors
dbus-sensors is a collection of sensor applications that provide the 
xyz.openbmc_project.Sensor collection of interfaces. They read sensor 
values from hwmon, d-bus, or direct driver access to provide readings. 
Some advance non-sensor features such as fan presence, pwm control, 
and automatic cpu detection (x86) are also supported.

因此,其目的即实现了实际的硬件数据的读取,并能将数据暴露给dbus,供其他应用程序使用。

3.2 目录结构

目录结构如下:

# tree 
.
└── dbus-sensors-master
    ├── include
    │   └── linux
    │       └── peci-ioctl.h
    ├── LICENSE
    ├── meson.build
    ├── meson.options
    ├── OWNERS
    ├── README.md
    ├── service_files
    │   ├── meson.build
    │   ├── xyz.openbmc_project.adcsensor.service
    │   ├── xyz.openbmc_project.exitairsensor.service
    │   ├── xyz.openbmc_project.externalsensor.service
    │   ├── xyz.openbmc_project.fansensor.service
    │   ├── xyz.openbmc_project.hwmontempsensor.service
    │   ├── xyz.openbmc_project.intelcpusensor.service
    │   ├── xyz.openbmc_project.intrusionsensor.service
    │   ├── xyz.openbmc_project.ipmbsensor.service
    │   ├── xyz.openbmc_project.mctpreactor.service
    │   ├── xyz.openbmc_project.mcutempsensor.service
    │   ├── xyz.openbmc_project.nvmesensor.service
    │   └── xyz.openbmc_project.psusensor.service
    ├── src
    │   ├── adc
    │   │   ├── ADCSensor.cpp
    │   │   ├── ADCSensor.hpp
    │   │   ├── ADCSensorMain.cpp
    │   │   └── meson.build
    │   ├── dbus-sensor_config.h.in
    │   ├── DeviceMgmt.cpp
    │   ├── DeviceMgmt.hpp
    │   ├── exit-air
    │   │   ├── ExitAirTempSensor.cpp
    │   │   ├── ExitAirTempSensor.hpp
    │   │   └── meson.build
    │   ├── external
    │   │   ├── ExternalSensor.cpp
    │   │   ├── ExternalSensor.hpp
    │   │   ├── ExternalSensorMain.cpp
    │   │   └── meson.build
    │   ├── fan
    │   │   ├── FanMain.cpp
    │   │   ├── meson.build
    │   │   ├── PresenceGpio.cpp
    │   │   ├── PresenceGpio.hpp
    │   │   ├── TachSensor.cpp
    │   │   └── TachSensor.hpp
    │   ├── FileHandle.cpp
    │   ├── FileHandle.hpp
    │   ├── hwmon-temp
    │   │   ├── HwmonTempMain.cpp
    │   │   ├── HwmonTempSensor.cpp
    │   │   ├── HwmonTempSensor.hpp
    │   │   └── meson.build
    │   ├── intel-cpu
    │   │   ├── IntelCPUSensor.cpp
    │   │   ├── IntelCPUSensor.hpp
    │   │   ├── IntelCPUSensorMain.cpp
    │   │   └── meson.build
    │   ├── intrusion
    │   │   ├── ChassisIntrusionSensor.cpp
    │   │   ├── ChassisIntrusionSensor.hpp
    │   │   ├── IntrusionSensorMain.cpp
    │   │   └── meson.build
    │   ├── ipmb
    │   │   ├── IpmbSDRSensor.cpp
    │   │   ├── IpmbSDRSensor.hpp
    │   │   ├── IpmbSensor.cpp
    │   │   ├── IpmbSensor.hpp
    │   │   ├── IpmbSensorMain.cpp
    │   │   └── meson.build
    │   ├── mctp
    │   │   ├── MCTPDeviceRepository.hpp
    │   │   ├── MCTPEndpoint.cpp
    │   │   ├── MCTPEndpoint.hpp
    │   │   ├── MCTPReactor.cpp
    │   │   ├── MCTPReactor.hpp
    │   │   ├── MCTPReactorMain.cpp
    │   │   └── meson.build
    │   ├── mcu
    │   │   ├── MCUTempSensor.cpp
    │   │   ├── MCUTempSensor.hpp
    │   │   └── meson.build
    │   ├── meson.build
    │   ├── nvme
    │   │   ├── meson.build
    │   │   ├── NVMeBasicContext.cpp
    │   │   ├── NVMeBasicContext.hpp
    │   │   ├── NVMeContext.hpp
    │   │   ├── NVMeSensor.cpp
    │   │   ├── NVMeSensor.hpp
    │   │   └── NVMeSensorMain.cpp
    │   ├── psu
    │   │   ├── meson.build
    │   │   ├── PSUEvent.cpp
    │   │   ├── PSUEvent.hpp
    │   │   ├── PSUSensor.cpp
    │   │   ├── PSUSensor.hpp
    │   │   └── PSUSensorMain.cpp
    │   ├── PwmSensor.cpp
    │   ├── PwmSensor.hpp
    │   ├── sensor.hpp
    │   ├── SensorPaths.cpp
    │   ├── SensorPaths.hpp
    │   ├── tests
    │   │   ├── meson.build
    │   │   ├── test_IpmbSensor.cpp
    │   │   ├── test_MCTPEndpoint.cpp
    │   │   ├── test_MCTPReactor.cpp
    │   │   └── test_Utils.cpp
    │   ├── Thresholds.cpp
    │   ├── Thresholds.hpp
    │   ├── Utils.cpp
    │   ├── Utils.hpp
    │   └── VariantVisitors.hpp
    └── subprojects
        ├── boost.wrap
        ├── googletest.wrap
        ├── libgpiod.wrap
        ├── libpeci.wrap
        ├── liburing.wrap
        ├── nlohmann_json.wrap
        ├── packagefiles
        │   └── boost
        │       └── meson.build
        ├── phosphor-logging.wrap
        └── sdbusplus.wrap

21 directories, 107 files

从目录service_files中,可以看到openbmc将每一种类型的sensor做成了一个服务。

4.分析entity-manager

4.1 目录结构

目录结构如下:

# tree
.
└── entity-manager-master
    ├── blacklist.json
    ├── CONFIG_FORMAT.md
    ├── configurations
    │   ├── 1ux16_riser.json
    │   ├── 2ux8_riser.json
    │   ├── 3ypower_vast2112_psu.json
    │   ├── 8x25_hsbp.json
    │   ├── a2ul16riser.json
    │   ├── a2ux8x4riser.json
    │   ├── acbell_rica_psu.json
    │   ├── acbel_r1ca2122a_psu.json
    │   ├── ahw1um2riser.json
    │   ├── aspower_u1a-d10550_psu.json
    │   ├── aspower_u1a-d10800_psu.json
    │   ├── aspower_u1a-d11200_psu.json
    │   ├── aspower_u1a-d11600_psu.json
    │   ├── aspower_u1d-d10800_psu.json
    │   ├── asrock_c3_medium_x86.json
    │   ├── asrock_e3c246d4i.json
    │   ├── asrock_e3c256d4i.json
    │   ├── asrock_m3_small_x86.json
    │   ├── asrock_n3_xlarge_x86.json
    │   ├── asrock_romed8hm3.json
    │   ├── asrock_spc621d8hm3.json
    │   ├── axx1p100hssi_aic.json
    │   ├── axx2prthdhd.json
    │   ├── bellavista.json
    │   ├── blueridge_1s4u_chassis.json
    │   ├── blueridge_2u_chassis.json
    │   ├── blueridge_4u_chassis.json
    │   ├── blyth.json
    │   ├── bnp_baseboard.json
    │   ├── bonnell.json
    │   ├── brcm_100g_1p_ocp_mezz.json
    │   ├── brcm_200g_1p_ocp_mezz.json
    │   ├── compuware_cdr_9011_3m1_psu.json
    │   ├── cx7_ocp.json
    │   ├── delta_awf2dc3200w_psu.json
    │   ├── delta_dps-1600ab_psu.json
    │   ├── delta_dps-2000ab_psu.json
    │   ├── delta_dps-750xb_psu.json
    │   ├── everest.json
    │   ├── f1u12x25_hsbp.json
    │   ├── f1u4x25_hsbp.json
    │   ├── f2u12x35_hsbp.json
    │   ├── f2u8x25_hsbp.json
    │   ├── flextronics_s-1100adu00-201_psu.json
    │   ├── fp5280g3_chassis.json
    │   ├── fp5280g3_fanboard.json
    │   ├── fuji.json
    │   ├── genesis3_baseboard.json
    │   ├── genesis3_chassis.json
    │   ├── genesis3_psu.json
    │   ├── gospower_g1136-1300wna_psu.json
    │   ├── ibm_tacoma_rack_controller.json
    │   ├── ingraham.json
    │   ├── intel_front_panel.json
    │   ├── kudo_bmc.json
    │   ├── kudo_motherboard.json
    │   ├── meta
    │   │   ├── bletchley_baseboard.json
    │   │   ├── bletchley_chassis.json
    │   │   ├── bletchley_frontpanel.json
    │   │   ├── bmc_storage_module.json
    │   │   ├── catalina_fio.json
    │   │   ├── catalina_hdd.json
    │   │   ├── catalina_hdd_nvme.json
    │   │   ├── catalina_osfp.json
    │   │   ├── catalina_pdb.json
    │   │   ├── catalina_scm.json
    │   │   ├── fbtp.json
    │   │   ├── fbyv2.json
    │   │   ├── fbyv35.json
    │   │   ├── fbyv35_nic_mellanox.json
    │   │   ├── greatlakes.json
    │   │   ├── greatlakes_nic_mellanox.json
    │   │   ├── harma_bsm.json
    │   │   ├── harma_fanboard.json
    │   │   ├── harma_mb.json
    │   │   ├── harma_mb_vr_infineon.json
    │   │   ├── harma_scm.json
    │   │   ├── minerva_cmm_bsm.json
    │   │   ├── minerva_cmm_hsc_infineon.json
    │   │   ├── minerva_cmm.json
    │   │   ├── minerva_cmm_scm.json
    │   │   ├── minerva_fanboard.json
    │   │   ├── minerva_pdb_hsc_xdp.json
    │   │   ├── minerva_pdb.json
    │   │   ├── minerva_pttv.json
    │   │   ├── minerva_sitv.json
    │   │   ├── terminus_2x100g_nic_tsff.json
    │   │   ├── twinlake.json
    │   │   ├── ventura_fanboard.json
    │   │   ├── ventura_ioboard.json
    │   │   ├── ventura_ledboard.json
    │   │   ├── ventura_rmc.json
    │   │   ├── ventura_scm.json
    │   │   ├── yosemite4_chassis.json
    │   │   ├── yosemite4_cpu.json
    │   │   ├── yosemite4_fanboard_fsc_max_adc_ti_led_nxp_efuse_max.json
    │   │   ├── yosemite4_fanboard_fsc_max_adc_ti_led_nxp_efuse_mps.json
    │   │   ├── yosemite4_fanboard_fsc_nct_adc_max_led_ons_efuse_max.json
    │   │   ├── yosemite4_fanboard_fsc_nct_adc_max_led_ons_efuse_mps.json
    │   │   ├── yosemite4_floatingfalls.json
    │   │   ├── yosemite4.json
    │   │   ├── yosemite4_medusaboard_adc_rns_12vhsc_adi_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_12vhsc_mps_48vhsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_rns_12vhsc_mps_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_hsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_12vhsc_adi_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_12vhsc_mps_48vhsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_12vhsc_mps_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_hsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_ti_12vhsc_adi_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_ti_12vhsc_mps_48vhsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_ti_12vhsc_mps_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_ti_hsc_adi.json
    │   │   ├── yosemite4n.json
    │   │   ├── yosemite4_sentineldome_chassis.json
    │   │   ├── yosemite4_sentineldome_t1.json
    │   │   ├── yosemite4_sentineldome_t1_retimer.json
    │   │   ├── yosemite4_sentineldome_t2.json
    │   │   ├── yosemite4_sentineldome_t2_retimer.json
    │   │   ├── yosemite4_spiderboard_adc_max_pwr_ti.json
    │   │   ├── yosemite4_spiderboard_adc_ti_pwr_ti.json
    │   │   └── yosemite4_wailuafalls.json
    │   ├── micron_7450.json
    │   ├── mori_bmc.json
    │   ├── mori_motherboard.json
    │   ├── mtjade.json
    │   ├── mtjefferson_bmc.json
    │   ├── mtjefferson_bp.json
    │   ├── mtjefferson_mb.json
    │   ├── mtmitchell_bmc.json
    │   ├── mtmitchell_bp.json
    │   ├── mtmitchell_mb.json
    │   ├── mtmitchell_riser.json
    │   ├── mudflap.json
    │   ├── nf5280m7_baseboard.json
    │   ├── nisqually.json
    │   ├── nuvoton_npcm8xx_evb.json
    │   ├── nvidia_gb200_io_board.json
    │   ├── nvidia_gb200.json
    │   ├── nvidia_hmc.json
    │   ├── nvme_intel_p_series.json
    │   ├── nvme_p4500_p5500.json
    │   ├── pcie_ssd_retimer.json
    │   ├── pennybacker.json
    │   ├── pssf132202a.json
    │   ├── pssf162205a.json
    │   ├── pssf212201a.json
    │   ├── pssf222201a.json
    │   ├── r1000_chassis.json
    │   ├── r2000_chassis.json
    │   ├── rainier_1s4u_chassis.json
    │   ├── rainier_2u_chassis.json
    │   ├── rainier_4u_chassis.json
    │   ├── sas_module.json
    │   ├── sbp1_baseboard.json
    │   ├── sbp1_chassis.json
    │   ├── sbp1_hbm.json
    │   ├── sbp1_nvme.json
    │   ├── sbp1_psu.json
    │   ├── sbp1_rssd.json
    │   ├── solum_pssf162202_psu.json
    │   ├── storm_king.json
    │   ├── stp_baseboard.json
    │   ├── stp_p4000_chassis.json
    │   ├── supermicro-pws-920p-sq_psu.json
    │   ├── system1_baseboard.json
    │   ├── system1_chassis.json
    │   ├── tola.json
    │   ├── tyan_s7106_baseboard.json
    │   ├── tyan_s8036_baseboard.json
    │   ├── vegman_n110_baseboard.json
    │   ├── vegman_rx20_baseboard.json
    │   ├── vegman_sx20_baseboard.json
    │   ├── VENDORS.md
    │   └── wft_baseboard.json
    ├── docs
    │   ├── associations.md
    │   ├── blacklist_configuration.md
    │   ├── entity_manager_dbus_api.md
    │   └── my_first_sensors.md
    ├── Doxyfile
    ├── format-code
    ├── LICENCE
    ├── meson.build
    ├── meson_options.txt
    ├── OWNERS
    ├── README.md
    ├── schemas
    │   ├── global.json
    │   ├── ibm.json
    │   ├── intel.json
    │   ├── legacy.json
    │   ├── mctp.json
    │   ├── openbmc-dbus.json
    │   ├── pid.json
    │   ├── pid_zone.json
    │   ├── README.md
    │   ├── satellite_controller.json
    │   ├── stepwise.json
    │   └── virtual_sensor.json
    ├── scripts
    │   ├── autojson.py
    │   ├── run-ci.sh
    │   └── validate_configs.py
    ├── service_files
    │   ├── dbus
    │   │   └── xyz.openbmc_project.EntityManager.service
    │   ├── devicetree-vpd-parser.service
    │   ├── meson.build
    │   ├── xyz.openbmc_project.EntityManager.service
    │   └── xyz.openbmc_project.FruDevice.service
    ├── src
    │   ├── devices.hpp
    │   ├── devicetree_vpd_parser.cpp
    │   ├── entity_manager.cpp
    │   ├── entity_manager.hpp
    │   ├── expression.cpp
    │   ├── expression.hpp
    │   ├── fru_device.cpp
    │   ├── fru_reader.cpp
    │   ├── fru_reader.hpp
    │   ├── fru_utils.cpp
    │   ├── fru_utils.hpp
    │   ├── machine_context.cpp
    │   ├── machine_context.hpp
    │   ├── meson.build
    │   ├── overlay.cpp
    │   ├── overlay.hpp
    │   ├── perform_probe.cpp
    │   ├── perform_scan.cpp
    │   ├── topology.cpp
    │   ├── topology.hpp
    │   ├── utils.cpp
    │   ├── utils.hpp
    │   └── variant_visitors.hpp
    ├── subprojects
    │   ├── boost.wrap
    │   ├── gtest.wrap
    │   ├── nlohmann_json.wrap
    │   ├── phosphor-dbus-interfaces.wrap
    │   ├── phosphor-logging.wrap
    │   ├── sdbusplus.wrap
    │   └── valijson.wrap
    └── test
        ├── expected-schema-errors.txt
        ├── test_entity-manager.cpp
        ├── test_fru-utils.cpp
        └── test_topology.cpp

11 directories, 242 files

其基本功能包含:

  • 1.A detection daemon
  • 2.An entity manager configuration file
  • 3.A reactor

BMC系统下,对应目录:
在这里插入图片描述

5.软件包的联动 TBD…

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

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

相关文章

Java --- 多线程

目录 前言: 一.线程的创建: 1.通过继承 Thread 类来创建线程: 2.通过Runnable接口创建线程: 3.通过Java8引入的lambda语法: 线程的优先级: 二.线程的生命周期: 三. 中断线程&#xff1a…

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL?前置要求安装过程 步骤一:安装 acme.sh步骤二:配置 ZeroSSL 证书申请 方法一:手动 DNS 验证(推荐新手使用)方法二&#xf…

Flutter组件————Scaffold

Scaffold Scaffold 是一个基础的可视化界面结构组件,它实现了基本的Material Design布局结构。使用 Scaffold 可以快速地搭建起包含应用栏(AppBar)、内容区域(body)、抽屉菜单(Drawer)、底部导…

YOLOv8目标检测(七)_AB压力测试

YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训…

SpringBoot的创建方式

SpringBoot创建的五种方式 1.通过Springboot官网链接下载 注意SpringBoot项目的封装方式默认为Jar 需要查看一下,自己的Maven版本是否正确 创建成功 2.通过 aliyun官网链接下载 修改服务路径为阿里云链接 创建成功 3.通过Springboot官网下载 点击,拉到最…

批处理理解

初识批处理 如何批处理: 命名:.bat 方法:创建一个记事本文件,然后将其扩展改为.bat 批处理作用:自上而下成批处理每一条DOS命令,直到执行到最后一条。运行环境:当然是我们cmd了 回归我学过的…

概率论得学习和整理29: 用EXCEL 描述二项分布

目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率,二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…

全志H618 Android12修改doucmentsui功能菜单项

背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 在进入File文件管理器后,查看...功能菜单时,有不需要的功能菜单,需要隐藏,如:新建窗口、不显示的文件夹、故代码分析以及客制…

Elasticsearch问题总结

Fielddata access on the_id field is disallowed, you can re-enable it by updating the dynamic cluster setting: indices.id_field_data.enabledElasticsearch默认禁用_id字段进行排序,这是因为_id字段通常不需要进行聚合或排序操作,启用字段数据可…

基于WCF(C#)+SQL SERVER设计与实现的在线评测系统

基于WCF和SQL SERVER的在线评测系统设计与实现 摘要 目前,在线评测系统大多采用Linux系统作为运行平台,由于Linux系统人机交互能力差,使得系统部署要求高和维护难度大。本文针对以上问题进行分析,采用Windows操作系统作为运行平…

【C++图论】1993. 树上的操作|1861

本文涉及知识点 C图论 LeetCode 1993. 树上的操作 给你一棵 n 个节点的树,编号从 0 到 n - 1 ,以父节点数组 parent 的形式给出,其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点,所以 parent[0] -1 &#xff0c…

如何使用Python WebDriver爬取ChatGPT内容(完整教程)

大背景 虽然我们能用网页版chatGPT来聊天、写文章,但是我们采集大量的内容,就得不断地手动输入提问来获取答案,并且将结果复制到数据库来保存。如果整个过程能使用程序来做自然要节省很多的人力,精力和时间。 Python webdirver …

渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)

本文是高级前端加解密与验签实战的第6篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过RSA加密来爆破登录。 分析 这里的代码跟上文的类似,但是加密的公钥是通过请求服务端获取的 http://127.0.0.1:8787/crypto/js/…

Pytorch | 从零构建MobileNet对CIFAR10进行分类

Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…

Java进程占用的内存有哪些部分?

大家好,我是锋哥。今天分享关于【Java进程占用的内存有哪些部分?】面试题。希望对大家有帮助; Java进程占用的内存有哪些部分? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java进程在运行时,会将内存划分为多个区域&#xf…

秒优科技-供应链管理系统 login/doAction SQL注入漏洞复现

0x01 产品简介 秒优科技提供的供应链管理系统,即秒优SCM服装供应链管理系统,是一款专为服装电商企业设计的全方位解决方案。是集款式研发、订单管理、物料管理、生产管理、工艺管理、收发货管理、账单管理、报表管理于一体的服装电商供应链管理解决方案。它涵盖了从企划到开…

音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现

一、引言 通过FFmpeg命令可以获取到TS文件/TS流的视频压缩编码格式、色彩格式(像素格式)、分辨率、帧率信息: ./ffmpeg -i XXX.ts 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 FFmpeg获取TS文…

VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用

VSCode:Markdown插件安装使用 1.安装Marktext2.使用Marktext 本文,将在Visual Studio Code中,安装和使用Markdown插件,以Marktext插件为例。 1.安装Marktext 打开VSCode,侧边栏中找到扩展模块(或CtrlShiftX快捷键)&am…

线性分类器(KNN,SVM损失,交叉熵损失,softmax)

KNN 工作机制 k-近邻算法的工作机制可以分为两个主要阶段:训练阶段和预测阶段。 训练阶段 在训练阶段,k-近邻算法并不进行显式的模型训练,而是简单地存储训练数据集。每个样本由特征向量和对应的标签组成。此阶段的主要任务是准备好数据&…

知乎 PB 级别 TiDB 数据库集群管控实践

以下文章来源于知乎技术专栏 ,作者代晓磊 导读 在现代企业中,数据库的运维管理至关重要,特别是面对分布式数据库的复杂性和大规模集群的挑战。作为一款兼容 MySQL 协议的分布式关系型数据库,TiDB 在高可用、高扩展性和强一致性方…