トップ 最新 追記
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2010年12月10日

sh4-linux

新しめのカーネルでは IDE (CompactFlash) や USBメモリーをmountして、その中の実行ファイルを実行すると Bus error や Segmentation Fault が発生するという不具合を見つけた
IDE(CompactFlash), usb-storage の上に
ext2, ext3, jfs , xfs のいずれを使っても
mount して実行属性のあるファイル実行すると落ちる。
2,3回リトライすると実行できる。
カーネルのconfigで、CPUキャッシュモードを write back から write through に変更すると不具合は起きない。
ただし write throughだとwrite backに比べてパフォーマンスが3割くらい落ちる。
私の推測だが、block device からデータを読むときはデータとして扱うので dcache(データキャッシュ)に入る。これが write back モードだと dirty のまま dcache に残り(メインメモリに書き出されず)、次に命令として実行したときに icache(命令キャッシュ)はメインメモリからフィルするので dcacheとicacheの間のコヒーレンシが保っていないのが原因ではないだろうか。 sh-linuxのメーリングリストでpaulさんが2010/12/3にそれっぽいことを書いていた。それでどうやら最新カーネルでは直ったようなので、不具合がどこで起きているかまず調べた。
linux-2.6.15      大丈夫実績あり
linux-2.6.24      大丈夫実績あり
linux-2.6.32      発生する
linux-2.6.37-rc3  発生する
linux-2.6.37-rc4  発生する
linux-2.6.37-rc5  大丈夫?
というわけで linux-2.6.37-rc4 と -rc5 の間で直っている。
そのdiffから関連しそうな箇所のパッチ
pic/201012/dcache_patch_2.6.37-rc5.txt
要するに何をやっているか
変更前
  0(デフォルト)  clean状態
  1              PG_dcache_dirty状態
変更後
  0(デフォルト)  dirty状態
  1              PG_dcache_clean状態
デフォルトを dirtyとした。プログラム中の論理を反転。
このパッチを不具合を起こしている -rc4 に適応→不具合が直ることを確認。