在linux下对P6/NetBurst CPU做微代码更新
在linux下对P6/NetBurst CPU做微代码更新
微代码(Microcode)是Intel的P6和NetBurst两个家族CPU(也就是Pentium Pro以及更新的IA 32 CPU,Pentium X以及它们的Xeon/Celeron变体)的一种更新特性。通过从Intel的站点下载微代码,加载到处理器核中, 对一些BUG进行勘误。微代码是包含处理器的微指令(Microinstructions)的数据块,具体细节将在正翻译中的《P6 Family Processor Microcode Update Feature Review》文档中给出。这里只粗略说一下Linux下怎么做。
1, Linux内核提供了支持微代码更新的驱动程序,设备文件是/dev/cpu/microcode,如果你的机器是SMP的,那可能「cpu」就该替换成「cpu0」之类。这一驱动程序位于arch/i386/kernel/microcode.c, make menuconfig时通过CONFIG_MICROCODE选择静态编译、模块或者是不选。
[root@localhost microcode_ctl-1.13]# grep MICROCODE /lib/modules/2.6.16/build/.config
CONFIG_MICROCODE=m
[root@localhost microcode_ctl-1.13]# file /dev/cpu/microcode
/dev/cpu/microcode: ERROR: cannot open `/dev/cpu/microcode' (No such file or directory)
#设备文件不存在,说明模块还没加载
[root@localhost microcode_ctl-1.13]# modprobe microcode
[root@localhost microcode_ctl-1.13]# file /dev/cpu/microcode
/dev/cpu/microcode: character special (10/184)
看一下microcode模块的信息:
[root@localhost linux-2.6.16]# modinfo microcode
filename: /lib/modules/2.6.16/kernel/arch/i386/kernel/microcode.ko
alias: char-major-10-184
license: GPL
author: Tigran Aivazian <tigran@veritas.com>
description: Intel CPU (IA-32) Microcode Update Driver
srcversion: 0F071A1BF24153704F7EA72
depends:
vermagic: 2.6.16 SMP preempt PENTIUM4 REGPARM 4KSTACKS gcc-4.0
2, 从http://www.urbanmyth.org/microcode/下载microcode_ctl-1.13.tar.gz,解开进入其源代码目录
[root@localhost microcode_ctl-1.13]# make all
gcc -g -Wall -O2 -I /usr/src/linux/include -o microcode_ctl microcode_ctl.c
echo "/etc/init.d/microcode_ctl" > microcode-filelist
[root@localhost microcode_ctl-1.13]# make install
install -d /usr/local/sbin /etc \
/usr/local/man/man8 /etc/init.d \
install -s -m 755 microcode_ctl /usr/local/sbin
install -m 644 intel-ia32microcode-05Jan2006.txt /etc/microcode.dat
install -m 644 microcode_ctl.8 /usr/local/man/man8
gzip -9f /usr/local/man/man8/microcode_ctl.8
install -m 755 microcode_ctl.start /etc/init.d/microcode_ctl
chkconfig --add microcode_ctl
#注意上面的最后一句, make install时调用了chkconfig把microcode_ctl设置为系统服务。微代码这个东西不是烧写在CPU中的,所以每次关机或重启的时候它都会消失,必须得在每次引导的时候执行加载才能保证使用最新的updates。(P.S.如果能永久写入CPU,那将是后门程序多么美好的温床阿^_^)
[root@localhost microcode_ctl-1.13]# service microcode_ctl status
/etc/init.d/microcode_ctl: reading microcode status is not yet supported
#哦,内核中的驱动程序还没提供从CPU读微代码的功能:)
[root@localhost microcode_ctl-1.13]# service microcode_ctl start #这里也可以直接microcode_ctl -u
Applying Intel IA32 Microcode update...
[ OK ]
[root@localhost microcode_ctl-1.13]# dmesg |tail
IA-32 Microcode Update Driver: v1.14 <tigran@veritas.com>
microcode: CPU0 updated from revision 0x0 to 0x12, date = 11222004
#已经更新过了
[root@localhost microcode_ctl-1.13]#
[root@localhost microcode_ctl-1.13]# dmesg -c
IA-32 Microcode Update Driver: v1.14 <tigran@veritas.com>
microcode: CPU0 updated from revision 0x0 to 0x12, date = 11222004
[root@localhost microcode_ctl-1.13]# microcode_ctl -u
microcode_ctl: writing microcode (length: 249856)
microcode_ctl: microcode successfuly written to /dev/cpu/microcode
[root@localhost microcode_ctl-1.13]# dmesg
microcode: CPU0 already at revision 0x12 (current=0x12)
microcode: No new microcode data for CPU0
#CPU中的微代码已经是最新的,无法更新了。
看一下我们的脚本在哪些运行级别下开启:
[root@localhost microcode_ctl-1.13]# chkconfig --list microcode_ctl
microcode_ctl 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
然后你可以通过chkconfig --add和chkconfig --del来控制它。
其实Intel给的微代码也就是个文本文件,其中全是16进制数据:
[root@localhost microcode_ctl-1.13]# head -n 30 intel-ia32microcode-05Jan2006.txt
/+++
/ Copyright Intel Corporation, 1995, 96, 97, 98, 99, 2000, 01, 02,
/ 03, 04, 05, 06.
/
/ These microcode updates are distributed for the sole purpose of
/ installation in the BIOS or Operating System of computer systems
/ which include a Genuine Intel microprocessor sold or distributed
/ to or by you. You are not authorized to use this material for
/ any other purpose.
/---
/* Thu Jan 5 11:13:31 CST 2006 */
/* m5df4a02.inc */
0x00000001, 0x00000002, 0x06102005, 0x00000f4a,
0xdfbc9997, 0x00000001, 0x0000005d, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x1b07bcc7, 0x229cce65, 0xe3946d89, 0x368a8eaa,
0x8b8a4197, 0x2e048664, 0x48078928, 0x0aa749ae,
0x1cee9215, 0x22910485, 0x3d030824, 0x15cb61f8,
0x7fff14fa, 0x35c7b714, 0x1d489846, 0x5d8ff7da,
0xe237595f, 0x35e48e39, 0x4540e8d1, 0x45c15a5c,
0x3356fc26, 0x5d5386e8, 0x926d41b3, 0x10ca2831,
0x904bdf7f, 0x463e806b, 0xb22aa067, 0xaff8872c,
0xb5260171, 0x1b4bdd54, 0x6582202e, 0xaceff700,
0x56cfda08, 0x8a39f2a7, 0xf1c0e97f, 0x05fe76a0,
0xca6b4d0e, 0x9f33f9ea, 0x0495ba8a, 0x31380f84,
0xda4d936b, 0x2597f34c, 0x523aedf7, 0x22df0035,
0x15acc8e4, 0x23663293, 0xe869afdd, 0x1f23378d,
0x71a210f8, 0x091c942e, 0x5578f30d, 0xe4be34eb,
0xfd9927f3, 0x01200031, 0x0d76398e, 0xe46f9840,
0x8e29a1c5, 0xcfcd5407, 0xc93c0b1d, 0x3675504a,
操作很简单,不多说。 因为提到微指令,想起大学时候《组成原理》的实验课,最后一个实验就是自己实现CPU的扩展指令,可惜那时候想都不想就选择了抄袭; 现在问问当年的同学,不但大家都记不起做过什么, 甚至连实验用机是否为x86系列都不能确定了。呵呵, 《组成原理》的课程设计, 同学和我两个用Max+Plus II设计了一个DMA控制器,现在也是一点印象都没有了。:(
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
翻译的一篇小文档^_^
好,加精了
好贴啊/\\\绝对好贴啊...
绝对好帖,支持一下。
这个万一更新出毛病了,岂不比烧了BIOS还恐怖?
更新微代码的操作是对 BIOS 中的 CPUCODE.bin 做更新。所以就象更新BIOS一样。还算安全吧