# HG changeset patch # User anatofuz # Date 1611904695 -32400 # Node ID 69ab7cf9c1a1b1b616c2e3afbc8c8f9ea859f9d7 # Parent 36d24119450791e5e3c7c95ebaa16c0cdd44b355 ... diff -r 36d241194507 -r 69ab7cf9c1a1 paper/chapter/02-interface.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/chapter/02-interface.tex Fri Jan 29 16:18:15 2021 +0900 @@ -0,0 +1,31 @@ +\section{GearsOSのInterfaceの構文の改良} +GearsOSのInterfaceでは、 従来はDataGearとCodeGearを分離して記述していた。 +CodeGearの入出力をDataGearとして列挙する必要があった。 +CodeGearの入出力として\texttt{\_\_code()}の間に記述したDataGearの一覧と、Interface上部で記述したDataGearの集合が一致している必要がある。 + +従来の分離している記法の場合、 このDataGearの宣言が一致していないケースが多々発生した。 +またInterfaceの入力としてのDataGearではなく、 フィールド変数としてDataGearを使うようなプログラミングスタイルを取ってしまうケースも見られた。 +GearsOSでは、 DataGearやフィールド変数をオブジェクトに格納したい場合、 Interface側ではなくImpl側に変数を保存する必要がある。 +Interface側に記述してしまう原因は複数考えられる。 +GearsOSのプログラミングスタイルに慣れていないことも考えられるが、構文によるところも考えられる。 +CodeGearとDataGearはInterfaceの場合は密接な関係性にあるが、 分離して記述してしまうと「DataGearの集合」と「CodeGearの集合」を別個で捉えてしまう。 +あくまでInterfaceで定義するCodeGearとDataGearはInterfaceのAPIである。 +これをユーザーに強く意識させる必要がある。 + +golangにもInterfaceの機能が実装されている。 +golangの場合はInterfaceは関数の宣言部分のみを記述するルールになっている。 +変数名は含まれていても含まなくても問題ない。 + +\begin{lstlisting}[frame=lrbt,label=src:golang_interface,caption={golangのinterface宣言}] +type geometry interface { + area() float64 + perim() float64 +} +\end{lstlisting} + + +\section{メタ計算部分の入れ替え} +GearsOSでは次のCodeGearに移行する前のMetaCodeGearとして、 デフォルトでは\texttt{\_\_code meta}が使われている。 +このCodeGearはcontextに含まれているCodeGearの関数ポインタを、 enumからディスパッチして次のStub CodeGearに継続するものである。 + +このメタ計算部分を独自で定義したCodeGearに差し替えたいケースが存在する。 diff -r 36d241194507 -r 69ab7cf9c1a1 paper/chapter/02-perl.tex --- a/paper/chapter/02-perl.tex Thu Jan 28 20:47:08 2021 +0900 +++ b/paper/chapter/02-perl.tex Fri Jan 29 16:18:15 2021 +0900 @@ -61,9 +61,31 @@ GearsOSはビルドツールにCMakeを利用しているので、 CMakeでクロスコンパイル出来るように工夫をする必要がある。 -CMake自身が実行タイミングでコンパイラを特定し 実行する処理になっている。 -自動でクロスコンパイル対応のGCCコンパイラは探してくれない為に、CMakeの実行時に引数でクロスコンパイラを具体的に指定する必要がある。 +CMakeはautomakeなどのMakeファイルを作成するツールに相当するものである。 +CMake側の機能でビルドに使用できるコンパイラやリンカを自動探索し、 決定した上でMakefileやNinjaファイルを生成する。 +しかしCMakeは今ビルドしようとしている対象が、自分が動作しているアーキテクチャかそうでないか、クロスコンパイラとして使えるかなどはチェックしない。 +つまりCMakeが自動でクロスコンパイル対応のGCCコンパイラを探すことはない。 +その為そのままビルドするとx86用のバイナリが生成されてしまう。 + + +CMakeを利用してクロスコンパイルする場合、CMakeの実行時に引数でクロスコンパイラを明示的に指定する必要がある。 この場合x86のマシンからARMのバイナリを出力する必要があり、 コンパイラやリンカーなどをARMのクロスコンパイル対応のものに指定する必要がある。 +また、 xv6の場合はOSであるためにリンク時に特定のリンカスクリプトを使う必要がある。 +これらのリンカスクリプトもCMake側に、 CMakeが提供しているリンカ用の特殊変数を使って自分で組み立てて渡す必要がある。 +このようなCMakeの処理を手打ちで行うことは難しいので、 \texttt{pmake.pl}を作成した。 +\texttt{pmake.pl}の処理フローを図\ref{fig:pmake}に示す。 +\texttt{pmake.pl}はPerlスクリプトで、 シェルコマンドを内部で実行しクロスコンパイル用のオプションを組み立てる。 + +\begin{figure}[htp] + \begin{center} + \includegraphics[width=160mm]{drawio/pmake.pdf} + \end{center} + \caption{pmake.plの処理フロー} + \label{fig:pmake} + \end{figure} + + + \section{GearsCbCのInterfaceの実装時の問題} Interfaceとそれを実装するImplの型が決定すると、最低限満たすべきCodeGearのAPIは一意に決定する。 diff -r 36d241194507 -r 69ab7cf9c1a1 paper/drawio/pmake.pdf Binary file paper/drawio/pmake.pdf has changed diff -r 36d241194507 -r 69ab7cf9c1a1 paper/drawio/pmake.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/drawio/pmake.svg Fri Jan 29 16:18:15 2021 +0900 @@ -0,0 +1,3 @@ + + +
pmake.pl
pmake.pl
cmake
cmake
CbC ARM
Cross Compiler
CbC ARM...
ARM Library
ARM Library
linker script
linker script
1. search use arm tool
1. search use arm tool
2. generate cmake option & execute cmake
2. generate cmake option & execute...
Makefile
Makefile
build.ninja
build.ninja
3. generate build file
3. generate build file
Viewer does not support full SVG 1.1
\ No newline at end of file diff -r 36d241194507 -r 69ab7cf9c1a1 paper/drawio/pmake.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/drawio/pmake.xml Fri Jan 29 16:18:15 2021 +0900 @@ -0,0 +1,1 @@ +5ZlbU6MwFMc/DY92IOHSPmp119nVmR2d2ctjCilEA2FDsHQ//SYQCrRo64Uy6kshJxeS/M7551AMOI+Lrxyl0TULMDWAGRQGPDcAsKBly4uyrCuL51qVIeQk0I0awy35h7XR1NacBDjrNBSMUUHSrtFnSYJ90bEhztmq22zJaPepKQrxjuHWR3TX+osEIqqsU+A19ktMwqh+suXOqpoY1Y31SrIIBWzVMsELA845Y6K6i4s5pmrz6n2p+n15pHYzMY4TcUiHGbzx7EVhh/G3PHMZvbz8/vNkqucm1vWCOcuTAKs+pgHPGBcRC1mC6BVjqTRa0niHhVhrVCgXTJoiEVNdiwsifqvuE8/RxT96NHV/XrQL67qQCL7+3S6UfSZOXWy6laW6XyY4u9+QgdJSLQgHO1ibfdKmjOXcx09sTu1viIdYPNEObmjKMMAsxnKGsh/HFAny0J0H0v4Ybto1yOSNpvYMgrMdgmrtt7qYsERezoaCan1cqM6YUGv1OxrVTwLVHRUqOCpUq4W0AdwPdRdOgLKonIU1DikwKqlq3AdEc/0kA7hUTvdsyeSC2wjdvzmrK06yksmpbCA3p2gq5V2ormmM7vEkpfVocnLVgFX1nrN4FRGBb1NU7u9Kpltd7o8F2APmAhdPg9vdaN1hqoVIZ2/A0eVVkwtZdYITtfIg1xwKjTteEL1IF8E+YexEWn8g/kBCYJ6UbYBpv21EggMjssrkRwtJbzTuw5yHz8YORsI+aiIEXq3E1qxPiX2lxIfKsJynfN3E+yUYZWn1DrokhWI7jCY7YEuUrR5Rhs6uKG+Mb44Jvh6T24dpvpDzMU9vruvhFnxTxVmWyco5i1NCMX8/Zyqwu/w2B+hoh6ozEL4SnHlFFhypWW4jfL/IYF/IHRWZOxAySpJ7FUxm5nOSio8EzbbHhma9/sWin5o1UX0x4n4kb3J5Vql/P2Oj+rP0UGRyq0UflzmjjDdJ1pJQumVClIQqT/ElGuk98EyBIz6ip7oiJkFAHztBu67yBuStLYF1nV3w0x7wcDDw+w7Ibmwd7AzTPmcAyhlCnGCOhHIEneuYLBWEJYbyeBfFauOrX5VRFtjP240fcZiXisGH8axtTenLvUD9zaPtWt5grmW/XlN63ehaOoIEcnCWPL7ge6bXjftZT9wfV/DfILPy+uAsckKDSUKSO/R++UBv9AN5ekRdhlu6XDKU1yeD7NMrru1spd7T4RRXFpvvsWVd66s2vPgP \ No newline at end of file diff -r 36d241194507 -r 69ab7cf9c1a1 paper/master_paper.pdf Binary file paper/master_paper.pdf has changed