2011年2月13日日曜日

microcode_ctl とは何なのか?


このエントリーをはてなブックマークに追加


RHELやCentOSをインストールするとデフォルトインストールされるmicrocode_ctl。

長らく何なのかわからなかったのだが、最近コレの正体がわかった。

これね。
[root@localhost ~]# chkconfig --list |grep micro
microcode_ctl   0:off   1:off   2:on    3:on    4:on    5:on    6:off

実はソフトウェアにバグがあるように、CPUのようなハードウェアにもバグがある。

昔はこういったCPUバグはコンパイラが回避するようになってたらしいけど、最近ではIntelが修正パッチを出していて、OSの起動時にこのパッチをかぶせることで、このバグを一時的に修正できるようになっている。

当然CPUのバグとは回路の不具合なので、このパッチで恒久的な対策がされるわけではなく、毎回OS起動時に適用させてやる必要がある。

そのパッチ適用をやってくれるのが、microcode_ctl サービス。

なので、基本的にこのサービスは止める必要なし。下の方に起動スクリプトを書いてあるけど、起動時に呼ばれてそれで終わりのサービス。


マイクロコードとは
http://e-words.jp/w/E3839EE382A4E382AFE383ADE382B3E383BCE38389.html より抜粋
命令セットアーキテクチャによって定められた命令を、プロセッサ内でさらに分割した単純な命令のこと。命令セットアーキテクチャのひとつの命令は、複数のマイクロコードを用いたマイクロプログラムによって実現される場合があり、これをマイクロプログラム制御方式と呼ぶ。

ある命令セットに対応するマイクロコードの列は、プロセッサ内に保持されており、メモリから命令を読みこんだ時にマイクロコードに分解され、実行される。マイクロコードは、マイクロアーキテクチャに即した単純な命令であるため、高速に実行できる。また、命令セットの命令はマイクロプログラムによって表現されるため、一つの命令で複雑な処理を行うことが可能である。

マイクロプログラム制御方式の利点は、マイクロアーキテクチャと命令セットアーキテクチャを分離できることである。同一のマイクロアーキテクチャ、つまり同じ回路、同じマイクロコードをもつプロセッサでも、マイクロプログラムを書換えることで、ハードウェアの変更をすることなく異なる命令セットを持つプロセッサにすることができる。また、その逆に、異なるマイクロアーキテクチャを持つプロセッサを、すべて同一の命令セットに合わせることも行える。


スクリプトの中を見てみると、こんな事をやっている。

/etc/init.d/microcode_ctl 抜粋
DATAFILE=/lib/firmware/microcode.dat

. /etc/init.d/functions

RETVAL=0

# perform the update
function start ()
{
        RETVAL=1
        # Make sure we are on an Intel machine
        vendor=`grep "^vendor_id" /proc/cpuinfo | head -n1 | awk -F ": " '{ print $2 }'`
        [ "$vendor" != "GenuineIntel" ] && return

        # Microcode wasn't available until 686's.
        family=`grep "^cpu family" /proc/cpuinfo | head -n1 | awk -F ": " '{ print $2 }'`
        [ $family -lt 6 ] && return

        echo -n $"Applying Intel CPU microcode update: "

        if [ ! -e $DATAFILE ]; then
                echo $"$0: CPU microcode data file not present ($DATAFILE)"
                exit 1
        fi

        /sbin/modprobe microcode

        lt=0
        while [ ! -c /dev/cpu/microcode ]; do
                lt=$[lt+1];
                [ $lt -gt 5 ] && break;
                sleep 0.1;
        done

        /sbin/microcode_ctl -Qu
        RETVAL=$?

        /sbin/rmmod microcode

        return $RETVAL
}

CPUの型を調べて、適合すれば microcode_ctl -Qu でマイクロコードの適合を行う。

停止は
stop()
{
        return
}
と実は何もやってない。


microcodeが適用されている状態を確認したいときは。。。

/boot/grub/grub.conf の カーネルオプション rhgb quiet を削除してやれば起動時に見れる。
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-71.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-71.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_LVM_LV=VolGroup/lv_root rd_LVM_LV=VolGroup/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=ja_JP.UTF-8 KEYBOARDTYPE=pc KEYTABLE=jp106 crashkernel=auto rhgb quiet
        initrd /initramfs-2.6.32-71.el6.x86_64.img

あっという間に流れてしまうのでScrollLockすると見つかりやすい。

適用しているパッチはこれ、
/lib/firmware/microcode.dat 抜粋
/+++
/       Copyright (c) <1995-2010>, Intel Corporation.
/       All rights reserved.
/
/       Redistribution. Redistribution and use in binary form, without modification, are
/       permitted provided that the following conditions are met:
/               .Redistributions must reproduce the above copyright notice and the following
/       disclaimer in the documentation and/or other materials provided with the
/       distribution.
/               .Neither the name of Intel Corporation nor the names of its suppliers may be used
/       to endorse or promote products derived from this software without specific prior
/       written permission.
/               .No reverse engineering, decompilation, or disassembly of this software is
/       permitted.
/               ."Binary form" includes any format commonly used for electronic conveyance
/       which is a reversible, bit-exact translation of binary representation to ASCII or
/       ISO text, for example, "uuencode."
/
/       DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
/       HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
/       WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
/       WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
/       PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
/       OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
/       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
/       NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
/       LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
/       CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
/       STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
/       ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
/       ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/
/---
/*  Tue Feb 9 12:54:50 CST 2010  */
/*  727-MU168313.inc  */
0x00000001,     0x00000013,     0x02062001,     0x00000683,
0x2f0da1b0,     0x00000001,     0x00000001,     0x00000000,
0x00000000,     0x00000000,     0x00000000,     0x00000000,
0xbf5ad468,     0xc79f5237,     0xbd53889e,     0x896bfd13,
0x7adc0c8f,     0x44e9e0bc,     0x1a331fc9,     0x00b0f479,
0x53e9ceb3,     0xb14131a4,     0x39fc8310,     0x6993ee0d,
0xdb0c59b4,     0x67f24fd0,     0x63e83516,     0x0a4d411d,
0xb86a4294,     0x72c2edc5,     0xc543c5df,     0x7f3dd290,
0x2fb772ec,     0x9a2931bb,     0xefc2e759,     0x2f5939eb,
0xc37aa9d5,     0xd6d46fcf,     0xaf6ef51e,     0x5c3b48ed,
0xec51da4d,     0x6c8a6d59,     0x66ecfeb7,     0x3698ead8,
0x00ba31f3,     0x98f1a1fa,     0x2d015e7d,     0x5599cff2,
0x3106cde9,     0xdc0160f0,     0x14b213c3,     0xbd29458f,
0xa849c192,     0x2edfe235,     0x6dd8c4d5,     0xbd204f8c,
0xb4abfb0b,     0x173e7eb0,     0xf9540357,     0xd5357562,
x86のアセンブラがわかるとこの意味もわかるのかな?

というわけで、microcode_ctl の概要でした。

0 件のコメント:

コメントを投稿