そのため、
Limboで特定のアプリケーションを作成し、それを別のマシンにインストールするか、インターネット経由で配布したいとします。 ほとんどの場合、このアプリケーションがインストールされる場所に
はOS Infernoがインストールされていません。 苦いですが、ありそうです。 :)何をする? OS Infernoを
インストールして構成するようにアプリケーションのユーザーをトレーニングしますか?
各アプリケーションのアーカイブにInferno(最大250 MB)の完全インストールを含めますか? いいえ、すべてがはるかに簡単です!
アプリケーションを実行するために必要な最小限にInfernoを削減する方法を見てみましょう。 これを行うには、
emu
起動時に何が起こるか(OS Infernoがどのようにロードするか)を把握する必要があります。
OS Infernoをダウンロード
emu
emu
は、OSカーネル、すべてのドライバー、および
Dis仮想マシンが既に含まれています。 起動時に、-rパラメーターを使用してOS Infernoルートディレクトリを転送する必要があります(
emu
自体はこのディレクトリ内にある必要はありません。したがって、1つの
emu
を複数の異なるOS Infernoインストール(異なるインストール済みアプリケーションおよびライブラリ)で使用できます)。
emu
、
emu
単に
/dis/emuinit.dis
実行し
/dis/emuinit.dis
(すべてのパスはOS Infernoルートディレクトリに関連しています)。これにより、システムが初期化され、
emu
パラメーターで渡されたアプリケーションまたはシェルが実行されます。 (Linuxカーネルは同じことをします。起動すると、単に制御を/ sbin / initに転送します。)
emuinitのソースを見ると、「システムの初期化」が非常に大きいことが
わかります。
最も単純化されたLinux初期化 。
以上です。 :)したがって、アプリケーションでOS Infernoのスタンドアロンインストールを取得するには、次のファイルとディレクトリで十分です。
- 任意のディレクトリにある
emu
自体。 emuinit.dis
ファイルがあるdis/
emuinit.dis
。- 必要な
emuinit.dis
ライブラリ( dis/lib/
サブディレクトリ内)。 - アプリケーションに必要なファイルとディレクトリ。
- アプリケーションに必要なライブラリ(同じ
dis/lib/
)。
例:Hello World
依存関係のない単純なアプリケーションから始めましょう。 これは:
implement HelloWorld; include "sys.m"; include "draw.m"; HelloWorld: module { init: fn(nil: ref Draw->Context, nil: list of string); }; init(nil: ref Draw->Context, nil: list of string) { sys := load Sys Sys->PATH; sys->print("Hello World!\n"); }
helloworld.b
に保存し、
limbo helloworld.b
を実行すると
helloworld.dis
が得られます。
; ls -l --rw-r--r-- U 0 powerman users 265 Oct 25 02:54 helloworld.b --rw-r--r-- U 0 powerman users 147 Oct 25 02:54 helloworld.dis
次に、依存関係を定義しましょう。
; disdep helloworld.dis ; disdep /dis/emuinit.dis /dis/lib/arg.dis /dis/sh.dis /dis/lib/bufio.dis /dis/lib/env.dis /dis/lib/readdir.dis /dis/lib/filepat.dis /dis/lib/string.dis
helloworld.dis
依存関係
helloworld.dis
ませんが、Sysモジュールを使用します。 実際、Sysを含むいくつかのメインモジュールはCで記述され、emuに直接組み込まれています。
emuinit.dis
多くの依存関係がありますが、直接的なものはargとshの2つだけです。 残りはshに必要です。 sh自体は、
emu
パラメーターですぐに起動する必要があるアプリケーションを指定しなかった場合にのみ必要です。 したがって、1つのargライブラリに制限できます。 行こう:
$ mkdir inferno-standalone $ mkdir inferno-standalone/dis $ mkdir inferno-standalone/dis/lib $ cd inferno-standalone/ $ SRC=/usr/local/inferno/ $ cp $SRC/Linux/386/bin/emu ./ $ cp $SRC/dis/emuinit.dis dis/ $ cp $SRC/dis/lib/arg.dis dis/lib/ $ cp $SRC/usr/powerman/helloworld.dis ./ $ ./emu -r. helloworld.dis Hello World! $
そのため、helloworldのスタンドアロンインストールがあり、Linuxを搭載した任意のシステムで動作する準備ができています(他のOSの場合、これらのOS用にコンパイルされたemuを取得するだけです)。 彼女の体重を見てみましょう。 (ところで、Linuxの
emu
はデフォルトでは削除されないため、大幅に削減できます。)
$ strip emu $ find -type f -printf "%8s %p\n" 1562504 ./emu 147 ./helloworld.dis 652 ./dis/lib/arg.dis 1518 ./dis/emuinit.dis
例:電卓
それでは、通常のアプリケーションを見てみましょう。 たとえば、標準のInfernoユーティリティに含まれている計算機。 ところで、彼は
非常に洗練されています。
; disdep /dis/calc.dis /dis/lib/arg.dis /dis/lib/bufio.dis /dis/lib/daytime.dis /dis/lib/string.dis /dis/lib/rand.dis $ cp $SRC/dis/calc.dis ./ $ cp $SRC/dis/lib/{bufio,daytime,string,rand}.dis dis/lib/ $ find -type f -printf "%8s %p\n" 32567 ./calc.dis 1562504 ./emu 147 ./helloworld.dis 4630 ./dis/lib/bufio.dis 652 ./dis/lib/arg.dis 209 ./dis/lib/rand.dis 4051 ./dis/lib/string.dis 4701 ./dis/lib/daytime.dis 1518 ./dis/emuinit.dis $ ./emu -r. calc.dis 1+2 3 exit $ ./emu -r. calc.dis 1+2 3 $
待って、emu自体の依存関係はどうですか?
はい、そのような瞬間があります。 別のマシンでemuを実行するには、必要なすべてのemuライブラリがそこになければなりません。 幸いなことに、ライブラリは2つしかありません。 残念ながら、両方ともXに関連しています-これらはlibX11とlibXextです。
基本的に、これらのライブラリは、Xorgを完全にドラッグすることなく、優れた方法でインストールされます。 Gentoo Linuxを搭載したサーバーにインストールする必要があるものは次のとおりです。
しかし、ネットワークアプリケーションサーバー(GUIを持たない)で作業するには、これらのライブラリは絶対に不要です。 結局のところ、アプリケーションが実行されているサーバーから
/prog/
ディレクトリをマウントするだけで、ワークステーションのグラフィカルデバッガーでこのアプリケーションをデバッグすることもできます。 この問題を解決するには、特別なバージョンの
emu
-
emu-g
を使用します。これはlibX11およびlibXextなしでビルドおよび動作します。
エミュー
emu-g
をビルドするには、実行する必要があります
mk CONF=emu-g install
その後、
emu-g
代わりに
emu-g
を実行できます(ちなみに、
emu-g
ストリップ後の重量は
emu-g
)。
$ emu-g ; pwd /usr/powerman ; wm/wm wm: cannot load $Draw: module not built-in ;
PS .tgzのディレクトリinferno-strandaloneには、
666 KBかかりました。 :-)
更新: emu-gに関する情報を追加しました。