Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 33:0915f0d49a23
...
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 31 Jan 2021 16:56:48 +0900 |
parents | d89b7d150b9f |
children | fad87973f26a |
files | paper/chapter/02-perl.tex paper/chapter/gears.tex paper/master_paper.pdf paper/master_paper.tex |
diffstat | 4 files changed, 55 insertions(+), 46 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/02-perl.tex Sun Jan 31 16:12:15 2021 +0900 +++ b/paper/chapter/02-perl.tex Sun Jan 31 16:56:48 2021 +0900 @@ -49,8 +49,15 @@ \end{itemize} これらのPerlスクリプトはプログラマが自分で動かすことはない。 -GearsOSでプログラミングする際は、ビルドしたいプロジェクトをCMakeLists.txtに記述し、 移行はCMakeのビルドフローに従う。 -CMakeはMakefileやbuild.ninjaを生成し実際にビルドはmakeやninja-buildが行う。 +GearsOSではビルドツールにCMakeを利用している。 +CMakeはautomakeなどのMakeファイルを作成するツールに相当するものである。 +GearsOSでプログラミングする際は、ビルドしたいプロジェクトをCMakeLists.txtに記述する。 +CMakeは自身がコンパイルをすることはなく、ビルドツールであるmakeやninja-buildに処理を移譲している。 +CMakeはmakeやninja-buildが実行可能なMakefile、 build.ninjaの生成までを担当する。 + +Perlスクリプトの実行手順はCMakeLists.txtに記述しており、 makeやninja-buildでのビルド時に呼び出される。(ソースコード \ref{src:cmake1}) + +\lstinputlisting[label=src:cmake1, caption=CMakeList.txt内でのPerlの実行部分]{src/cmakefile.txt.1} \begin{figure}[htp] \begin{center} @@ -64,53 +71,10 @@ \begin{center} \includegraphics[width=130mm]{drawio/old_generate_context.pdf} \end{center} - \caption{generate\_context.plの使用フロー} + \caption{generate\_context.plを使ったファイル生成} \label{fig:generate_context_1} \end{figure} -\section{pmake} -GearsOSをビルドする場合は、x86アーキテクチャのマシンからビルドするのが殆どである。 -この場合ビルドしたバイナリはx86向けのバイナリとなる。 -これはビルドをするホストマシンに導入されているCbCコンパイラがx86アーキテクチャ向けにビルドされたものである為である。 - -CbCコンパイラはGCCとllvm/clang上に構築した2種類が主力な処理系である。 -LVM/clangの場合はLLVM側でターゲットアーキテクチャを選択することが可能である。 -GCCの場合は最初からターゲットアーキテクチャを指定してコンパイラをビルドする必要がある。 - -時にマシンスペックの問題などから、 別のアーキテクチャ向けのバイナリを生成したいケースがある。 -教育用マイコンボードであるRaspberry Pi\cite{rpi}はARMアーキテクチャが搭載されている。 -Raspberry Pi上でGearsOSのビルドをする場合、 ARM用にビルドされたCbCコンパイラが必要となる。 -Raspberry Pi自体は非力なマシンであるため、 GearsOSのビルドはもとよりCbCコンパイラの構築をRaspberry Pi上でするのは困難である。 -マシンスペックが高めのx86マシンからARM用のバイナリをビルドして、 Raspberry Piに転送し実行したい。 -ホストマシンのアーキテクチャ以外のアーキテクチャ向けにコンパイルすることをクロスコンパイルと呼ぶ。 - - -GearsOSはビルドツールにCMakeを利用しているので、 CMakeでクロスコンパイル出来るように工夫をする必要がある。 -CMakeはautomakeなどのMakeファイルを作成するツールに相当するものである。 -CMake側の機能でビルドに使用できるコンパイラやリンカを自動探索し、 決定した上でMakefileやNinjaファイルを生成する。 -しかしCMakeは今ビルドしようとしている対象が、自分が動作しているアーキテクチャかそうでないか、クロスコンパイラとして使えるかなどはチェックしない。 -つまりCMakeが自動でクロスコンパイル対応のGCCコンパイラを探すことはない。 -その為そのままビルドするとx86用のバイナリが生成されてしまう。 - - -CMakeを利用してクロスコンパイルする場合、CMakeの実行時に引数でクロスコンパイラを明示的に指定する必要がある。 -この場合x86のマシンからARMのバイナリを出力する必要があり、 コンパイラやリンカーなどをARMのクロスコンパイル対応のものに指定する必要がある。 -また、 xv6の場合はリンク時に特定のリンカスクリプトを使う必要がある。 -これらのリンカスクリプトもCMake側に、 CMakeが提供しているリンカ用の特殊変数を使って自分で組み立てて渡す必要がある。 -このようなCMakeの処理を手打ちで行うことは難しいので、 \texttt{pmake.pl}を作成した。 -\texttt{pmake.pl}の処理の概要を図\ref{fig:pmake}に示す。 -\texttt{pmake.pl}はPerlスクリプトで、 シェルコマンドを内部で実行しクロスコンパイル用のオプションを組み立てる。 -\texttt{pmake.pl}を経由してCMakeを実行すると、 makeコマンドに対応するMakefile、 ninja-buildに対応するbuild.ninjaが生成される。 -以降はcmakeではなくmakeなどのビルドツールがビルドを行う。 - -\begin{figure}[htp] - \begin{center} - \includegraphics[width=160mm]{drawio/pmake.pdf} - \end{center} - \caption{pmake.plの処理フロー} - \label{fig:pmake} - \end{figure} - \section{GearsCbCのInterfaceの実装時の問題}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/chapter/gears.tex Sun Jan 31 16:56:48 2021 +0900 @@ -0,0 +1,44 @@ +\chapter{GearsOS} + +\section{pmake} +GearsOSをビルドする場合は、x86アーキテクチャのマシンからビルドするのが殆どである。 +この場合ビルドしたバイナリはx86向けのバイナリとなる。 +これはビルドをするホストマシンに導入されているCbCコンパイラがx86アーキテクチャ向けにビルドされたものである為である。 + +CbCコンパイラはGCCとllvm/clang上に構築した2種類が主力な処理系である。 +LVM/clangの場合はLLVM側でターゲットアーキテクチャを選択することが可能である。 +GCCの場合は最初からjターゲットアーキテクチャを指定してコンパイラをビルドする必要がある。 + +時にマシンスペックの問題などから、 別のアーキテクチャ向けのバイナリを生成したいケースがある。 +教育用マイコンボードであるRaspberry Pi\cite{rpi}はARMアーキテクチャが搭載されている。 +Raspberry Pi上でGearsOSのビルドをする場合、 ARM用にビルドされたCbCコンパイラが必要となる。 +Raspberry Pi自体は非力なマシンであるため、 GearsOSのビルドはもとよりCbCコンパイラの構築をRaspberry Pi上でするのは困難である。 +マシンスペックが高めのx86マシンからARM用のバイナリをビルドして、 Raspberry Piに転送し実行したい。 +ホストマシンのアーキテクチャ以外のアーキテクチャ向けにコンパイルすることをクロスコンパイルと呼ぶ。 + + +GearsOSはビルドツールにCMakeを利用しているので、 CMakeでクロスコンパイル出来るように工夫をする必要がある。 +ビルドに使用するコンパイラやリンカはCMakeが自動探索し、 決定した上でMakefileやNinjaファイルを生成する。 +しかしCMakeは今ビルドしようとしている対象が、自分が動作しているアーキテクチャかそうでないか、クロスコンパイラとして使えるかなどはチェックしない。 +つまりCMakeが自動でクロスコンパイル対応のGCCコンパイラを探すことはない。 +その為そのままビルドするとx86用のバイナリが生成されてしまう。 + + +CMakeを利用してクロスコンパイルする場合、CMakeの実行時に引数でクロスコンパイラを明示的に指定する必要がある。 +この場合x86のマシンからARMのバイナリを出力する必要があり、 コンパイラやリンカーなどをARMのクロスコンパイル対応のものに指定する必要がある。 +また、 xv6の場合はリンク時に特定のリンカスクリプトを使う必要がある。 +これらのリンカスクリプトもCMake側に、 CMakeが提供しているリンカ用の特殊変数を使って自分で組み立てて渡す必要がある。 +このようなCMakeの処理を手打ちで行うことは難しいので、 \texttt{pmake.pl}を作成した。 +\texttt{pmake.pl}の処理の概要を図\ref{fig:pmake}に示す。 +\texttt{pmake.pl}はPerlスクリプトで、 シェルコマンドを内部で実行しクロスコンパイル用のオプションを組み立てる。 +\texttt{pmake.pl}を経由してCMakeを実行すると、 makeコマンドに対応するMakefile、 ninja-buildに対応するbuild.ninjaが生成される。 +以降はcmakeではなくmakeなどのビルドツールがビルドを行う。 + +\begin{figure}[htp] + \begin{center} + \includegraphics[width=160mm]{drawio/pmake.pdf} + \end{center} + \caption{pmake.plの処理フロー} + \label{fig:pmake} + \end{figure} +
--- a/paper/master_paper.tex Sun Jan 31 16:12:15 2021 +0900 +++ b/paper/master_paper.tex Sun Jan 31 16:56:48 2021 +0900 @@ -96,6 +96,7 @@ %chapters \input{chapter/introduction.tex} \input{chapter/01-cbc.tex} +\input{chapter/gears.tex} \input{chapter/02-perl.tex} \input{chapter/02-interface.tex} \input{chapter/conclusion.tex}