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>