LoginSignup
19
18

More than 5 years have passed since last update.

OCaml with MirageでXen/EC2上で動くOSを作る

Last updated at Posted at 2013-02-12

Mirageを使うと、OCamlでXenやEC2の上で動くOSを作ることができる。

スタブライブラリも用意されているので、Linux、 MacOS Xのような普通のOSで開発して、その後、Xen/EC2上で動くカーネルにコンパイルできる。

http://openmirage.org によると、通常のソフトウェアよりも、より安価に、セキュアに、より詳細な制御が利点です。

前提

  • Debian squeeze (x64)
  • Xen Server 6.1

x64は必須らしい。

OCaml 4.00.1 の インストール

3.12.1以降がapt-getで入るなら、そちらでもOK。

まずは、依存ライブラリをインストールする。

$ sudo apt-get build-dep ocaml
$ sudo aptitude install git

その後、OCaml 4.00.1をインストールする。

$ wget http://caml.inria.fr/pub/distrib/ocaml-4.00/ocaml-4.00.1.tar.gz
$ tar xvzf ocaml-4.00.1.tar.gz
$ cd ocaml-4.00.1
$ ./configure
$ make world.opt
$ sudo make install

OPAMのインストール

http://github.com/OCamlPro/opam からOPAMをインストールする。

$ wget https://raw.github.com/OCamlPro/opam/master/shell/install.sh && sh ./install.sh
$ opam init
$ echo 'eval `opam config env`' >> ~/.profile

Mirage-unixのインストール

$ opam switch 4.00.1+mirage-unix
$ eval `opam env`
$ opam install mirage

lwt_unixが不足しているせいで、ビルドががうまくいかない場合は以下を試す。

$ opam install ocamlfind lwt base-bigarray base-threads base-unix

Mirage-xenのインストール

$ opam switch 4.00.1+mirage-xen
$ eval `opam env`
$ opam install ocamlfind lwt
$ opam install mirage

lwtのビルドがうまくいかない場合は以下を試す。

$ opam remove base-threads base-unix

Unixでの開発/実行

$ git clone git://github.com/mirage/mirage-skeleton.git
$ cd mirage-skelton/basic
$ opam switch 4.00.1+mirage-unix
$ eval `opam config env`
$ make

実行すると、hello worldが2秒ごとに表示される。

$ ./hello.native 
hello
world
hello
world
…

ソースコードはこんな感じ。

let main () =
  for_lwt i = 0 to 10 do
    print_endline "hello";
    lwt () = OS.Time.sleep 2.0 in
    print_endline "world";
    Lwt.return ()
 done

let _ =
  OS.Main.run (main ())

Xenでの実行

$ opam switch 4.00.1+mirage-xen
$ eval `opam config env`
$ make clean

_build/hello.xen が生成される。これをXenでロードするために、以下のようなhello.cfg を準備する。

name="hello"
memory=128
kernel="hello.xen"

起動する。

# ls
hello.cfg hello.xen
# xl create hello.cfg

consoleを表示させるとhello worldが表示されているのが分かる。

# xl console hello            
kernel.c: Mirage OS!
kernel.c:   start_info: 0x1136000(VA)
kernel.c:     nr_pages: 0x8000
kernel.c:   shared_inf: 0x23f8d000(MA)
kernel.c:      pt_base: 0x1139000(VA)
kernel.c: nr_pt_frames: 0xd
kernel.c:     mfn_list: 0x10f6000(VA)
kernel.c:    mod_start: 0x0(VA)
kernel.c:      mod_len: 0
kernel.c:        flags: 0x0
kernel.c:     cmd_line: 
x86_setup.c:   stack:      0xedc60-0x8edc60
mm.c: MM: Init
x86_mm.c:       _text: 0x0(VA)
x86_mm.c:      _etext: 0x8295f(VA)
x86_mm.c:    _erodata: 0xa0000(VA)
x86_mm.c:      _edata: 0xd73e8(VA)
x86_mm.c: stack start: 0xedc60(VA)
x86_mm.c:        _end: 0x10f6000(VA)
x86_mm.c:   start_pfn: 1149
x86_mm.c:     max_pfn: 8000
x86_mm.c: Mapping memory range 0x1400000 - 0x8000000
hello
Devices: [Xen.Blkif] provider start
world
hello
world
…

参考ドキュメント

19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18