【make】 特殊なマクロ定義
いっつも忘れがちなmakeの特殊マクロを覚書き。
MAKECMDGOALS .... コマンドラインから与えた最終ターゲット
MAKEFLAGS .... コマンドラインから与えたオプション類
例えば
make clean -n
と入力すると
MAKECMDGOALS clean
MAKEFLAGS -n
になると。
« 2009年4月 | トップページ | 2009年6月 »
いっつも忘れがちなmakeの特殊マクロを覚書き。
MAKECMDGOALS .... コマンドラインから与えた最終ターゲット
MAKEFLAGS .... コマンドラインから与えたオプション類
例えば
make clean -n
と入力すると
MAKECMDGOALS clean
MAKEFLAGS -n
になると。
Dell imspiron mini9 with ubuntuだと標準でDELLランチャーが起動するのだけど、最初は使ってたんやけど画面がチラチラするのと、デスクトップPCと同じ環境にしたいなぁというのもあって消したくなったのだ。そこで「設定」から「デスクトップの切り替え」を起動して、「DELLオリジナルデスクトップ」から「標準のデスクトップ」に変更したのだけど、なぜか再起動するとDELLランチャーがそのまま起動してしまう。タイトルバーとかはubuntuの標準GUIになっているのだけど...
あんまり調べる気にならなかったのでそのまま使ってたんやけど、そろそろちゃんと消そうと思って調べてみた。
結論から言うと簡単な話。
「システム」-「設定」-「現在のセッション」から "Dell launcher" を削除すれば良いだけやった。
これで、再起動してもDELLランチャが起動されなくなって画面のチラつきもなくなったよ。
ついでに仮想デスクトップを4面に増やして、縦横2x2に配置したら便利便利。
あ、あとBIOSのアップデートをして、Fn + z でディフォルトウィンドウの最大化ができるようになりました。
この機能、本来ubuntuでは F11 に割り当てられているのやけど、insprion mini9ではキーボードスペースの問題もあってF1〜F10までしかキーがマップされていない。F11とF12は押せなかったわけですわ。
でも、BIOSを最新版にする事で、F11(Fn+z)、F12(Fn+_x)に割り当てされるようになりました。
これは初期ロットの問題であって、最近新規に買ったinspiron mini9では新しいBIOSが入っているので大丈夫みたい。
ちなみに、キーボードにF11、F12の表示はないので気づきにくいですな。
我が家のメインサーバ(mail、DNS、web、subversion、mediatomb、mysql、xoops、etc...)のHDDがお亡くなりになってしまった
2.5インチの40GB HDDで、もうかれこれ連続稼働2年を越えて3年目やったから、そろそろ危ないなぁと思ってたのやけど、いきなりですわ。
とりあえずバックアップは昨晩の分が正常に取れていたのと、種々のデータは外付けのRAID HDDやRAID NASに記録してあるので、被害はゼロやねんけど、復旧まで手間がかかるなぁ。
それに、家庭内wikiが使えないから、めっちゃ不便や...。
そろそろHDD載せ替えの時期やったからSSDにでもしようかと考えていたんやけど、これで決定やな。
OSもfedora 7で運用してたけど、ubuntu server版に変更しよう。
さてさて、まずはSSDを発注しなくては...。
何を思い立ったかIA-32ベースの自前組み込み系カーネルを開発すべく実験を始めてみました。
とりあえずx86系プロセッサの最低限の知識はあるしアセンブラも書けるんで、この辺りは問題ない。
となると問題は環境面(ツール面)ですな。
どうやってやるべきかと色々調べてみました。
もちろん、この開発用にPCを用意すれば良いのだけど、開発中に一々別のPC触るのも面倒やし、大体そんな余剰なPCは手元にないので(いや、あるか...LOOXが...)できればシミュレータで済ましたいわけですわ。
普段はWIndowsXPを動かすのにVMwareを使ってるんで、最初の案はVMwareでFDから起動させる事。
今のマシンはFDドライブなんて付いてないんやけど、VMwareならFDイメージから起動できるんで問題なしやなぁ。
周辺デバイスも問題なく使えるし、こりゃええかも。
と、さっそく512ByteのMBR用プログラムを作成して、nasmでアセンブル。
あ、ちなみにnasm 0.99.06は ubuntu 8.04 LTS のパッケージとして提供されています。
パッケージマネージャで、「nasm」で検索すると出てくるはず。
カーネル開発には必須なので、要インストールですわ。
作成したバイナリを先頭に配置したFDイメージを作成する。
ここでは面倒やったので、バイナリエディタ(KHexEdit)を使って 1474560 バイトのファイルを作成してみました。
最初の512バイトに上記のアセンブル結果、後ろ1474048バイトを0埋めしときゃ大丈夫。
できあがったFDイメージファイルをマウントして、さぁ実験...。
こんな感じで、無事MBRから作成したプログラムが起動して左上に青バック、白文字で「TEST」と表示できました。
VMwareだったら動作も安心やし、色々と利点はある。
あるけど、今回の目的にはちょっとそぐわない。
というのは、ソフトの開発中は開発効率が最重要なんやけど、VMwareで起動するためにはマウスで起動ボタンをポチポチしなければならへん。
もちろんキーボードショートカットもあるやろうけど、どちらにしてもちょっと面倒なんですわ。
他になにかないかな〜っとさがしてたら、IA-32シミュレータのQEMUとbochsを発見。
どちらも同じようなソフトウェアシミュレータですな。
VMwareはホストPCのハードウェア(プロセッサと周辺)を利用してゲストプログラムを起動するので非常に高速。
それに比べて、これらのソフトウェアシミュレータは、完全ソフトウェアでプロセッサの挙動をシミュレーションするので低速なわけです。
どうやらこれらのシミュレータはサイクルシミュレータらしく、かなり厳密にシミュレーションしてくれそう。
仕事柄、僕自身もプロセッサのソフトシミュレータを作ったりするのやけど、さすがにIA-32のシミュレータは手がで〜へんなぁ。
開発者様には脱帽ですわ。
で、今度はbochsを使ってみる事にしました。
ubuntuではbochsもパッケージが用意されているようで非常に楽。
パッケージマネージャで bochs として検索して、表示されるパッケージを全てインストールします。
この時、vgabios も忘れずに。
こんな感じですわ。
bochsは /usr/bin/bochs にインストールされるみたい。
あと必要なものとしては、BIOSイメージとvgaromイメージ、それからbochsの設定ファイル。
BIOSイメージ /usr/share/bochs/BIOS-bochs-legacy
vgaromイメージ /usr/share/vgabios/vgabios.bin
が使えます。
それから設定ファイル。
bochsはカレントディレクトリに bochsrc というファイルがあると、それを設定ファイルとして読み込んでくれるみたい。
そこで、以下のような内容のbochsrcを作成する。
romimage: file=/usr/share/bochs/BIOS-bochs-legacy, address=0xf0000
megs: 32
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44=fd.img, status=inserted
boot: floppy
floppy_bootsig_check: disabled=1
mouse: enabled=0
fullscreen: enabled=0
このファイルを保存したディレクトリで
$ bochs
とすると、bochsが起動してさっき作成したFDイメージのMBRからブートローダを読み出して起動してくれる。
で、実行した結果が↓
はい。見事にVMwareと同じ画面が表示されました。
取り合えず、今日はこの位にするかな?
環境整備という面ではアセンブル後のバイナリからFDイメージを作成する所も自動化してmake一発で起動テストまでできるようになるから、かなり良い感じ。当面は速度のペナルティは見えなさそうやしね。むしろ早いかもしれへん。
Windows7 RCがリリースされたんで、さっそくVirtualBox2上で動かしてみました。
うん、Windows7 betaの時と同じや。
ネットワークの設定もNATを選択しておけばちゃんとつながった。
なんかホストとの間はIPv6で接続している気もするが...
とりあえず無事インストールして動作しましたという報告まで。
起動中 (起動〜ログイン画面まで: 約40〜50秒)
ログイン画面 (ログイン後〜メニュー操作できるまで: 約10秒)
デスクトップ(その他、ガジェット等)
特に見た目はWindows7 betaと違いがないっぽい。
でも、全体的にもっさり感はあるなぁ。
色々な状態遷移の遅さをアニメーションで誤魔化している感はあるね。
右下部分を拡大すると・・・↓
はい、ちゃんとWindows 7 RCです。
とりあえず、ちょっと使ってみるかな。
色々ソフト入れて互換性とか調べてみようっと。
訳ありでx86系のブートコードを調べています。調査結果そのものはもうちょっと先という事にして、まずブートできるプログラムを作ってみようと考えたわけです。環境としては素のPCを使うのも不便なんで、VirtualBox on ubuntu の仮想マシン環境を使ってみる事にしました。
ホンマはUSBブートとかしたかったんやけど、(USBブートなら他のノートPCとかにもそのまま移植できるから)VirtualBoxではUSBブートをサポートしていないので、FDブートという事にしました。
とまぁ、ここまでの話から察しが付くかとは思うねんけど、最終形としてはポータブルなOSの開発を目指してみてますダ。OSの基本機能は
ってな所でしょうか。これらの機能についてそれぞれさらに詳細な仕様が追加されるわけやけど、とりあえず全体が動くようにしてみたいなぁと思うわけです。
そんなこんなで、まずはIPL(Initial Program Loader つまりはブートローダー)を書いてみようと思ったのやけど、問題は開発環境に何を使うかですな。とりあえず面倒な事は嫌いやし、VirtualBox上で動かそうと思ったので、FDのFAT12イメージをそのままアセンブラで出力したいなぁと。
普通にgccのアセンブラを使ってしまうと、ELF形式で出力されてしまって具合が悪い。
ほな、どうすれば良いか?(ようやく、今回のネタの本題ですな)
gcc --nostdlib -Wl,--oformat=binary -o バイナリ名 ソースファイル名
上記のようにすれば、素のバイナリが出力されるという事でした。
つまりELFコンテナではないアセンブラソースに記述されている命令がそのままバイナリで出力されるという事。よし、これで取り合えずVirtualBoxでのFDイメージからの起動が確認できました。
ちなみに通常のPCの起動順序は
ってな感じになります。
特権モードやら通常モードやらの切り替えは上記のプログラム本体起動後の話ですな。
BIOSは文字通り基本的な入出力をサポートするプログラムなんやけど、PowerOn Reset時にDRAMや各種外部デバイスのレジスタ設定を行う事がメインのお仕事です。最近じゃBIOSが高機能になって、起動手順やらUSBなんかの高レベルデバイスのサポートやらをやってくれる上に、画面モードも複数サポートしてたりするんやけど、一番基本的な事はバスステートコントローラの設定、メモリの設定、DMA等CPU外デバイスの設定、CPUの設定といったハードウェアのレジスタ設定なんですわ。この点では組み込みのプロセッサとなんら違いはないわけやね。
今回は取り合えず起動を試しただけなので、もうちょっとおもしろい事ができたらソースを公開しようかと思っとります。さぁて、今度はどこまで飽きずに続くかな?