2017年3月25日土曜日

UEFI AppをD言語で作れるようになるまでに。

さて、色々試しているD言語。
UEFI Appを作りたいってあれ。

任意のデータ構造とメソッドを持った任意の構造体を定義できた。
ワンチャンコレで作り始めることができそうなのでサンプルソースを置いておく。

ただ、RTTIとか、例外機構そういうD言語っぽい何かを使うことはできないので、
完全にメモリとか色々な管理をサボれる(scopeが使えるって意味で、メモリ管理機構等を作らなくていいという話ではない)CとDの間の何かっぽいアレができた。




下手したら、D言語のコミッターとかに見つかったらぶっころされそうな感じのハックをしているので、出来ればいい感じにobject.dとか実装していきたいけど
いい感じに出来ないからガムテープでぐるぐる巻きにした感じのものが出来た。

マングルされた名前のシンボルをただエクスポートしてるだけ。
基本的にRTTIのものばっかり。でもRTTI使わないしいいよねって感じ。

ただ、_d_assert_msgとかがどういうふうに使われてるのかが理解できるいい機会になった。

いじょー

追記
uefi-dライブラリを使ってUEFIを叩いている所。(クリックで拡大)
一般的な保護機構を持つOS上では動作しない命令(cliとhlt命令)がちゃんと実行されていることが確認できて楽しい。(build.ps1でqemuを-nographicモードで動かしてる。)

2017年3月12日日曜日

/SUBSYSTEM:UEFI_APPLICATIONなバイナリをD言語で

はい。
何もしないアプリケーションを作ってみたいと思います。
たぶん動かないんじゃないかなぁ。

動機:
1.頑張ればUEFI App作れる。
2.頑張れば→構造体とか使うと、object.dを定義してTypeInfo_Structとか実装しなきゃダメ。←これ誰か一緒にやって欲しい感じある。D言語の仕様を一緒に読んでほしい。
3.でも頑張る前にコンパイルして、実際にバイナリに落ちるか試したかった。

プロジェクトはね、ここにあるから。適当に色々やってみてって感じ。
dub -b=release でビルドできる
https://github.com/segfo/D_MinimalUEFI/tree/master


で、これがビルドスクリプト。MS製のリンカに色々とオプション渡してるだけ。
参考文献:MSDN:リンカー オプション
(注意点はdub -b=releaseオプションで必ずリリースビルドをすること。あと32ビットでビルドしようとしたら強制的に64bitビルドに切り替わるように、"dflags-x86"で、-m64を渡して切り替えるところくらいかな)

まぁ、アプリケーション本体のソースはこんな感じ本当に何もしない。
ていうか、何もできないんだよね。
D言語の場合C言語と違って、object.dを実装しないと構造体が使えないから。
本当に何もできない悲しい。
日本のD言語erの皆さん、ヒープがない環境でのobject.dの実装についてアドバイスください。

以上