ここではVMX root modeのring3 で動作する process (保護ドメイン)で使えるシステムコールとライブラリを簡単に紹介したいと思います.
システムコール
保護ドメインはいわゆるユーザランドですので,システムコールがあります.ユーザから使えるインタフェースとしてはprocess/lib/lib_syscalls.cで定義されています.以下の14種類があります,
#define SYS_NOP 1
#define SYS_MSGSETFUNC 3
#define SYS_MSGREGISTER 4
#define SYS_MSGOPEN 5
#define SYS_MSGCLOSE 6
#define SYS_MSGSENDINT 7
#define SYS_MSGRET 8
#define SYS_MSGSENDDESC 9
#define SYS_NEWPROCESS 10
#define SYS_MSGSENDBUF 11
#define SYS_MSGUNREGISTER 12
#define SYS_EXITPROCESS 13
#define SYS_SETLIMIT 14
なんだか数が少なくて,また大部分をSYS_MSG_*
というものが占めていてこれでいいの? と思う方がいるかもしれません.しかしBitVisorの本体 (ring0で動作する部分) は別に一般のOSとして機能しているわけではなく,process自体はあくまで本体と独立して動作することが一つの目的であるのでこれでいいのです.
といってもBitVisor本体とやりとりしなければ入出力などはできません.そこで登場するのが SYS_MSG_*
で定義されるシステムコールを利用したメッセージパッシングです.メッセージパッシングの仕組みを利用すると,threadやprocess間でコールバック関数を利用したデータのやりとり及び処理ができるようになります.これによってprocessからBitVisor本体を呼び出して入出力をおこなったり,また逆にBitVisor本体からメッセージパッシングによってprocessの処理を実行することができます.process/以下にあるいくつかのプログラムを見てみると,どのように利用するのかのイメージがつくと思います.
メッセージパッシングの実装に関しては以下に記事があります.
- deep_tkkn, BitVisor の保護ドメインとのI/F のお話, Qiita, BitVisor Advent Calendar 2016
ライブラリ
process/lib 以下にはシステムコール意外にも,processを作成する際に利用できるライブラリがいくつかあります. printf()
系の関数や,簡単なメモリアロケータ,文字列処理の関数などがあるのでprocessを作成する際は一度確認してみるといいでしょう.
もしこれ以外のライブラリを利用したい場合は,process側に移植するか,あるいはBitVisor本体側に移植してメッセージパッシングで利用することになります.