【发布时间】:2011-09-09 16:32:20
【问题描述】:
假设我想在 Linux 中更改我计算机的 BIOS 中的设置(如果重要的话,假设是 Ubuntu 11。)存在哪些类型的 API 可以让您查询和操作 BIOS 设置?
此外,什么是进行此类开发的好资源?
【问题讨论】:
标签: c linux operating-system bios
假设我想在 Linux 中更改我计算机的 BIOS 中的设置(如果重要的话,假设是 Ubuntu 11。)存在哪些类型的 API 可以让您查询和操作 BIOS 设置?
此外,什么是进行此类开发的好资源?
【问题讨论】:
标签: c linux operating-system bios
CMOS 内存存在于正常地址空间之外,不能 包含直接可执行的代码。可通过 IN 和 OUT 访问 端口号 70h (112d) 和 71h (113d) 的命令。要读取 CMOS 字节, 使用要读取的字节的地址执行到端口 70h 的 OUT,并且 然后来自端口 71h 的 IN 将检索请求的信息。
您可以使用 inb 和 outb 宏从这些端口读取和写入,以获取存储在 CMOS 中的整个 BIOS 设置。有关存储的设置内存格式,请查看:http://bochs.sourceforge.net/techspec/CMOS-reference.txt
这些映射实际上是依赖于供应商的,但其中大部分应该是通用的。
虽然这不是一个 API,但是通过它你可以直接访问 CMOS 内存并制作你自己的 API。对于快速程序,我建议获取 API。在这种情况下查看@Nemo 的答案。
【讨论】:
这一切都取决于“BIOS 设置”的含义。
在传统的PC/AT、PC机固件中,“BIOS设置”保存在与实时时钟芯片相关的非易失性RAM中。关于 NVRAM 的各个字节所代表的含义几乎没有没有标准化(尽管有一些常见的约定),它们的含义因固件供应商以及固件版本而异.用于操作 RTC NVRAM 的工具包括 Linux 和 FreeBSD /dev/nvram 设备。
但这并不是现代 PC 上唯一的非易失性 RAM。 “BIOS ROM”实际上也是非易失性 RAM。 (不能只在正常操作中写入。必须执行魔法咒语才能启用写入周期。但它不是只读存储器。)后来的 PC 固件使用这个更大(可能高达16MiB 而不是 256 字节)用于设置存储的非易失性 RAM。系统管理数据,例如扩展系统配置数据和臭名昭著的 DMI 池都存储在那里。处理这些数据的工具包括使用/dev/mem 的Linux dmidecode 实用程序。
在具有 EFI 固件的现代 PC 上,“BIOS”NVRAM 通常是存储 EFI 固件环境变量的位置。这些可以通过诸如uefivars 之类的工具进行操作,而rely upon the /sys/firmware/efi filesystem(这实际上是,虽然有些间接,exports the kernel-mode EFI API for variables 到应用程序模式)。 EFI 变量是现代 EFI 固件的“设置”,控制从 EFI 引导管理器菜单(参见 efibootmgr 实用程序)到构成系统控制台的设备等一系列内容。
【讨论】:
我正在尝试在我的 wiki 上整理一个工具列表来执行此操作: https://wiki.xkyle.com/Configuing_BIOS_From_Linux
虽然从技术上讲不是 API,但它们是执行您所要求的方法的方法。
它们是特定于供应商的,并且适用于服务器。
【讨论】: