UbuntuおよびDebian Linuxをインテル Galileo 開発ボードで動かすということが比較的早期から行われており、“「インテル Galileo 開発ボード」関連の日本語ページのリンク集”からも1件リンクしています。このころからlibpthread
のコードでアプリケーションがクラッシュしてしまうことがよく知られていました。
これに関するDebian Linuxのバグレポートがあります:
これによると、LOCK
プリフィクスのついているCMPXCHG
命令の実行でセグメンテーション・フォルト(Segmentation Fault)が発生しているとのことです。このLOCK
プリフィクスを何もしないNOP
命令に置き換えると問題なく動作することから、このLOCK
プリフィクスとCMPXCHG
命令の不整合による問題のようです。
Intelもこの問題が発生することは把握しており、以下のIntel Quark Board Support Package(BSP) Release 1.0.0のリリース・ノートに記載があります:
このリリース・ノートの「Known Issues(既知の問題)」の「71538 – Linux segfault when using lock prefix instruction under specific circumstances(特定の条件下でLOCK
プリフィクスを使用するとLinuxでSegfaultが発生する)」がそれです。この部分を引用します:
Implication:
Segfault may occur for specific instruction sequences when using the “lock” prefix instruction on Linux. Not all usages of lock prefixed instructions cause the issue. Specific circumstances are under investigation by Intel.判明している状況:
LinuxにおいてLOCK
プリフィクスを使用すると、特定の命令シーケンスでSegfaultが発生することがあります。LOCK
プリフィクスを付与したすべての命令がこの問題を発生させるわけではありません。発生条件はIntelが調査中です。
日本語部分はさかきけいによる意訳
というわけで、具体的な発生条件はまだ絞り込めていないようです。しかし、現時点でわかっている回避策としてあげられているものを以下に引用します:
Inclusion of a ‘nop’ instruction immediately prior to a lock prefix instruction has been shown to resolve the segfault in cases seen so far by Intel.
Intelは
LOCK
プリフィクスの直前にNOP
命令を挿入することで、現在までに見られたSegfaultを回避することができることを確認しています。Example of failing code sequence using a user space application:
ユーザー空間アプリケーションで失敗するコード・シーケンスの例:.code32 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $0xfff88, %esp movl %ebp, %eax sub $0x100000, %eax lock addl $0x1,(%eax) leave ret
Example of suggested fix:
提示する修正例:.code32 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $0xfff88, %esp movl %ebp, %eax sub $0x100000, %eax nop lock addl $0x1,(%eax) leave ret
日本語部分はさかきけいによる意訳
このように「Intel Quark Core(Lakemont Core)」は、LOCK
プリフィクスに完全には原因が特定されていない問題が発生しています。現在のところシングル・コアですから、Segmentation Faultが発生するだけですが、もしもLOCK
プリフィクスの動作そのものに影響があるとデュアル・コアなどになった時に面倒なことになります。Intel Edisonではデュアル・コアになるそうですから、早めに解決を図りたいとIntelも考えているのではないかと思います。
以上、興味深い問題でしたので、自分用のメモを兼ねて紹介してみました。