免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10212 | 回复: 6
打印 上一主题 下一主题

在linux下对P6/NetBurst CPU做微代码更新 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-16 14:34 |只看该作者 |倒序浏览
在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控制器,现在也是一点印象都没有了。:(

论坛徽章:
0
2 [报告]
发表于 2007-01-23 10:42 |只看该作者
翻译的一篇小文档^_^

关于P6系列处理器的微代码更新的研究.pdf

211.8 KB, 下载次数: 403

论坛徽章:
0
3 [报告]
发表于 2007-03-23 21:47 |只看该作者
好,加精了

论坛徽章:
0
4 [报告]
发表于 2007-03-27 17:14 |只看该作者
好贴啊/\\\绝对好贴啊...

论坛徽章:
0
5 [报告]
发表于 2007-05-14 15:42 |只看该作者
绝对好帖,支持一下。

论坛徽章:
5
荣誉会员
日期:2011-11-23 16:44:17CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-09-18 15:15:45未羊
日期:2014-02-25 14:37:19射手座
日期:2014-12-26 22:55:37
6 [报告]
发表于 2007-05-14 16:23 |只看该作者
这个万一更新出毛病了,岂不比烧了BIOS还恐怖?

论坛徽章:
0
7 [报告]
发表于 2007-05-14 19:22 |只看该作者
原帖由 wolfop 于 2007-5-14 16:23 发表于 6楼  
这个万一更新出毛病了,岂不比烧了BIOS还恐怖?


更新微代码的操作是对 BIOS 中的 CPUCODE.bin 做更新。所以就象更新BIOS一样。还算安全吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP