efi的sys文件系统接口

在driver/firmware/efi/efi.c 中通过subsys_initcall(efisubsys_init);来初始化efisubsys
static int __init efisubsys_init(void)
{
    int error;

    if (!efi_enabled(EFI_BOOT))
        return 0;

    /* We register the efi directory at /sys/firmware/efi */
    efi_kobj = kobject_create_and_add("efi", firmware_kobj);
    if (!efi_kobj) {
        pr_err("efi: Firmware registration failed.\n");
        return -ENOMEM;
    }

    error = generic_ops_register();
    if (error)
        goto err_put;

    if (efi_enabled(EFI_RUNTIME_SERVICES))
        efivar_ssdt_load();

    error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
    if (error) {
        pr_err("efi: Sysfs attribute export failed with error %d.\n",
               error);
        goto err_unregister;
    }
    error = efi_runtime_map_init(efi_kobj);
    if (error)
        goto err_remove_group;

    /* and the standard mountpoint for efivarfs */
    error = sysfs_create_mount_point(efi_kobj, "efivars");
    if (error) {
        pr_err("efivars: Subsystem registration failed.\n");
        goto err_remove_group;
    }

}
在efisubsys_init 中会通过kobject_create_and_add在/sys/firmware/下建立efi的目录,然后会通过sysfs_create_group来efi_subsys_attr_group group
static struct attribute_group efi_subsys_attr_group = {
    .attrs = efi_subsys_attrs,
    .is_visible = efi_attr_is_visible,
};
继续看efi_subsys_attrs
static struct attribute *efi_subsys_attrs[] = {
    &efi_attr_systab.attr,
    &efi_attr_fw_vendor.attr,
    &efi_attr_runtime.attr,
    &efi_attr_config_table.attr,
    &efi_attr_fw_platform_size.attr,
    NULL,
};
在efisubsys_init 中通过sysfs_create_mount_point 来创建efivars的mountpoint。
而efi_runtime_map_init 则为每一段efi.memmap 创建sys接口,而所有的接口都是放在map_entries 这个list中
int __init efi_runtime_map_init(struct kobject *efi_kobj)
{
    int i, j, ret = 0;
    struct efi_runtime_map_entry *entry;
    efi_memory_desc_t *md;

    if (!efi_enabled(EFI_MEMMAP))
        return 0;

    map_entries = kzalloc(efi.memmap.nr_map * sizeof(entry), GFP_KERNEL);
    if (!map_entries) {
        ret = -ENOMEM;
        goto out;
    }

    i = 0;
    for_each_efi_memory_desc(md) {
        entry = add_sysfs_runtime_map_entry(efi_kobj, i, md);
        if (IS_ERR(entry)) {
            ret = PTR_ERR(entry);
            goto out_add_entry;
        }
        *(map_entries + i++) = entry;
    }

    return 0;
out_add_entry:
    for (j = i - 1; j >= 0; j--) {
        entry = *(map_entries + j);
        kobject_put(&entry->kobj);
    }
out:
    return ret;
}

因此实际我们可以看到如下:
[root@CentOS efi]# pwd
/sys/firmware/efi
[root@CentOS efi]# ls
efivars  fw_platform_size  systab  vars


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值