annotate paper/chapter/03-gears.tex @ 55:76eee6847726

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 02 Feb 2021 12:23:46 +0900
parents 66b32f3ec7fa
children 69e341226e5a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{GearsOS}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
34
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
3 GearsOSとはContinuation Based Cを用いて実装しているOSプロジェクトである。
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
4 CodeGearとDataGearを基本単位として実行する。
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
5 GearsOSはOSとして実行する側面と、 CbCのシンタックスを拡張した言語フレームワークとしての側面がある。
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
6
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
7 \section{GearsOSのビルドシステム}
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
8 GearsOSではビルドツールにCMakeを利用している。
35
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
9 ビルドフローを図\ref{fig:gearsbuild1}に示す。
34
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
10 CMakeはautomakeなどのMakeファイルを作成するツールに相当するものである。
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
11 GearsOSでプログラミングする際は、ビルドしたいプロジェクトをCMakeLists.txtに記述する。
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
12 CMakeは自身がコンパイルをすることはなく、ビルドツールであるmakeやninja-buildに処理を移譲している。
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
13 CMakeはmakeやninja-buildが実行可能なMakefile、 build.ninjaの生成までを担当する。
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
14
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
15
35
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
16 GearsOSのビルドでは直接CbCコンパイラがソースコードをコンパイルすることはなく、 間にPerlスクリプトが2種類実行される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
17 Perlスクリプトはビルド対象のGearsOSで拡張されたCbCファイルを、純粋なCbCファイルに変換する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
18 ほかにGearsOSで動作する例題ごとに必要な初期化関数なども生成する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
19 Perlスクリプトで変換されたCbCファイルなどをもとにCbCコンパイラがコンパイルを行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
20 ビルドの処理は自動化されており、 CMake経由でmakeやninjaコマンドを用いてビルドする。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
22 \begin{figure}[hp]
34
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
23 \begin{center}
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
24 \includegraphics[width=120mm]{drawio/geasflow1.pdf}
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
25 \end{center}
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
26 \caption{GearsOSのビルドフロー}
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
27 \label{fig:gearsbuild1}
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
28 \end{figure}
fad87973f26a add gears flow
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 33
diff changeset
29
33
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 \section{pmake}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 GearsOSをビルドする場合は、x86アーキテクチャのマシンからビルドするのが殆どである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 この場合ビルドしたバイナリはx86向けのバイナリとなる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 これはビルドをするホストマシンに導入されているCbCコンパイラがx86アーキテクチャ向けにビルドされたものである為である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 CbCコンパイラはGCCとllvm/clang上に構築した2種類が主力な処理系である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 LVM/clangの場合はLLVM側でターゲットアーキテクチャを選択することが可能である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 GCCの場合は最初からjターゲットアーキテクチャを指定してコンパイラをビルドする必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 時にマシンスペックの問題などから、 別のアーキテクチャ向けのバイナリを生成したいケースがある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 教育用マイコンボードであるRaspberry Pi\cite{rpi}はARMアーキテクチャが搭載されている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 Raspberry Pi上でGearsOSのビルドをする場合、 ARM用にビルドされたCbCコンパイラが必要となる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 Raspberry Pi自体は非力なマシンであるため、 GearsOSのビルドはもとよりCbCコンパイラの構築をRaspberry Pi上でするのは困難である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 マシンスペックが高めのx86マシンからARM用のバイナリをビルドして、 Raspberry Piに転送し実行したい。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 ホストマシンのアーキテクチャ以外のアーキテクチャ向けにコンパイルすることをクロスコンパイルと呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 GearsOSはビルドツールにCMakeを利用しているので、 CMakeでクロスコンパイル出来るように工夫をする必要がある。
35
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
48 ビルドに使用するコンパイラやリンカはCMakeが自動探索し、 決定した上でMakefileやbuild.ninjaファイルを生成する。
33
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 しかしCMakeは今ビルドしようとしている対象が、自分が動作しているアーキテクチャかそうでないか、クロスコンパイラとして使えるかなどはチェックしない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 つまりCMakeが自動でクロスコンパイル対応のGCCコンパイラを探すことはない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 その為そのままビルドするとx86用のバイナリが生成されてしまう。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 CMakeを利用してクロスコンパイルする場合、CMakeの実行時に引数でクロスコンパイラを明示的に指定する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 この場合x86のマシンからARMのバイナリを出力する必要があり、 コンパイラやリンカーなどをARMのクロスコンパイル対応のものに指定する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 また、 xv6の場合はリンク時に特定のリンカスクリプトを使う必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 これらのリンカスクリプトもCMake側に、 CMakeが提供しているリンカ用の特殊変数を使って自分で組み立てて渡す必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 このようなCMakeの処理を手打ちで行うことは難しいので、 \texttt{pmake.pl}を作成した。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 \texttt{pmake.pl}の処理の概要を図\ref{fig:pmake}に示す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 \texttt{pmake.pl}はPerlスクリプトで、 シェルコマンドを内部で実行しクロスコンパイル用のオプションを組み立てる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 \texttt{pmake.pl}を経由してCMakeを実行すると、 makeコマンドに対応するMakefile、 ninja-buildに対応するbuild.ninjaが生成される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 以降はcmakeではなくmakeなどのビルドツールがビルドを行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
35
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 34
diff changeset
64 \begin{figure}[h]
33
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 \begin{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 \includegraphics[width=160mm]{drawio/pmake.pdf}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 \end{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 \caption{pmake.plの処理フロー}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 \label{fig:pmake}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 \end{figure}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
72
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
73
36
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
74
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
75 \section{Interfaceの取り扱い方法の検討}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
76
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
77 GearsOSのInterfaceはモジュール化の仕組みと\texttt{goto}文での引数の一時保管場所としての機能を持っている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
78 InterfaceのImplementのヘッダーファイルを実装したことで、 GearsOS上でInterfaceを実装する際に新たな方法での実装を検討した。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
79 ImplementのCodeGearは今まではInterfaceで定義したCodeGearと1対1対応していた。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
80 ImplementのCodeGearからgotoする先は、 入力として与えられたCodeGearか、 Implement内で独自に定義したCodeGearにgotoするケースとなっていた。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
81 後者の独自に定義したCodeGearにgotoするケースも、 実装のCbCファイルの中に記述されているCodeGearに遷移していた。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
82
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
83 GearsOSを用いてxv6 OSを再実装した際に、 実装側のCodeGearを細かく別けて記述した。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
84 細分化によって1つのCbCファイルあたりのCodeGearの記述量が増えてしまうという問題が発生した。
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
85 見通しをよくする為に、 Interfaceで定義したCodeGearと直接対応するCodeGearの実装と、 それらからgotoするCodeGearで実装ファイルを分離することを試みた。