提案/電源管理/カーネル落ちを調査/secondboot


Top / 提案 / 電源管理 / カーネル落ちを調査 / secondboot

secondbootの改造

secondbootを改造してAPM BIOSの返り値を調べてみます。

Virtual PC 2004 SP1

cs32     = 0000F000
eip      = 0000EF50
cs16     = 0000F000
ds       = 00000040
cs32_len = FFFF
cs16_len = 0000
ds_len   = 00000100
version  = 00000102

qemu-20050121-tap-windows

cs32     = 0000F000
eip      = 000095E3
cs16     = 0000F000
ds       = 0000F000
cs32_len = FFF0
cs16_len = FFF0
ds_len   = 0000FFF0
version  = 00000102

小技

ソースをいじりながらこまめに動かす原始的な技。

$ make install && make -C ../../tool/mkimg/ && (cd ../../../qemu && ./MonaCDBoot.bat)

正常動作

Cygwin+qemuで正常動作を確認した手順

  1. secondbootを添付のものに差し替える
    • secondbootを差し替えないでカーネルの最適化を外しただけでは、qemuでもVPC同様result = 0x00000001とだけ表示されて電源が切れない。
  2. 上記のカーネル起動用の修正を施す
    • 【追記1】APM.InterfaceConnect32()内のRegisters.ES = 0;を消す
    • 【追記2】APM.InterfaceConnect32()内のConsole.WriteLine()を全部コメントアウトする(無駄なので)
  3. GDTUtil.cppのAPM関連のコメントアウトを外す
  4. kernel/Makefileで最適化を外す(重複指定すると最初の指定が無視されることを利用)
    .cpp.o:
    	$(CXX) $(CXXFLAGS) -O0 $(INCLUDE) -c $<
  5. これでqemuでのshutdown -hの正常動作を確認
    • VPCではresult = 0x00000001とだけ表示されて電源は切れないが、エラーで落ちるということはなくなった。

開発環境

$ uname -srv
CYGWIN_NT-5.1 1.5.21(0.156/4/2) 2006-07-30 14:21
$ gcc --version
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)

qemuで正常動作しているISOイメージ

GDTUtilで-O3の副作用を回避するパッチ

コンパイラの問題だと思われるので、適用は推奨しません。

--- GDTUtil.cpp.orig	2006-09-23 10:51:47.078125000 +0900
+++ GDTUtil.cpp	2006-09-23 10:52:32.609375000 +0900
@@ -168,7 +168,8 @@
     g_tss->ss0  = KERNEL_SS;
 
     /* load TSS */
-    ltr(selector);
+    //ltr(selector);
+    asm volatile("ltr %0\n": "=m" (selector));
 
     return;
 }

Tinoさんの調査後のひげぽんがやった事

Tinoさんの調査後のひげぽんがやった事2

secondboot調査。

コメント

最新の1000件を表示しています。 コメントページを参照

お名前:
  • secondboot変更点についても調べました。 -- ひげぽん 2006-09-24 (日) 17:43:41
    • (ageました)お疲れ様でした。で、ズバリ感想を聞いても良いですか?「ぶっちゃけCのが自然だと思います。(某氏談)」とか感じておられるんじゃないかな?と。実際この手法はかなり強引なんですが、マシン語と混ぜていた頃のBASICインタプリタの延長線上みたいな感覚なので、C言語と張り合おうとは思っていないです。BASICよりましならOKということです。 -- Tino 2006-09-24 (日) 22:35:23
    • secondboot.asmの実装の話でしょうか。C言語よりも高級な事ができているのでこのままで良いのではないのでしょうか。特にC#がダメだとは思いませんでした。 -- ひげぽん 2006-09-24 (日) 22:47:27
    • 了解しました。まとめも特に食い違いはないと思います。 -- Tino 2006-09-24 (日) 22:52:47
  • というわけで-O3でも正常動作するようにするパッチを上に置いておきます。なぜこれでうまくいくのかはよく分かりませんし、g_apmInfo->isSupportedとの絡みも釈然としません。最適化には地雷が付いて回るので、変な細工で回避するより最適化レベルを下げる方が良いという気がします。以上。 -- Tino 2006-09-23 (土) 10:53:38
    • g_apminfoとの絡みは僕も分かりませんでしたが、g_tssとselector の関係をコンパイラ知り得ないことが原因で ltr が変に inline 化されたことが原因であることが分かりました。これは noinline attribute で回避できるので最適化レベル全体を下げるまではないと考えています。いかがでしょうか?(開発時に下げておくというのはビルド時間が短く有利なので賛成です。) -- ひげぽん 2006-09-23 (土) 18:42:44
    • 全然納得できないのですけど、ウォッチモードで論争するつもりはないので、私の出番はここで終了です。 -- Tino 2006-09-23 (土) 19:04:58
  • 明日時間をとって-O3のどこが悪いのか調べようと思います。分かった方がすっきりしますし。 -- ひげぽん 2006-09-23 (土) 00:18:09
    • (ageました)O3の調査は良いのですが、その前の段階として、私が提示した内容をきちんと消化してくださいね。常に自分でやるならどうだろう、と考えてください。私が一切手を出さなかったらどう解決しただろうか、時間的にはどうなんだろうか、とか。そうでないと私が勝手にやっただけという、一番悲しいパターンになります。 -- Tino 2006-09-23 (土) 00:29:31
      • 消化しているつもりですがここが甘い!という箇所がありましたら御指摘ください。Tinoさんが解決してくれなかった場合は、うまく動いているYumeさんの環境との差分から攻めたと思います。時間的とはかける時間の事でしょうか。うまく動いているものとの差分を二分法で攻めればとても長い時間がかかりすぎるということはないと考えています。 -- ひげぽん 2006-09-23 (土) 18:43:21
      • 私が手を入れたsecondboot.csについての考察が抜けているのが甘いと思いました。吐き出すコードの癖(スタックマシンを三段論法で直接代入にしている)と特にAXが不安定だということと、なるべくインラインアセンブラは使わないという観点で見れば、安全パイだという感覚が共有できるはずだと思っています。ですが深入りする気がなければ、フル汗なりC言語なりで置き換えた方が良いと思います。私が死んだらどうせそうなるわけですし。 -- Tino 2006-09-23 (土) 19:06:27
      • なるほど<考察の甘さ。せっかくなので調査してみます。 -- ひげぽん 2006-09-23 (土) 20:57:12
    • 純粋に興味なんですが、どうやって-O3の影響を調査する見込みなのか知りたいと思います。スマートな方法はちょっと思いつきません。とりあえずGDTUtil.cppだけ-O2でコンパイルすれば動作することを確認しましたので、それ以外の部分は関係ないようです。そこから先は-Sで汗比較なのかな・・・? -- Tino 2006-09-23 (土) 09:05:40
      • Tinoさんがなさっていたように関数レベルに分割+無限ループをいたるところに仕込んで細かいポイントにしぼり、その後 -S 比較という流れになるかと思います。最適化の影響で動かなくなるというのは過去のMonaで何回か経験していて、関数呼び出しが消える、ループが消える、条件分岐が消えるなどある程度パターンがあるのでそこから攻めたと思います。volatile を試したのもいちばんありがちだからです。(結果的には volatile では解決しませんでしたけど) -- ひげぽん 2006-09-23 (土) 18:43:44
      • すみません、この質問を出した時点では、私は手を引いて調べる気がありませんでした。たまたま簡単に範囲が絞れたので、ずるずると続けてしまいました。 -- Tino 2006-09-23 (土) 19:18:25
    • GDTUtil.cppには6つの関数が含まれているのですが、1関数1ソースで分割したところ、-O3でも正常動作することまで確認しました。このことからインライン最適化あたりが何か絡んでいるのではないかと推測できそうです。 -- Tino 2006-09-23 (土) 09:22:35
      • 今日の一言(不定期更新)の上に「info gcc忘れないように」と書いてありますが、info gccで調べると-O3は次のように書いてありました。 -- Tino 2006-09-23 (土) 09:26:38
      • `-O3': Optimize yet more. `-O3' turns on all optimizations specified by `-O2' and also turns on the `-finline-functions', `-fweb' and `-frename-registers' options. -- info gcc 2006-09-23 (土) 09:27:57
      • 結果的には -O3 に含まれていた -finline-functionsが原因だったということになりますね。 -- ひげぽん 2006-09-23 (土) 18:44:11
      • そこが問題なら、今までも条件は同じなので、「今までたまたま動いていただけ」ということになりますよね。なぜg_apmInfoでそれが表面化したかは依然不明です。 -- Tino 2006-09-23 (土) 19:16:19
    • 露骨に挙動が怪しいのはやはりGDTUtil::setup()です。そこでGDTUtil::setup()とそこから呼び出しているGDTUtil::setSegDesc()とGDTUtil::setSegDescExt()をひとつにまとめてみましたが、問題は再現しませんでした。ここではないようです。 -- Tino 2006-09-23 (土) 09:38:59
    • こんな感じでくっ付けたり離したりを繰り返した結果、GDTUtil::ltr()とGDTUtil::setup()とGDTUtil::setupTSS()が一つのソースに入っているときだけ、問題が再現することまでは突き止めました。 -- Tino 2006-09-23 (土) 09:48:39
    • これで再現する最小限の部分かと思ったので-O2と-O3で-Sして汗を比較してみましたが、あまりに違いすぎてちょっと歯が立ちませんでした。もう少し別の切り込み方を考えます。 -- Tino 2006-09-23 (土) 09:56:59
    • GDTUtil::setup()の中でsetSegDesc()が並んでいますが、そこを別の関数に分割したところ、問題が再現しなくなりました。ですがif( g_apmInfo->isSupported )以下を戻すと、再現しました。ひげぽんさんが突き止めておられるように、この部分の最適化が怪しいです。 -- Tino 2006-09-23 (土) 10:12:38
    • g_apmInfo->isSupportedはインライン最適化と関係なさそうなので、インライン最適化を疑ったところに立ち返ってよく見ると、setup() → setupTSS() → ltr()という流れがあります。ここでsetupTSS()でltr()を呼ばずに該当内容asm volatile("ltr %0\n": "=m" (selector));を書き込んだところ、問題が再現しなくなりました。インライン最適化の際にasmのvolatileがどこかに行ってしまっているように見えます。 -- Tino 2006-09-23 (土) 10:18:45
      • setupTSS()を見ると、処理の順番が入れ替わるとまずいのですが、コンパイラにはg_tssとselectorの関係が自明ではないので、最適化の影響を受けてしまったように見えます。 -- Tino 2006-09-23 (土) 10:24:57
      • gcc -Sで汗を比較してみましたが、処理順番が入れ替わってはいないようです。GDTUtil::ltr()がインライン化されているのは確認しました。 -- Tino 2006-09-23 (土) 11:07:35
  • 僕はその辺りにあまり幸せを感じないです。バックグラウンドの差ですね。 -- ひげぽん 2006-09-23 (土) 00:19:03
    • (ageました)ここで対比しているのは、現時点のsecondboot相当をフル汗で書くより幸せだということです。ひげぽんさんはフル汗の方が幸せだということであれば、IL2Asm16は破棄した方が幸せになれると思います。 -- Tino 2006-09-23 (土) 00:27:23
      • フル汗は嫌すぎて冷汗です(ぉ -- ひげぽん 2006-09-23 (土) 00:31:00
      • 冷汗はフル「汗」だけでなく、「しあわせ」の語感とが掛け合わせてあるのですね。今気づきました。 -- Tino 2006-09-23 (土) 09:30:18
      • 解説しないでください(汗 -- ひげぽん 2006-09-23 (土) 18:45:33
  • 詳細なレポート・原因調査ありがとうございます。>Tinoさん -- ひげぽん 2006-09-23 (土) 00:17:03
  • 【推測】YumeさんがMac OS Xで使用されているというMinGWのクロスコンパイラはひょっとしてgcc-3.3系ではないでしょうか?違いが出るとすればそのくらいしか思いつかないです。そのこととsecondbootでのcscとmcsの違いが組み合わさって、絶妙なハーモニー(?)が生み出されたように思います。 -- Tino 2006-09-22 (金) 14:23:06
    • おっしゃる通りgcc 3.3を使っています。 -- Yume 2006-09-22 (金) 16:21:47
  • 【提案】コンパイル効率などのことを考えて(最適化をやめると1.5〜2倍くらい高速になる)、通常時は最適化なしで、リリース時のみ-O2を付けることを提案します。 -- Tino 2006-09-22 (金) 14:22:15
    • 良いと思います。僕が進めます。<提案 -- ひげぽん 2006-09-23 (土) 00:17:27
    • 解決したので、通常時は最適化なし、リリース時は -O3 ではいかがでしょうか? -- ひげぽん 2006-09-23 (土) 18:46:30
    • 最適化は-O2止まりで-O3は冒険だというのが私の感覚です。それが普通だと思っていました。ですからむしろ逆に、リスクを負って、小手先の対処まで施して、-O3に拘る理由が知りたいと思いました。定量的に数パーセントのパフォーマンス向上が見込めるとか示せないなら、無意味な冒険としか感じないわけです。 -- Tino 2006-09-23 (土) 19:34:59
  • 最適化の影響について調べましたが、-O0, -O1, -O2では正常動作するようです。-O3では途中で落ちます。 -- Tino 2006-09-22 (金) 14:21:37
  • 【修正】APM.InterfaceConnect32()内のRegisters.ES = 0;は消し忘れですので、削除してご使用ください。 -- Tino 2006-09-22 (金) 14:12:21
    • Console.WriteLine()も無駄なのでコメントアウトした方が無難でしょう。 -- Tino 2006-09-22 (金) 15:59:44
      • コメントアウトしました。 -- ひげぽん 2006-09-23 (土) 18:47:17
  • 結論として、IL2Asm16とgccの両方の最適化の地雷を踏んでいたと推測されます。IL2Asm16の方はint(割り込み)後演算を一切行なわないで、可及的速やかにレジスタの値をローカル変数に退避させるのが、地雷を踏まないコツです。gccの方は詳細不明です。 -- Tino 2006-09-22 (金) 14:11:19
    • 結局、私の中でのIL2Asm16の位置付けは、ローカル変数が自由に使えるASKAみたいな感じです。もっとも出力するコードの質は冗長でASKAの足元にも及びませんが・・・。 -- Tino 2006-09-22 (金) 14:32:08
    • 【感想】リアルモードでアセンブラをごちゃごちゃいじるのは、もう戻れない昔に戻った気分になってとても楽しいです。毎日ゲーム作家を夢見て糞コードを書いていた日々・・・。リアルモードもC#も好きなので、プチ幸せ。 -- Tino 2006-09-22 (金) 14:35:29
  • カーネルの最適化を外した所、qemuでshutdown -hの正常動作を確認しました。詳しい手順は上に書きます。 -- Tino 2006-09-22 (金) 13:51:17
  • secondbootの段階で考えられる問題は排除したつもりですが、APMの正常動作には至りませんでした。 -- Tino 2006-09-22 (金) 13:40:51

MENU

now: 3

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3628, today: 1, yesterday: 0

添付ファイル: filemona-apm-iso.zip 787件 [詳細] filesecondboot.zip 793件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:03 (3888d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.073 sec.