2006-04-20-01-PalmLife にまつわるあれこれ - その2 - project-enigma

2006-04-20-01-PalmLife にまつわるあれこれ - その2

>> Site top >> weblog >> 月別アーカイブ >> 2006年04月のlog >> 2006-04-20-01-PalmLife にまつわるあれこれ - その2

最終更新日付:2013/12/31 07:39:27


PalmLife にまつわるあれこれ - その2

2006 年 04 月 20 日

さて、いつまでも書かずにいるわけにも参りません。今現在お茶を濁せるのはPalmLife の話題くらいです。まぁそれもなかなか濁ってくれないのが悩みドコロなのですけどね...というのは、なかなか書くほどのことがないので...などとぐだぐだ書いたら早100文字を超えました。よしよし、調子いいぞ。

とまぁそんなワケで、今回のお題は「ARM ネイティブコード対応」です。「もうかよ」と自分で書いてて突っ込んでしまいました。そうです。他にはあまり書くことないんですね。ないこともないですが、前回は速度的なことを書いたもんですから、その流れでしょう。せっかくですから、PalmLife で ARM 対応する際につまづいたあれこれについて書いてみようかと思います。では始めましょうか。

この日記をコマメに読んでらっしゃる危篤な、もとい奇特な方ならご存知と思われますが、陰郎は C++ プログラマです。それもかなりクラスのヘビーユーザーです。複数のクラス(および複数のオブジェクト)をポインタで繋いでワケがわからなくなるほど複雑なオブジェクトネットワークを作るのが大好きです。で、それが ARM 対応と何の関係があるかというとですね。そんな風に作ってあると、データを ARMlet 側に引き渡す際にどえらく苦労することになるのです。

レガシー(という言い方が適切かどうか...)な Palm ハンドヘルド用のアプリケーションはいわゆる 68K コードです。基本的に 16 ビットアーキテクチャで、Big-endianです。endian というのは、マルチバイトの数値データがメモリ上にどう配置されるかで、Big-endian はハイバイトから順に並びます。一方、ARM プロセッサは 32 ビットアーキテクチャで Little-endian です。つまり、数値型は 68K コードから ARMlet に引き渡す際、全部ひっくり返さなければならんということです。もちろんポインタが示すアドレス値も含むわけで、それはすなわちポインタを多用するデータ構造を使っていると苦労するということです。えぇ。

で、これをどうやって回避したか。実際のところ、PalmLife ではそれほど複雑なデータ構造は使用していません。しかし、意味のあるデータごとにクラスを分割していましたから、それぞれのクラスオブジェクトが隠蔽している内部データをサラしてもらう必要があったわけですね。後述しますが、クラスのインスタンスがそのまま 68K-ARM の境界をまたぐことができるかどうか、自信が無かった(とくにポリモーフィックなクラスの場合)ので、最終的には泣く泣くカプセル化に違反することに。もう回避もへったくれもありません。複数のクラスからデータを集めてきて構造体に詰め込み、ARMlet に渡したわけですよ。そして ARMlet 側のコードには 68K 側と同じコトをやるコードがいるという。まぁ 68K での動作もサポートするわけですから、2重化は避けられなかったんですけどね。

68K と ARM の違いはその他にもあります。まずは multi byte integer のアライメント。「Palm OS 5 ARM Programming」によれば、4 byte データに関しては 68K と ARM でアライメントの条件が異なるようです。68K では 2-byte alignment 、つまり偶数アドレスにあればよいのですが、ARM 側では 4-byte alignment ...すなわち 4 の倍数アドレスになければならん、と。実はこれでハマりました。実機でテストする前に Palm OS Simulator で確認していたのですが、Palm OS Simulator では Windows DLL で動作させることになります(その意味では ARMlet のテストにはなってない)。このとき、4 byte データのアライメントでオチなかったわけです。で、実機に持っていってボン! ...と。 (涙

なんだか長くなってしまったので、最後の話題は簡単に。これは C++ に固有の悩みになりますが、クラスオブジェクトが 68K-ARM 境界をまたぐことができるか。多分大丈夫だとは思うのですが、仮想関数テーブル周辺の実装がコンパイラごとに違っていたりする可能性とかありそうで。非常に興味深いテーマなので時間があれば徹底的に調べてもみたいですが、時間てのはいつでも品切れのようです。どこかで売ってないかしら。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Palm

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.