在linux下对P6/NetBurst CPU做微代码更新

发布于 2022-09-27 14:45:29 字数 6473 浏览 18 评论 0

在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

雪花飘飘的天空 2022-10-04 14:45:29

翻译的一篇小文档^_^

琉璃梦幻 2022-10-04 14:45:29

好,加精了

薆情海 2022-10-04 14:45:29

好贴啊/\\\绝对好贴啊...

谈下烟灰 2022-10-04 14:45:29

绝对好帖,支持一下。

秋风の叶未落 2022-10-04 14:45:29

这个万一更新出毛病了,岂不比烧了BIOS还恐怖?

乖乖哒 2022-10-04 14:45:29

原帖由 wolfop 于 2007-5-14 16:23 发表于 6楼  
这个万一更新出毛病了,岂不比烧了BIOS还恐怖?

更新微代码的操作是对 BIOS 中的 CPUCODE.bin 做更新。所以就象更新BIOS一样。还算安全吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文