2015年1月30日金曜日

BochsをUbuntuにインストールする

PCエミュレータのBochsをデバッグモードでUbuntu14.04(32bit)にインストールしてみた。apt-getではうまくいかなかったため、ソースからビルドする方法をここに残す。Bochsの動作を確かめるのにFreeDOSを使ってみた。

Bochsをソースでダウンロードして、解凍する

Bochsのページ(http://bochs.sourceforge.net/)ヘアクセスして「SourceForge project page」のリンクをたどる。



ここではbochs-2.6.2をインストールするため下の図の「bochs」のリンクをたどり、


「2.6.2」をたどり、


bochs-2.6.2.tar.gzをダウンロードする。



以下のように、ダウンロードしたファイルをホームディレクトリに解凍する($はプロンプト)

$ cd ~
$ gzip -dc ./Downloads/bochs-2.6.2.tar.gz | tar xf -

Bochsのビルドと環境変数の設定

解凍したディレクトリに移動し、

$ cd ./bochs-2.6.2/

次の条件が満たされるように
  • インストールがホームディレクトリのbochsディレクトリになされるよう(--prefix=$HOME/bochs)
  • x86_64アーキテクチャをサポートするように(--enable-x86-64)
  • Bochsがデバッグモードでビルドされるように(--enable-debugger --enable-disasm)
configureを実行する。(./configure --helpでオプションの一覧を見ることができる。)

$ ./configure --prefix=$HOME/bochs --enable-x86-64 --enable-debugger --enable-disasm

その後、ビルドする。

$ make

しかし、「シンボルpthread_create@@GLIBC_2.1が見つからない」とエラーがでるので、Makefileの96行目

X_LIBS = -lX11    -lXrandr



X_LIBS = -lX11    -lXrandr -pthread

に変更して、再度ビルドする。

$ make

ビルドが終わったら、次でインストールが完了する。上のconfigureの--prefixオプションで指定したディレクトリにインストールされる。

$ make install

またBochsの動作を設定するためのファイル.bochsrcをホームディレクトリにコピーしておく。

$ cp ./.bochsrc ~/

Bochsの起動を簡単にするために.bashrcに次の追記をして環境変数を設定しておく

PATH=$PATH:$HOME/bochs/bin
export PATH

PATHをすぐに反映させるためには

$ source ~/.bashrc

を実行する。

FreeDOSをダウンロードして配置する

Bochsの実行を確認するためにFreeDOSというOSを使う。フロッピーディスクイメージでダウンロードしてBochsで動作させてみる。FreeDOSのページ(http://www.freedos.org/)から以下のようにリンクをたどってダウンロードする。


下の方からフロッピーディスクイメージをダウンロードできる。ファイル名はfdboot.img


ダウンロード後、そのイメージファイルをホームディレクトリに配置すると実行まであともう少し。

$ cd ~/
$ cp ./Downloads/fdboot.img ~/


Bochsの設定ファイル.bochsrcを修正する

そのまま実行するとエラーがが出て実行が中断される。そこで設定ファイルを以下のように修正する。設定ファイル内に説明や設定の例があるので、それを参考に設定していけばよい。
まずは、192,193行目の

cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
cpu: cpuid_limit_winnt=0



#cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
#cpu: cpuid_limit_winnt=0
cpu: model=turion64_tyler

にしてcpuを変更(#はコメントアウト)。
先ほどホームディレクトリに配置したFreeDOSをフロッピーAに設定するため、435行目付近の

floppya: 1_44=/dev/fd0, status=inserted

を同様に#でコメントアウトし、その下の行に

floppya: 1_44=/home/username/fdboot.img, status=inserted

を追記。
ハードディスクを無しにするため、522行目付近の

ata0-master: type=disk, mode=flat, path="30M.sample"

を#でコメントアウト。
542,543行目付近の

#boot: floppy
boot: disk



boot: floppy
#boot: disk

に変更してフロッピーからOSが起動するようにした。

Bochsの実行

$ bochs

でBochsを実行すると、

Please choose one: [6]

と尋ねられるので、Enterでbochsのシミュレーションをスタートさせる。bochsのシミュレーション用の画面が表示されたところでデバッグのブレイクがかかるので、コンソールでcを入力するとシミュレーションを続けられる。下の図はBochs上でFreeDOSが起動したところ。



2015年1月21日水曜日

wxMaximaで2次元球面のガウス曲率を計算する

前回の計算を発展させて2次元球面のガウス曲率を計算してみる。

本体で読み込むライブラリを作成する

前回と同様、2sphere.macが次の内容だとする。これを「c:\Users\username\Documents\maxima」フォルダ内に置く。

x(\theta,\phi):=r*sin(\theta)*cos(\phi)$
y(\theta,\phi):=r*sin(\theta)*sin(\phi)$
z(\theta,\phi):=r*cos(\theta)$

define(x1(\theta,\phi),diff(x(\theta,\phi),\theta))$
define(y1(\theta,\phi),diff(y(\theta,\phi),\theta))$
define(z1(\theta,\phi),diff(z(\theta,\phi),\theta))$

define(x2(\theta,\phi),diff(x(\theta,\phi),\phi))$
define(y2(\theta,\phi),diff(y(\theta,\phi),\phi))$
define(z2(\theta,\phi),diff(z(\theta,\phi),\phi))$

e1(\theta,\phi):=[x1(\theta,\phi),y1(\theta,\phi),z1(\theta,\phi)]$
e2(\theta,\phi):=[x2(\theta,\phi),y2(\theta,\phi),z2(\theta,\phi)]$

E(\theta,\phi):=trigsimp(e1(\theta,\phi).e1(\theta,\phi))$
F(\theta,\phi):=trigsimp(e1(\theta,\phi).e2(\theta,\phi))$
G(\theta,\phi):=trigsimp(e2(\theta,\phi).e2(\theta,\phi))$



また、3次元ベクトル空間でクロス積とベクトルの大きさを計算できるようにしたい。次の内容のvector3cross.macを作る。これを上のファイルと同じ「c:\Users\username\Documents\maxima」フォルダ内に置く。

cross(a,b):=[a[2]*b[3]-a[3]*b[2],a[3]*b[1]-a[1]*b[3],a[1]*b[2]-a[2]*b[1]]$
norm(v):=sqrt(v.v)$


ガウス曲率を計算する本体を作成する

最後に、ガウス曲率を計算する2sphere2.macを以下の内容で作成する。上で定義した2つのファイルを利用する。

?xchdir("c:/Users/username/Documents/maxima")$
batch("vector3cross.mac")$
batch("2sphere.mac")$

n(\theta,\phi):=trigsimp(cross(e1(\theta,\phi),e2(\theta,\phi)))$
e3(\theta,\phi):=n(\theta,\phi)/(sin(\theta)*r^2)$

define(x11(\theta,\phi),diff(x1(\theta,\phi),\theta))$
define(y11(\theta,\phi),diff(y1(\theta,\phi),\theta))$
define(z11(\theta,\phi),diff(z1(\theta,\phi),\theta))$

define(x12(\theta,\phi),diff(x1(\theta,\phi),\phi))$
define(y12(\theta,\phi),diff(y1(\theta,\phi),\phi))$
define(z12(\theta,\phi),diff(z1(\theta,\phi),\phi))$

define(x22(\theta,\phi),diff(x2(\theta,\phi),\phi))$
define(y22(\theta,\phi),diff(y2(\theta,\phi),\phi))$
define(z22(\theta,\phi),diff(z2(\theta,\phi),\phi))$

e11(\theta,\phi):=[x11(\theta,\phi),y11(\theta,\phi),z11(\theta,\phi)]$
e12(\theta,\phi):=[x12(\theta,\phi),y12(\theta,\phi),z12(\theta,\phi)]$
e22(\theta,\phi):=[x22(\theta,\phi),y22(\theta,\phi),z22(\theta,\phi)]$

L(\theta,\phi):=trigsimp(e11(\theta,\phi).e3(\theta,\phi))$
M(\theta,\phi):=trigsimp(e12(\theta,\phi).e3(\theta,\phi))$
N(\theta,\phi):=trigsimp(e22(\theta,\phi).e3(\theta,\phi))$

K(\theta,\phi):=trigsimp((L(\theta,\phi)*N(\theta,\phi)-M(\theta,\phi)^2)/(E(\theta,\phi)*G(\theta,\phi)-F(\theta,\phi)^2))$


実行と計算結果の確認方法

wxMaximaを起動して、「ファイル(F)」 > 「バッチファイル(B)」から、用意したバッチファイル(2sphere2.mac)を選ぶ。すると一連の計算が実行される。

計算したガウス曲率Kの値を見たいときは、読み込んだ後に
K(\theta,\phi);
と入力すれば(;の後はShift+Enterを入力する)、ガウス曲率の値が表示される。


本体ファイルの説明

?xchdir("c:/Users/username/Documents/maxima")$ は、カレントフォルダを変更する。Lisp で定義されている関数 xchdir を Maxima から呼び出して利用する

batch("vector3cross.mac")$
batch("2sphere.mac")$
は、最初に定義した2つのファイルをバッチファイルとして読み込んで実行する。