Successfully reported this slideshow.

NetBSD6.X (i386)が2038年問題に対応、その余波

0

Share

Loading in …3
×
1 of 22
1 of 22

More Related Content

More from 洋史 東平

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

NetBSD6.X (i386)が2038年問題に対応、その余波

  1. 1. NetBSD 6.X (i386)が 2038年問題に対応 その余波 東平洋史
  2. 2. こんなん 動態保存 してます
  3. 3. clu2c(くるーつーしー)とは何ですか? プログラミング言語CLUの処理系 • プログラミング言語CLUで書かれたプログラム をCで書かれたプログラムに変換(CLU to C) • Cで書かれたプログラムを実行形式(a.out)に コンパイル CLUの プログラム Cの プログラム clu2c ライブラリ clulink 実行形式 a.out
  4. 4. clu2cでの戻り値の処理 • Cの関数の戻り値 – 正常終了か例外発生するかのフラグ • CLUの戻り値 – 大域変数に格納 retval_area[0] retval_area[1] … オブジェクト int ポインタ
  5. 5. 整数型とビット数 データ モデル システム long long long ポインタ ILP32 NetBSD 5.X (i386) 32 64 32 ILP32 NetBSD 6.X (i386) 32 64 32 LP64 64bit Linux 64 64 64 LP64 NetBSD 6.X (amd64) 64 64 64
  6. 6. clu2cでのint型(CLU)とビット数 データ モデル システム int型 (CLU) 戻り値用 大域変数 ポイン タ ILP32 NetBSD 5.X (i386) 32 32 32 ILP32 NetBSD 6.X (i386) 32 32 32 LP64 64bit Linux 64 64 64 LP64 NetBSD 6.X (amd64) 64 64 64
  7. 7. 稼働確認済みの環境(一部) • Cygwin • Ubuntu 13.04 – i386 – amd64 • OpenSUSE 12.3 – 32bit – 64bit • FreeBSD 9.1 – i386 • NetBSD 5.2 – I386 – amd64 • NetBSD 6.0.1 – i386 – amd64 • NetBSD 6.1 – i386 – amd64
  8. 8. 稼働確認済みの環境(NetBSD) • NetBSD 6.0.1 –i386 –amd64 • NetBSD 6.1 –i386 –amd64 • NetBSD 5.2 –I386 –amd64
  9. 9. NetBSD 6.X では 64bitでのみ 可動
  10. 10. その前に
  11. 11. 西暦2038年問題(C言語のtime_t 型) • 西暦2038年1月19日3時14分7秒(UTC)過ぎにC言語のtime_t型 を使ったプログラムが誤作動 – 西暦1970年1月1日0時0分0秒(UTC)からの経過秒数で時間 を表現 – 32ビット符号つきの整数で実装した場合に問題発生 – 西暦2038年1月19日3時14分7秒(UTC) ⇒西暦1901年12月13日20時45分7(UTC) •2^31 – 1 = 2147483647 の次を -2^31 = -2147483648 と認識 0 1111111111111111111111111111111 = 2^31 - 1 1 0000000000000000000000000000000 = -2^31 1 1111111111111111111111111111111 = -1 先頭のビットが1の時はマイナスの数になる
  12. 12. NetBSD 6.X になって… In addition to many other features, NetBSD 6.0 includes significant developments in various ports. Some highlights: • time_t is now a 64-bit quantity on all NetBSD ports. This means that the NetBSD world no longer ends in 2037. <http://www.netbsd.org/releases/formal- 6/NetBSD-6.0.html>
  13. 13. NetBSD 6.X の time_t型 は 64bit
  14. 14. clu2cでのtime_t型 intとして扱う 使用例 get_atime = proc(S: _external_struct_stat) returns(int) % effects Returns the `st_atime' member of S. end get_atime get_mtime = proc(S: _external_struct_stat) returns(int) % effects Returns the `st_mtime' member of S. end get_mtime
  15. 15. 整数型とtime_t型とビット数 データ モデル システム time_t CLUの int 戻り値用 大域変数 ポインタ ILP32 NetBSD 5.X (i386) 32 32 32 32 ILP32 NetBSD 6.X (i386) 64 32 32 32 LP64 64bit Linux 64 64 64 64 LP64 NetBSD 6.X (amd64) 64 64 64 64
  16. 16. 整数型とtime_t型とビット数 データ モデル システム time_t CLUの int 戻り値用 大域変数 ポインタ ILP32 NetBSD 6.X (i386) 64 32 32 32 ココだけ違う
  17. 17. という わけで
  18. 18. NetBSD 6.X で clu2c が 動かない理由 • Cの time_t 型が64bitになった – NetBSD 5.X までは 32bit • clu2cはCの time_t 型をCLUの int 型 として 扱っていた • 32bit アプリケーションではCLUの int 型を 32bitにしていた
  19. 19. 解決策(実装作業中) • Cの time_t 型専用の型を作成 • CLUの time_t 型の具体表現を32/64bit両対 応に Cの time_t 型 ポインタ 32bit or 64bit32bit
  20. 20. おしまい (^.^)/~~~

×