ふしぎのむらブログ

アクセスカウンタ

zoom RSS PS3のうるう年誤判定を推測してみる

<<   作成日時 : 2010/03/02 22:59   >>

トラックバック 0 / コメント 2

PS3で起きた、『うるう年問題』
原因が公表されてから、いろんな推測が飛んでいますね。

-「4で割るところを2で割ったから」
-「100で割るところ一桁間違えたから」
-「0,4,8だけで判定した?」
ユニークなやつだと、
-「カレンダーテーブルがおかしい」(←カレンダーテーブルって何?)
-「オリンピックがある年だから」

いやいやいやw

私も、PS3がなぜ2010年に2/29を引き起こしたのかを推測してみます。
なるべく、プログラマとか知識ある人以外からもわかってもらえるように書きますが、なにせソフト側の人なので、ハード周りは聞きかじりだったりします。間違っていたら突っ込みいただけると助かります〜。

----

今年の始め、『豪のクイーンズランド銀行で 2010年問題が発生』(/.J)という話題がありました。

BCDって何ぞ?と思う方もいらっしゃると思うのでちょっと説明しますね
----
コンピューターの世界では『BCD:二進化十進表現』(wikipedia)というものが使われる事があります。
私たちの世界は0〜9の十進数を使うのが一般的ですね。
対してコンピュータは、0,1の世界と言われるように二進数がベース。
11001011 (二進数記号 b をつけて 11001011b = 十進数だと203)
と言われても慣れていないと読みにくいですし、駄々長くなってしまいます。
これを縮めてもう少し扱いやすくしたのが十六進数。こちらもアルファベットA,B,C,D,E,Fが出てきてしまうので一般的ではなくなってしまいます。
CB  (十六進数記号 h をつけて CBh = 11001011b = 十進数だと203)
得意とする表現方法が違うわけですね。

コンピューターの扱いやすいものであってほしいし、人から見て見やすいものでもあってほしいということから生まれたのが、『BCD:二進化十進表現』
簡単に言うと十六進数の0〜9までを使う方式です。

BCDで 10 というのは、人から見た場合、そのまま十進数の10として扱うことができます。
時計の表示などでは、各桁の数値をそのまま表示素子の情報に使えれば、変換の必要が無くなるため電子回路を簡素化できるというメリットがあります。

こうしたことから、時計機能を扱うチップにはBCDと呼ばれる表現を使用するものがあるということが判っていただけると思います。
----

今回のPS3の様に2010となった場合を考えてみましょう。
PS3では年設定が2099までなので下2桁に注目して10とします。
うるう年判定としても、グレゴリオ暦の様な100年や400年単位の計算が必要なくなるので。単純に4で割り切れる年だけでよくなりますし。

10 は、 
十六進数だと 1 * 16 + 0 = 16
十進数だと 1 * 10 + 0 = 10
となりますね。

さて、2016年はうるう年ですよね。
時計のチップ(以下RTCと呼びます)が日付のカウントアップをし、2月の末日を算出するところでこのBCDとして扱って欲しい10を十六進数の値として誤判定をおこなってしまうと、10のとき、2月は29日まであるとなり
2010/2/29
が生まれることが考えられます。

PS3のソフトウェア(OS)が現在の日付を要求したとき、一番低層にあるRTCが、2010/2/29を現在の日付であると返したとしましょう。
RTCは別電源やバッテリなどを使ってPS3本体がPOWER OFF中も進まなければなりません。電源がなくなってしまえば時刻は消えてしまいます(PSPを久々に起動すると時計設定が待っていますよね?)
RTCはそういったものなので、RTCから返された値が正しいかどうかは判定する事が必要となります。
今回の2010/2/29は当然ながら不正値となってしまいますね。
ちなみに先に書いたRTC内で判定する処理と、ここで書いたOS側の判定処理は別物と考えてください。

電源が落ちたことによってクリアされた値だったら再設定のための処理にすすみそうですが、ありえない日付を返してきたことに対してPS3は基盤修理が必要な致命的でより優先度の高いエラー(8001050F)としてしまったのでしょう。

このエラー判定ルーチンが各サービスの入り口にあったことで、さまざまな問題へと発展します。

・2000/1/1リセット
おそらくデフォルトの値に設定されたのでしょう。手動設定していない(orインターネット経由で更新していた)状態だとココに至りそうです。
・時計が進まない
電源を投入するたびに手動設定時刻に戻ってしまう不具合。RTCとは別に手動設定時刻が保存されているように見えます。
・インターネット経由の更新ができない
基盤修理エラーなので門前払いされてすすめません。
・手動設定でも解決できなかった
RTCへの書き込みには失敗しているけど、OS側で保存する手動設定時刻の方はうまくいっていたのかな?
・トロフィー/セーブデータ/カスタムテーマ
時刻チェックをおこなうサービスはこの基盤修理エラーによって正しく処理されなくなってしまい、破損あつかいになったり、正しく表示されなくなったり

日本時間 2010/3/2 9:00を過ぎる(世界標準時で3/2になった。PS3のRTCは世界標準時をベースに動いていて、そこに日本の時差を足して表示時間となっている)と、不正値を垂れ流していたRTCは正常な値に戻るので、みなファームウェア更新なしで復旧できました。

といった感じ。
残念ながら誤判定している間、RTCに対して書き換えが出来なかったことが、問題を広めてしまった最大の要因
ファームウェアアップデートで根本解決と時計設定の判定変更などが入りそうですねぇ。

しかし、復旧時に2010/3/1ではなく、2010/4/29になったりしたのは謎だなぁ。なんだろう…。

(補足)
RTC内と書いていますが、もしかするとそれより上の層(OSレベルの下の方)で誤判定しているのかもしれません。
それこそSCEが公表しない限りわからないw
とりあえず、どこかでBCD変換ミスってますよね?というのが意見って事で。(一応機種世代別でおきていることを考えるとチップ側なのかなーと)

----

同様の考えの人がいた

RTCとBCDに注目
http://slashdot.jp/~Qs/journal/501706

サービス側の判定について
http://d.hatena.ne.jp/wapa/20100302/1267469183

----
問題が発覚した日に、24時間たったら直るといいねーという話が周りで出ていましたが、ほんとうにそうなったw
バグを起こしちゃった所も悪いんですが、テストしていないほうがまずいと思う。
そして、公式アナウンスが遅れたこと。疑いの段階であっても一言調査中(PSNではなく時計機能について)とあれば騒ぎは軽減できた。


あんまりプログラマやエンジニアの方を叩いたりしないであげてくださいな。


(3/3 23:00追記)
次はいつ問題が起きるかと想像すると2012年がうるう年としてあつかわれない事で2月29日がスキップされるとか。
2年先なんで次のメジャーアップデートとかに含めれば良いやとしているのかな。

http://twitter.com/gtk/status/9867069006
PS3 Linuxでioctl()を使ってRTCにアクセスしたお話。

あと、海外だとチップ周りの話まで掘り下げられているらしいですね。
もう1,2日したら細かい情報がでてくるかも。

テーマ

関連テーマ 一覧


月別リンク

コメント(2件)

内 容 ニックネーム/日時
PS3でトラブルがあったらしいってのは聞いてたけど、うるう年のことだったんだね。
PS3ないんでよく分からないけど、
復旧時に3/1でなく4/29になったってのは、
1/1〜3/1=60日(両端入)=3/1〜4/29(両端入)
というのが案外関係してるんじゃ・・と推測してみる
Budgie
2010/03/03 16:26
おお、組み込み系の人w

4/29っていうと2/29から2ヶ月先ってところに注目していたけど
3/1に1/1〜3/1の日数を足したって見方もあるのか…。なんでそんな事になるのか謎だ…。
そこの判定は全くわからないですよ。
Maoku
2010/03/03 22:05

コメントする help

ニックネーム
本 文
PS3のうるう年誤判定を推測してみる ふしぎのむらブログ/BIGLOBEウェブリブログ
文字サイズ:       閉じる