国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

dmi

2019-11-09 17:17:18
字體:
供稿:網(wǎng)友
在arch/arm64/kernel/efi.c 中會(huì)對(duì)dmi初始化,dmi的全程是Desktop Management Interface.屬于smbios的一部分.static int __init arm64_dmi_init(void){    /*     * On arm64, DMI depends on UEFI, and dmi_scan_machine() needs to     * be called early because dmi_id_init(), which is an arch_initcall     * itself, depends on dmi_scan_machine() having been called already.     */    dmi_scan_machine();    if (dmi_available)        dmi_set_dump_stack_arch_desc();    return 0;}core_initcall(arm64_dmi_init);可見是通過core_initcall(arm64_dmi_init);在kernel 初始化階段自動(dòng)運(yùn)行的.void __init dmi_scan_machine(void){    char __iomem *p, *q;    char buf[32];    if (efi_enabled(EFI_CONFIG_TABLES)) {            if (efi.smbios3 != EFI_INVALID_TABLE_ADDR) {        }        if (efi.smbios == EFI_INVALID_TABLE_ADDR)            goto error;        if (!dmi_PResent(buf)) {            dmi_available = 1;            goto out;        }    } else if (IS_ENABLED(CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK)) {    } error:    pr_info("DMI not present or invalid./n"); out:    dmi_initialized = 1;}在dmi_scan_machine 中首先判斷 efi.smbios3 != EFI_INVALID_TABLE_ADDR 或者 efi.smbios == EFI_INVALID_TABLE_ADDR,可見dmi是smbios的一部分,且smbios有兩個(gè)標(biāo)準(zhǔn)smbios 和 smbios3如果條件成立的話就通過memcpy_fromio(buf, p, 32);將32 byte copy到buf中。在dmi_scan_machine 中如果條件不成立,且定義了CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK,就會(huì)在0xF0000, 0x10000 這個(gè)范圍內(nèi)找dmi的信息。我們之關(guān)注efi.smbios3 != EFI_INVALID_TABLE_ADDR 或者 efi.smbios == EFI_INVALID_TABLE_ADDR 成立的情況。然后調(diào)用dmi_presentstatic int __init dmi_present(const u8 *buf){    u32 smbios_ver;    if (memcmp(buf, "_SM_", 4) == 0 &&        buf[5] < 32 && dmi_checksum(buf, buf[5])) {        smbios_ver = get_unaligned_be16(buf + 6);        smbios_entry_point_size = buf[5];        memcpy(smbios_entry_point, buf, smbios_entry_point_size);        /* Some BIOS report weird SMBIOS version, fix that up */        switch (smbios_ver) {        case 0x021F:        case 0x0221:            pr_debug("SMBIOS version fixup (2.%d->2.%d)/n",                 smbios_ver & 0xFF, 3);            smbios_ver = 0x0203;            break;        case 0x0233:            pr_debug("SMBIOS version fixup (2.%d->2.%d)/n", 51, 6);            smbios_ver = 0x0206;            break;        }    } else {        smbios_ver = 0;    }    buf += 16;    if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf, 15)) {        if (smbios_ver)            dmi_ver = smbios_ver;        else            dmi_ver = (buf[14] & 0xF0) << 4 | (buf[14] & 0x0F);        dmi_ver <<= 8;        dmi_num = get_unaligned_le16(buf + 12);        dmi_len = get_unaligned_le16(buf + 6);        dmi_base = get_unaligned_le32(buf + 8);        if (dmi_walk_early(dmi_decode) == 0) {            if (smbios_ver) {                pr_info("SMBIOS %d.%d present./n",                    dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);            } else {                smbios_entry_point_size = 15;                memcpy(smbios_entry_point, buf,                       smbios_entry_point_size);                pr_info("Legacy DMI %d.%d present./n",                    dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);            }            dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));            printk(KERN_DEBUG "DMI: %s/n", dmi_ids_string);            return 0;        }    }    return 1;}在dmi_present 中首先得到smbios_ver ,如果smbios_ver 不是NULL,則dmi_ver就等于smbios_ver。否則dmi_ver 重新計(jì)算.        if (smbios_ver)            dmi_ver = smbios_ver;        else            dmi_ver = (buf[14] & 0xF0) << 4 | (buf[14] & 0x0F);最后后調(diào)用        if (dmi_walk_early(dmi_decode) == 0) {來將dmi中的信息存到kernel中方面其他程序查詢.static void __init dmi_decode(const struct dmi_header *dm, void *dummy){    switch (dm->type) {    case 0:        /* BIOS Information */        dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);        dmi_save_ident(dm, DMI_BIOS_VERSION, 5);        dmi_save_ident(dm, DMI_BIOS_DATE, 8);        break;    case 1:        /* System Information */        dmi_save_ident(dm, DMI_SYS_VENDOR, 4);        dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);        dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);        dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);        dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);        break;    case 2:        /* Base Board Information */        dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);        dmi_save_ident(dm, DMI_BOARD_NAME, 5);        dmi_save_ident(dm, DMI_BOARD_VERSION, 6);        dmi_save_ident(dm, DMI_BOARD_SERIAL, 7);        dmi_save_ident(dm, DMI_BOARD_ASSET_TAG, 8);        break;    case 3:        /* Chassis Information */        dmi_save_ident(dm, DMI_CHASSIS_VENDOR, 4);        dmi_save_type(dm, DMI_CHASSIS_TYPE, 5);        dmi_save_ident(dm, DMI_CHASSIS_VERSION, 6);        dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7);        dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8);        break;    case 9:        /* System Slots */        dmi_save_system_slot(dm);        break;    case 10:    /* Onboard Devices Information */        dmi_save_devices(dm);        break;    case 11:    /* OEM Strings */        dmi_save_oem_strings_devices(dm);        break;    case 38:    /* ipMI Device Information */        dmi_save_ipmi_device(dm);        break;    case 41:    /* Onboard Devices Extended Information */        dmi_save_extended_devices(dm);    }}可見dmi的信息大概分成0/1/2/3/9/10/11/38/41.根據(jù)不同的type將信息存到不同的數(shù)組中。我們以System Information為例dmi_save_ident(dm, DMI_SYS_VENDOR, 4);static void __init dmi_save_ident(const struct dmi_header *dm, int slot,        int string){    const char *d = (const char *) dm;    const char *p;    if (dmi_ident[slot])        return;    p = dmi_string(dm, d[string]);    if (p == NULL)        return;    dmi_ident[slot] = p;}可見是存在dmi_ident這個(gè)數(shù)組中。這樣我們就可以通過dmi_get_system_info 函數(shù)從dmi_ident 數(shù)組中拿到System Informationconst char *dmi_get_system_info(int field){    return dmi_ident[field];}EXPORT_SYMBOL(dmi_get_system_info);
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安义县| 如东县| 瓦房店市| 广宗县| 阿克苏市| 垣曲县| 紫金县| 库尔勒市| 湖州市| 福建省| 青海省| 吴忠市| 保山市| 禄劝| 乌审旗| 旌德县| 洞口县| 沂水县| 吴忠市| 会泽县| 铜梁县| 永康市| 隆林| 钟山县| 巴彦淖尔市| 富锦市| 宜阳县| 开江县| 喜德县| 锡林郭勒盟| 怀柔区| 托里县| 虹口区| 邵武市| 岳池县| 无为县| 庄河市| 忻州市| 阳泉市| 崇明县| 溆浦县|