Mercurial > hg > Papers > 2018 > tobaru-thesis
comparison slide/thesis.md @ 7:79fb933328ec default tip
slide
author | tobaru |
---|---|
date | Thu, 22 Feb 2018 12:20:52 +0900 |
parents | 3a99fc0296ce |
children |
comparison
equal
deleted
inserted
replaced
6:3a99fc0296ce | 7:79fb933328ec |
---|---|
1 title:Gears OS on Raspberry Pi | 1 title:Gears OS on Raspberry Pi |
2 author:Yu Tobaru | 2 author:河野研 桃原優 |
3 profile: | 3 profile: |
4 | 4 |
5 # Raspberry Pi 上での Gears OS | 5 # Raspberry Pi 上での Gears OS |
6 - 本研究室では Code Segment と Data Segment という単位でプログラムを記述する CbC(Continuation base C) とCbC を用いて実装する Gears OS の研究を行っている。 | 6 - 本研究室ではCbC(Continuation base C)言語を用いて実装する Gears OS の研究を行っている。 |
7 - Code Segment は並列処理の単位として利用でき、Data Segment はデータそのもので型を持っていて、CbC はメタレベルの処理、並列処理を記述することができる。 | |
8 - メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理を記述 することができる。 | |
9 - 本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi で Gears OS を動かせるようになる事で、ハードウェア上でもメタレベルの処理、並列実行ができるプログラミングを記述できるようになる事を目指している。 | 7 - 本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi で Gears OS を動かせるようになる事で、ハードウェア上でもメタレベルの処理、並列実行ができるプログラミングを記述できるようになる事を目指している。 |
10 | 8 - メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理を記述 することができる。 |
11 # 実装までの流れ | 9 |
12 - RaspberryPi上にGearsOSを実装するために、まずはCbCコンパイラをRaspberryPi(ARM)用に作成する | 10 # スライドの流れ |
13 - その後に、CbCをを使ってxv6というOSを参考にRaspberryPiで動くGearsOSを作る | 11 - RaspberryPi上でのGearsOSの実装 |
14 - xv6 とは ANIX V6 とい う OS を ANSI-C に書き換え、x86 に移植した OS である。xv6 は Raspberry Pi で動かす事ができる。 | 12 - RaspberryPi上でのCbCのmake |
15 | 13 - make時間の比較 |
16 | 14 - OSX上でのCbCのCrossCompile |
17 # RaspberryPi上でCbCのmake | 15 - Linux上でのCbCのCrossCompile |
18 - Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC を make することができない。 | 16 - ARM版xv6をKVMで立ち上げる |
19 - Raspberry Pi 3 だとメモリは 1GB あり CbC を make できるが、時間がかかる。 | 17 |
20 - make 時間の比較として研究室のメモリ 16GB のサーバ(firefly) と学科のサーバの一つ で Linux 環境であるメモリ 756GB の Dell PowerEdge630(DALMORE)を用いる。 | 18 # RaspberryPi上でのGearsOSの実装 |
19 - RaspberryPiはARMのバイナリを扱う | |
20 - まずはCbCコンパイラをARMのバイナリを生成するように作成する。 | |
21 - その後に、作成したARM版xv6を参考にCbC言語を使ってRaspberryPiで動くGearsOSを実装する。 | |
22 | |
23 | |
24 # xv6 | |
25 - xv6 とはUNIX V6というOS をANSI C(標準規格のC言語) に書き換えたシンプルな OS である。 | |
26 - UNIX V6 は1975年にリリースされた古いOSでANSI C以前のC言語で実装されていた。 | |
27 - ARMのバイナリを生成するARM版xv6 は Raspberry Pi 上で動かす事ができる。 | |
28 | |
29 # RaspberryPi上でCbC言語のmake | |
30 - RaspberryPi上でGearsOSを動かしたいので、まずはRaspberryPi上でCbCのmakeを行なった。 | |
31 | |
32 # RaspberryPi上でCbC言語のmake | |
33 - Raspberry Pi上でGearsOSを実装するために、LLVMで実装したCbC言語のmakeを試した。 | |
34 - Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC言語 を make することができない。 | |
35 - Raspberry Pi 3 だとメモリは 1GB あり CbC言語 を make できるが、時間がかかる。 | |
36 - Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので別のOS上でRasbianを立ち上げてもmake時間を短縮できない。 | |
37 | |
38 | |
39 # make 時間の比較 | |
40 - 次の環境を用いて、LLVM上に実装されたCbCのmake時間の比較を行なった | |
41 <div align="center"><img src="./images/maketime.pdf" width="900" height="250" style="center"></div> | |
42 - 毎回756GB,32Coreのサーバをフル稼働させるのは現実的でないが、16GB,4Coreの環境でもmake時間が早くなっているのがわかる。 | |
43 | |
44 | |
45 | |
46 # Ninja | |
21 - それぞれのサーバではGoogleによって開発されたbuildシステムninja-buildをもちいてmakeを行なった。 | 47 - それぞれのサーバではGoogleによって開発されたbuildシステムninja-buildをもちいてmakeを行なった。 |
22 - ninja-buildはコア数を調べて実行するので使わない場合と比べてmakeが高速になる。 | 48 - ninja-buildは適切なCore数で実行してくれるので、CPUの数を調べて指定する手間を省ける。 |
23 | 49 - 環境によってはCPUの数を指定しない場合よりかなり高速にmakeを行える。 |
24 # make 時間の比較 | |
25 <div align="center"><img src="./images/maketime.pdf" width="700" height="250" style="center"></div> | |
26 | 50 |
27 # CrossCompile | 51 # CrossCompile |
28 - CrossCompile を行うことで make 時間の問題を解決する方法がある。 | 52 - CrossCompile を行うことで make 時間の問題を解決する方法がある。 |
29 - CrossCompile と は、別の OS で実行可能なコードを生成するコンパイルの手法である。 | 53 - CrossCompile とは、別の OS で実行可能なコードを生成するコンパイルの手法である。 |
30 - Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、その コードを Raspberry Pi に移す事で、実行できるようになる。 | 54 - Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC言語 が動くように CrossCompile を行い、その コードを Raspberry Pi に移す事で、実行できるようになる。 |
31 - Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。 | 55 - Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、CrossCompileで Raspberry Pi 上に CbC言語 を実装する方が好ましい。 |
32 | 56 |
57 # CrossCompileを行なった環境 | |
58 - OSX | |
59 - Linux | |
60 - LLVM/Clangで実装されたCbC | |
61 - GCCで実装されたCbC | |
33 | 62 |
34 # OSX CrossCompile | 63 # OSX CrossCompile |
35 - OSX上でCbCを実装を試みた | 64 - OSX上でCbC言語を実装を試みた |
36 - OSX上でCrossCompileを行うとMach-Oのバイナリが生成される。 | 65 - OSX上でCrossCompileを行うとMach-Oのバイナリが生成される。 |
37 - Mach-oのローダーを作らなければならず、実装は困難である。 | 66 - Mach-Oのローダーを作らなければならず、実装は困難である。 |
38 | 67 |
39 | 68 |
40 # Linux CrossCompile | 69 # Linux CrossCompile |
41 - Linux環境でCbCを動かす際にCrossCompileを行なう方法がある。 | 70 - Linux環境でCbC言語を動かす際にCrossCompileを行なう方法がある。 |
42 - RaspberryPiはARMのコードを生成するので、CrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。 | 71 - RaspberryPiはARMのコードを生成するので、CrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。 |
43 | 72 % # T図形 |
44 | 73 % - CbC言語 を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。 |
45 %# T図形 | 74 % - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある |
46 % - CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。 | 75 % - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。 |
47 % - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある | |
48 % - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。 | |
49 % | |
50 % <div align="center"><img src="./images/examples_2.pdf" style="center"></div> | 76 % <div align="center"><img src="./images/examples_2.pdf" style="center"></div> |
51 | 77 |
52 % # Linux上でのCbCの実装 | 78 # Linux上でのCbC言語の実装 |
53 % - OSX上に立ち上げられたLinux で CbC のCrossCompileを行う過程を図に示す。 | 79 - OSX上に立ち上げられたLinux で ARM版xv6を使い、CbC言語のファイルからa.outを出力するまでの過程を図に示す。 |
54 % - CbCは C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。 | 80 - CbC言語は C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。 |
55 % - これらはARM形式なのでRaspberryPiで実行できるファイルである。 | 81 - これらはARM形式なのでRaspberryPiで実行できるファイルである。 |
56 % <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div> | 82 <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div> |
57 | 83 |
58 | 84 % - OSX上に立ち上げられたLinux で CbC言語 のCrossCompileを行う過程を図に示す。 |
85 | |
86 # CbC言語の種類 | |
87 - CbC言語 には、2種類の方法によって実装されている。 | |
88 - LLVM/Clang 上に実装したCbC | |
89 - GCC 上に実装したCbC | |
59 | 90 |
60 # LLVM/Clang | 91 # LLVM/Clang |
61 - CbC には、LLVM/Clang 上に実装したものと、GCC で実装したものがある。 | 92 - LLVM とは任意のプログラミング言語のコンパイルをサポートする事を目的としたプロジェクトです。 |
62 - LLVM とは任意のプログラミング言語の静的コンパイルと 動的コンパイルの両方をサポートできる事を目的としたプロ ジェクトから始まった、モジューラと再利用可能な コンパイラ とツールチェーン技術の集まりである。 | 93 - モジューラと再利用可能なコンパイラとツールチェーン技術の集まりである。 |
63 - Clang は高速なコンパイルを目的とした LLVM をバック エンドとした、C/C++/Objective-C の コンパイラ である。 | 94 - Clang はLLVMをバックエンドとしたコンパイラで、C/C++/Objective-C の高速なコンパイルを目的としている。 |
64 | 95 |
65 # LLVM CrossCompile | 96 # LLVM CrossCompile |
66 - Makefile に変更を加えることで LLVM/Clang 上に実装 された CbC で Raspberry Pi で実行できる ARM の コードを生成できるようにCrossCompilerを作ったが、動作していない | 97 - LLVM上に実装されたCbCに対してCrossCompileを行なった。 |
98 - ARM版xv6のMakefile に変更を加えることで LLVM/Clang 上に実装 された CbC言語 で Raspberry Pi で実行できる ARM の コードを生成できるようにCrossCompilerを作ったが、動作していない | |
67 - LLVMかxv6のどちらに修正が必要なのか分かってないのでデバッガを使って調査していく | 99 - LLVMかxv6のどちらに修正が必要なのか分かってないのでデバッガを使って調査していく |
68 | 100 |
69 | 101 |
70 # KVM | 102 # KVM |
71 - ARM版のxv6をデバッグするためにKVMを使用する。 | 103 - ARM版のxv6をデバッグするためにKVMを使用する。 |
72 - KVMとは完全仮想化を実現できる機能の事である。 | 104 - KVMとは完全仮想化を実現できる機能の事である。 |
73 - 完全仮想化なので、kernelに変更を加えなくても別のOSを動かせるメリットがある。 | 105 - 完全仮想化なので、kernelに変更を加えなくても別のOSを動かせるメリットがある。 |
74 - KVMはqemuによって操作を行う。 | 106 - KVMはqemuによって操作を行う。 |
75 - qemu-system-armはRaspberryPiをサポートしていなかったが、KVMを立ち上げるために使うxmlファイルにarch='armv7l' machine='versatileab'を指定する事で、解決した。 | 107 - qemu-system-armはRaspberryPiをサポートしていなかったが、KVMを立ち上げるために使うxmlファイルに変更を加える事で、KVMを立ち上げることに成功した。 |
108 % - qemu-system-armはRaspberryPiをサポートしていなかったが、KVMを立ち上げるために使うxmlファイルにarch='armv7l' machine='versatileab'を指定する事で、解決した。 | |
76 | 109 |
77 | 110 |
78 # GCC CrossCompile | 111 # GCC CrossCompile |
112 - GCC上に実装されたCbCについてCrossCompileを行なった。 | |
79 - GCC は C/C++/Objective-C などを様々な言語をコンパイルすることのできるコンパイラである。 | 113 - GCC は C/C++/Objective-C などを様々な言語をコンパイルすることのできるコンパイラである。 |
80 - GCCで実装されたCbCについてはARMのコードを生成するようにMakefileを作成した。 | 114 - GCCで実装されたCbC言語についてはARMのコードを生成するようにMakefileを作成した。 |
81 % - LLVMと同様に動作していなかったが、GCCで実装されたCbCコンパイラのバージョンをあげる事で、 動作させる事に成功した。 | |
82 - Linux上でARMのコードを生成するためのツールチェーンであるgcc-linux-gnuを使う事でxv6をKVM上で動作させる事に成功した。 | 115 - Linux上でARMのコードを生成するためのツールチェーンであるgcc-linux-gnuを使う事でxv6をKVM上で動作させる事に成功した。 |
83 | 116 |
84 | 117 |
118 % - LLVMと同様に動作していなかったが、GCCで実装されたCbC言語コンパイラのバージョンをあげる事で、 動作させる事に成功した。 | |
85 | 119 |
86 # 今後の課題 | 120 # 今後の課題 |
87 - LLVMで実装されたLLVMで作成したxv6が動作しない原因をKVMを用いて調べる。 | 121 - LLVMで実装されたでCbCで作成したxv6が動作しない原因をKVMを用いて調べる。 |
88 - 必要であれば、xv6またはLLVMを修正していく。 | 122 - 必要であれば、xv6またはLLVMを修正していく。 |
89 - xv6kernelの構文に沿ってCbCで書き換える部分を考察する。 | 123 - ARM版xv6のkernelの構文に沿ってCbC言語で書き換える部分を考察する。 |
90 | 124 |
91 | 125 |
92 # T図形 | 126 # T図形 |
93 - CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。 | 127 - CbC言語 を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。 |
94 - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある | 128 - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある |
95 - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。 | 129 - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。 |
96 | 130 |
97 <div align="center"><img src="./images/examples_2.pdf" style="center"></div> | 131 <div align="center"><img src="./images/examples_2.pdf" style="center"></div> |
98 | 132 |
99 | 133 |
100 # Linux上でのCbCの実装 | 134 # Linux上でのCbC言語の実装 |
101 - OSX上に立ち上げられたLinux で CbC のCrossCompileを行う過程を図に示す。 | 135 - OSX上に立ち上げられたLinux で CbC言語 のCrossCompileを行う過程を図に示す。 |
102 - CbCは C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。 | 136 - CbC言語は C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。 |
103 - これらはARM形式なのでRaspberryPiで実行できるファイルである。 | 137 - これらはARM形式なのでRaspberryPiで実行できるファイルである。 |
104 <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div> | 138 <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div> |
105 | 139 |
106 # LLVM CrossCompile Makefile | 140 # LLVM CrossCompile Makefile |
107 - makefileの一部を下に示す。 | 141 - makefileの一部を下に示す。 |
108 - CCはコンパイラで、すでにmakeしたCbCのコンパイラを指定している。 | 142 - CCはコンパイラで、すでにmakeしたCbC言語のコンパイラを指定している。 |
109 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。 | 143 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。 |
110 - CFLAGS にターゲットオプションで arm-linux-gnueabihfを指定することで、ARMのコードを生成することができる。 | 144 - CFLAGS にターゲットオプションで arm-linux-gnueabihfを指定することで、ARMのコードを生成することができる。 |
111 - libgcc | 145 - libgcc |
112 | 146 |
113 | 147 |
233 OBJCOPY_INIT = $(call quiet-command,$(OBJCOPY) ¥ | 267 OBJCOPY_INIT = $(call quiet-command,$(OBJCOPY) ¥ |
234 -S -O binary --prefix-symbols="_binary_$@" $@.out $@, " OBJCOPY $(TARGET_DIR)$@") | 268 -S -O binary --prefix-symbols="_binary_$@" $@.out $@, " OBJCOPY $(TARGET_DIR)$@") |
235 ``` | 269 ``` |
236 | 270 |
237 | 271 |
238 | 272 # T図形 |
273 - CbC言語 を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。 | |
274 - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある | |
275 - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。 | |
276 | |
277 <div align="center"><img src="./images/examples_2.pdf" style="center"></div> |