Microcode (简体中文)
处理器微指令 和处理器固件是同一概念。内核有能力不通过 BIOS 来更新处理器固件。
- 微指令数据文件包含所有 Intel 处理器的最新微指令定义。Intel 发布微指令更新来修正处理器行为,修正内容登在处理器相关更新文档中。常规的更新方法时通过 BIOS 升级,而 Intel 意识到这会是一个管理争端(administrative hassle)。Linux 操作系统和 VMware ESX 产品拥有一个机制,可以在引导完毕后更新微指令。比如,将这个文件放在 Linux 系统的 /etc/firmware 目录下之后,这个文件就会被该操作系统机制使用。 ——Intel
Contents
更新微指令
对于 Intel 处理器,安装 intel-ucode。
对于 AMD 处理器,微指令更新放置在 linux-firmware ,而它作为基本系统的一部分安装。
启用 Intel 微指令更新
EFI boot stub / EFI handover
只需要附加两个 initrd=
选项即可:
initrd=/intel-ucode.img initrd=/initramfs-linux.img
Gummiboot
在 /boot/loader/entries/*.conf
中使用 initrd
两次:
title Arch Linux linux /vmlinuz-linux initrd /intel-ucode.img initrd /initramfs-linux.img options ...
rEFInd
如上述每个 EFI boot stub 一样编辑 /boot/refind_linux.conf
中的引导选项,例如:
"Boot with standard options" "ro root=UUID=(...) quiet initrd=/intel-ucode.img initrd=/initramfs-linux.img"
如果你在 /boot/refind.conf
中使用手动的节(manual stanzas)来定义所要引导的内核,那么简单地依需求添加 initrd=/intel-ucode.img 或 /boot/intel-ucode.img 到选项行,并不需要修改节的主干部分。
Grub
grub-1:2.02-beta2-5发布之后, /usr/bin/grub-mkconfig
可以自动处理微指令更新.用戶在安装完intel-ucode后,运行grub-mkconfigke
就可以重新生成grub配置文件启用微指令更新。
用户也可以在 grub.cfg
中添加/intel-ucode.img
或 /boot/intel-ucode.img
(记住 /intel-ucode.img
文件的路径和你的引导分区有关,就像 initramfs 一样。
[...] echo 'Loading initial ramdisk ...' initrd /intel-ucode.img /initramfs-linux.img [...]
Syslinux
在配置文件/boot/syslinux/syslinux.cfg
中,多个 initrd 可以通过逗号来分隔。
LABEL arch MENU LABEL Arch Linux LINUX ../vmlinuz-linux INITRD ../intel-ucode.img,../initramfs-linux.img APPEND ...
启用 AMD 微指令更新
在 AMD 系统上,微指令会在启动时自动更新,所以不必做更多动作。
验证微指令已在启动时更新
你可以通过 dmesg | grep microcode
命令来检查微指令是否已经在启动时成功更新。
在 Intel 系统上,你应当会看到和下面类似的一些东西,表明微指令已在早先更新:
[ 0.000000] CPU0 microcode updated early to revision 0x218, date = 2009-04-10 [ 0.588776] microcode: CPU0 sig=0x106c2, pf=0x4, revision=0x218 [ 0.588799] microcode: CPU1 sig=0x106c2, pf=0x4, revision=0x218 [ 0.588977] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
如果硬件比较新,也可能没有任何微代码更新,结果应该是下面这样:
[ 0.292893] microcode: CPU0 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292899] microcode: CPU1 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292906] microcode: CPU2 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292912] microcode: CPU3 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292956] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
在 AMD 系统上,微指令会在启动的更晚阶段被更新,所以输出会看起来像这样:
[ 0.807879] microcode: CPU0: patch_level=0x01000098 [ 0.807888] microcode: CPU1: patch_level=0x01000098 [ 0.807983] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba [ 16.150642] microcode: CPU0: new patch_level=0x010000c7 [ 16.150682] microcode: CPU1: new patch_level=0x010000c7
哪些 CPU 可以接受微指令更新
可以从 Intel 和 AMD 的网站查看支持的型号:
检查可用微指令更新
可以通过 iucode-toolAUR 来检查 intel-ucode.img 是否包含适用于你 CPU 的微指令映像。
- 安装 intel-ucode (检测并不需要修改 initrd)
- 从 AUR 安装 iucode-toolAUR
-
# modprobe cpuid
-
# bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
(解开微指令映像,并根据你的 cpuid 搜索是否适用) - 如果有更新可用,它应该会在 selected microcodes 之下显示