- OSASKにおけるシステムコール(API-CALL)
- こめんと欄
OSASKにおけるシステムコール(API-CALL) [1]
- 既存のさまざまなOSは、それぞれにアプリケーションを書くことができて、アプリからOSを呼び出すことができる。ここではその呼び出し方について記述する。
- まず代表的な方法を記述しておくと、こんな感じだろうと思われる。
- ソフトウェア割り込み(INT命令):「はりぼてOS」やLinuxがこの方式
- near-CALL:win32がこの方式
- 何らかの方法で例外を起こさせる:
- コールゲート:
- sysenter:
- 第一世代OSASKを作るに当たっては、これらの方法を検討した。まずnear-CALL案はかなりはやく消えた。なぜなら、結局アプリからシステムコールした以上は、どこかのタイミングでCPL=0に入る必要があり、だからアプリからAPIを叩いたときにすぐにCPL=0に移行するのが一石二鳥でいいと思えたのだ。
- sysenterに関しては386で利用できない命令なので、OSASKでは使わない。
- 例外方式は遅そうなのでボツ。
- ソフトウェアINTは、APIブリッジが構築しにくいだろうということで捨てた。IDTはシステム全体に対して一つだけど、LDTはタスクの数だけある。そうすると、タスクごとに異なる設定にできるのはLDTのほうで、だからLDT上のコールゲートを使うのがいいと考えたのだ。APIブリッジとは、APIのリダイレクトというか、API-CALLを横取りしてエミュレーションするようなものである。このとき、タスクによって横取りするかしないか、もしくは横取り後の処理の仕方をタスクごとに変えたいなど、そういうことをするにはIDT上のベクタを使うわけには行かなかったのである。
- そんなわけで、第一世代OSASKでは、LDT上のコールゲートを呼ぶことがシステムコールだった。
- 第二世代OSASKでは、全く別の観点からどうするかを考えた。第二世代OSASKのアプリケーションは、efg01等によって、ほぼ全てのx86のOS上で実行可能になることを最優先で設計した。さらにefg01はアプリケーションとして記述可能で、ドライバなどの支援は極力あてにしないことにした(そうでないとefg01の移植が困難になる恐れがある)。
- そうすると、win32やLinux上ではセグメンテーションを活用したプログラミングはほとんど期待できないし、ましてLDTなどをアプリケーションが設定できる期待も持てないので、第一世代OSASKのやり方は使えない。IDTの設定もアプリからできるなんて期待できないので、ソフトウェア割り込みもボツ、例外もボツ。・・・こうしてnear-CALLだけが残った。
- そんなわけで、第二世代OSASKでは、起動時に教えられたアドレスへnear-CALLすることがシステムコールとなっている。
Last-modified: 2009-11-21 (土) 00:00:00 (JST) (319d) by k-tan
Links list
(This host) = http://osask.net
- (This host)/modules/osaskwiki/441.html#he34a2b4
- (This host)/modules/osaskwiki/446.html
- (This host)/modules/osaskwiki/144.html
- (This host)/modules/osaskwiki/441.html#db01b6b9
- (This host)/modules/osaskwiki/441.html#h55e5146
- (This host)/modules/osaskwiki/441.html#t0806dad