[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 3343] 4つのディレクトリ.



  こんにちは、川合です。


I.Tak. さんは 2002/03/03 14:04:26 の「[OSASK 3340] Pioneer0リフ
ァレンス」で書きました:

> pioneer0のコマンドリファレンスを書いてしまいました。
>全てのコマンドを網羅し、可能な限り使い方を説明してみました。

  すごいです!

  しかもいちいち手抜き個所が指摘されているあたりが、プレミアかも
しれません。

  僕のページから、このドキュメントへのリンクをはってもいいでしょ
うか?

---

  それで、どこだったのか忘れてしまいましたが、「ファイル領域」と
いう言い方はOSASKとしては不適切で、「モジュールマッピング領域」
とすべきだという趣旨の記述があったように思います。そのとおりです
。僕自身がこんがらがっていました。そういう意味で、bim2binの指定
は、file:ではなく、mmarea:であるべきです。次のバージョンではそう
したいと思っています(互換性のこともあるので、両方通るようにした
いです)。

---

  さて、I.Tak.さんはいろんなところに「なぞ」を提示してくださいま
したが、非常に重要だと思われる1つのなぞについてここで説明してお
きます。

  それは、モジュールハンドル初期化(cmd:0x00a0)に関してです。

  このファンクションでは、optによって、4つのディレクトリが選べま
す。

    0x0004 : タスク・アプリディレクトリ
    0x0008 : ユーザー・アプリディレクトリ
    0x000c : マシン・アプリディレクトリ
    0x0010 : ネットワーク・アプリディレクトリ

  なお、OSASK ver.2.2では、このうち0x0008と0x000cしか公式サポー
トしていません。

  これらのディレクトリの概念的なことは、[OSASK 1640]を読んでいた
だくことにして、ここではもっと具体的に行きましょう。

  OSASK以外の一般的なOSでは、アプリケーションはディレクトリ内を
自由に動いて好きなファイルへアクセスできます。これは、実は危険な
ことです。というのは、基本的にアプリの挙動は信用できません。いつ
なんどき、大切なファイルをいじったり、読み取ったりするかわかりま
せん。

  UNIXなどではこれを解決するために、ファイルにpermitionという属
性を設けました(スペル自信なし)。これにより貴重なファイルが不用
意に持ち出されることはなくなったでしょう。

  OSASKでは、もちろんpermitionもサポートしますが、それよりももっ
と強烈な方法でこの問題の解決を図りました。それが、上記4つのディ
レクトリです。

  たとえば、適当なアプリをインストールした状況を考えてください。
このアプリは複数のファイルから構成され(背景画や面データーなど)
、MS-DOSの世界ではこれらのファイルはカレントディレクトリにおかれ
ているというのが一般的です。Windowsなどでは、このインストールさ
れたディレクトリへのパスをレジストリにメモしておいたりします。

  OSASKでは、これらをマシン・アプリディレクトリに置きます。です
からこれを「インストールディレクトリ」と読み替えてもいいです。

  さて想定しているアプリケーションが、RPGゲームなどで、セーブデ
ーターを持っているとしましょう。このセーブデーターはどこに保存す
るべきでしょうか?・・・もちろん、DOSなどではこれらもインストー
ルディレクトリにしまわれるのが普通でしょう。しかしもしそうだとし
たら、僕は弟がセーブしたデーターをロードすることができます。・・
・もちろんこれもpermitionで妨害することもできますが、しかしセー
ブファイルをいくつもっているかとか、セーブ日は何月何日なのかなど
、そういうことはばれてしまいます。

  こういうときのために、ユーザー・アプリディレクトリがあります。
これは一般的にマシン・アプリディレクトリとは別のディレクトリで、
僕がこのゲームを起動したときと、弟がこのゲームを起動したときとで
は異なるディレクトリが割り振られます。・・・つまり、このディレク
トリを積極的に使うことで、アプリケーションはあっさりとマルチユー
ザー対応になります。セーブが3個所しかできないゲームがあったとし
ても、弟のせいでセーブが1つしかできない、なんてことはなくなるわ
けです。

  TEDIC00.INIのような設定ファイルなども、ユーザー・アプリディレ
クトリに入れておくべきです。そうすれば、ユーザーごとに違った設定
ができることになります。

  タスク・アプリディレクトリは、タスクごとに割り振られるディレク
トリでテンポラリファイルなどを置きます。そして、ネットワーク・ア
プリディレクトリは、アクセスカウンターのカウント値の保持などに使
うためのもので、原理的には世界にただ一つのディレクトリです。

  これらは、アプリごとに用意されます。つまり、アプリAのマシン・
アプリディレクトリはアプリBのマシン・アプリディレクトリとは別の
ディレクトリです。ユーザー・アプリディレクトリもアプリごとに別々
です。ネットワーク・アプリディレクトリももちろん別々です。これら
はすべてシェルによって管理されています。

  OSASKの思想では、アプリケーションのモジュールアクセス(ファイ
ルアクセス)を、この4つのディレクトリに閉じ込めることが目標です
。これで各アプリの独立性は僕の満足のいくレベルに達します。それゆ
え、これらのディレクトリはなんらかのディレクトリのサブディレクト
リなんですが、親ディレクトリに戻ろうとするような行為はすべてエラ
ーにされます(サブディレクトリを作ってその中を行き来するのは構わ
ない)。

  しかしこの方法だけにしてしまうと、アプリAで作ったテキストモジ
ュールをアプリBから読む方法がなくなってしまいます。そこで、オプ
ション0x00e0が出てきます。・・・これはおなじみのファイルセレクタ
が出てくるファンクションです。

  このファイルセレクタは、シェルの管理のもとで行われるため、先の
4つのディレクトリに縛られることなく、どこでもアクセスできます。
しかしこのファンクションで与えられたファイルの中身にアクセスする
以上のことは、アプリからはできません(例外はディレクトリが与えら
れたときで、この時は配下のディレクトリパスを自由にたどることはで
きる・・・しかし一般に、親ディレクトリへはいけない)。

  もちろん、このファイルセレクタで、ファイルシステム上のルートデ
ィレクトリを指定すれば、結果的にそのアプリはすべてのモジュールに
アクセスできることになるでしょう。そういうことがしたければ、ドキ
ュメントに「最初のファイルセレクタ(num = 1)で、ルートを指定して
ください」と記述しておくことになります。・・・あとはユーザーがそ
のアプリを信じる気になるかどうかです。僕は、ソースが公開されてい
なければ信じることはないですが。だからいかにもルートそっくりなデ
ィレクトリ構造を作って(エイリアスだらけで構築されているが、もち
ろん重要なモジュールへのエイリアスは置かない)、そのトップを指定
して様子を見るでしょう。

  ・・・しかし今のところは、ディレクトリといえば一つしかなく、全
部ディスクのルートディレクトリです。これはファイルシステムやシェ
ルが未完成のせいです。だんだん改善されていくでしょう。ですから、
今からその意味を踏まえて、上記の4つを(今は2つだけですが)使い分
けていただきたいです。

  このルールは、もちろんCUIアプリにも適用されます。コマンドライ
ン行のすべてがそのままアプリに渡されるということはなく、そのまま
slotに割り当てられるか、エイリアス名に置き換えられてエイリアスモ
ジュールがタスクディレクトリ内に置かれるかのどちらかになります。

  この仕組みから察していただけると思いますが、アプリケーション内
でユーザーから入力してもらってその文字列をモジュールパスとしてオ
ープンする場合、基本的にはこの4つのディレクトリ外のものは指定で
きません。・・・これをやりたい場合は、先の方法でルートディレクト
リをもらうか、ファイルセレクタ部分をDLLとして独立させシェルから
特別な権限をもらわなければいけません(独立させないで、そのアプリ
全体に権限を与えるという方法もある)。ユーザーが、「こんなDLLや
アプリに権限なんか与えたくないね」って思ったら、アウトですが。

---

  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/