comparison slide/thesis.md @ 6:3a99fc0296ce

mindmap slide 修正
author tobaru
date Thu, 22 Feb 2018 02:31:50 +0900
parents 0aabd94a0126
children 79fb933328ec
comparison
equal deleted inserted replaced
5:0aabd94a0126 6:3a99fc0296ce
5 # Raspberry Pi 上での Gears OS 5 # Raspberry Pi 上での Gears OS
6 - 本研究室では Code Segment と Data Segment という単位でプログラムを記述する CbC(Continuation base C) とCbC を用いて実装する Gears OS の研究を行っている。 6 - 本研究室では Code Segment と Data Segment という単位でプログラムを記述する CbC(Continuation base C) とCbC を用いて実装する Gears OS の研究を行っている。
7 - Code Segment は並列処理の単位として利用でき、Data Segment はデータそのもので型を持っていて、CbC はメタレベルの処理、並列処理を記述することができる。 7 - Code Segment は並列処理の単位として利用でき、Data Segment はデータそのもので型を持っていて、CbC はメタレベルの処理、並列処理を記述することができる。
8 - メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理を記述 することができる。 8 - メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理を記述 することができる。
9 - 本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi で Gears OS を動かせるようになる事で、ハードウェア上でもメタレベルの処理、並列実行ができるプログラミングを記述できるようになる事を目指している。 9 - 本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi で Gears OS を動かせるようになる事で、ハードウェア上でもメタレベルの処理、並列実行ができるプログラミングを記述できるようになる事を目指している。
10
11 # 実装までの流れ
12 - RaspberryPi上にGearsOSを実装するために、まずはCbCコンパイラをRaspberryPi(ARM)用に作成する
13 - その後に、CbCをを使ってxv6というOSを参考にRaspberryPiで動くGearsOSを作る
14 - xv6 とは ANIX V6 とい う OS を ANSI-C に書き換え、x86 に移植した OS である。xv6 は Raspberry Pi で動かす事ができる。
10 15
11 16
12 # RaspberryPi上でCbCのmake 17 # RaspberryPi上でCbCのmake
13 - Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC を make することができない。 18 - Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC を make することができない。
14 - Raspberry Pi 3 だとメモリは 1GB あり CbC を make できるが、時間がかかる。 19 - Raspberry Pi 3 だとメモリは 1GB あり CbC を make できるが、時間がかかる。
15 - make 時間の比較として研究室のメモリ 16GB のサーバ(firefly) と学科のサーバの一つ で Linux 環境であるメモリ 756GB の Dell PowerEdge630(DALMORE)を用いる。 20 - make 時間の比較として研究室のメモリ 16GB のサーバ(firefly) と学科のサーバの一つ で Linux 環境であるメモリ 756GB の Dell PowerEdge630(DALMORE)を用いる。
16 - それぞれのサーバではGoogleによって開発されたbuildシステムninja-buildをもちいてmakeを行なった。 21 - それぞれのサーバではGoogleによって開発されたbuildシステムninja-buildをもちいてmakeを行なった。
17 - ninja-buildはコア数を調べて実行するので使わない場合と比べてmakeが高速になる。 22 - ninja-buildはコア数を調べて実行するので使わない場合と比べてmakeが高速になる。
18 23
19 # make 時間の比較 24 # make 時間の比較
20 <div align="center"><img src="./images/maketime.png" width="700" height="250" style="center"></div> 25 <div align="center"><img src="./images/maketime.pdf" width="700" height="250" style="center"></div>
21 26
22 # CrossCompile 27 # CrossCompile
23 - CrossCompile を行うことで make 時間の問題を解決する方法がある。 28 - CrossCompile を行うことで make 時間の問題を解決する方法がある。
24 - CrossCompile と は、別の OS で実行可能なコードを生成するコンパイルの手法である。 29 - CrossCompile と は、別の OS で実行可能なコードを生成するコンパイルの手法である。
25 - Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、その コードを Raspberry Pi に移す事で、実行できるようになる。 30 - Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、その コードを Raspberry Pi に移す事で、実行できるようになる。
26 - Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。 31 - Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。
27 32
33
34 # OSX CrossCompile
35 - OSX上でCbCを実装を試みた
36 - OSX上でCrossCompileを行うとMach-Oのバイナリが生成される。
37 - Mach-oのローダーを作らなければならず、実装は困難である。
38
39
28 # Linux CrossCompile 40 # Linux CrossCompile
29 - Linux環境でCbCを動かす際にCrossCompileを行なう方法がある。 41 - Linux環境でCbCを動かす際にCrossCompileを行なう方法がある。
30 - RaspberryPiはARMのコードを生成するので、LinuxでもCrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。 42 - RaspberryPiはARMのコードを生成するので、CrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。
31 - C言語で書かれた簡単なファイルをCrossCompileしたコマンドを示す。 43
32 44
33 ```c 45 %# T図形
34 ./bin/clang -target arm-linux-gnueabi -mfpu=neon-fp16 -marm 46 % - CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。
35 -I /net/open/Linux/arm/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/include/ 47 % - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある
36 hello.c -c -mfloat-abi=hard 48 % - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。
37 ``` 49 %
50 % <div align="center"><img src="./images/examples_2.pdf" style="center"></div>
51
52 % # Linux上でのCbCの実装
53 % - OSX上に立ち上げられたLinux で CbC のCrossCompileを行う過程を図に示す。
54 % - CbCは C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。
55 % - これらはARM形式なのでRaspberryPiで実行できるファイルである。
56 % <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div>
57
58
59
60 # LLVM/Clang
61 - CbC には、LLVM/Clang 上に実装したものと、GCC で実装したものがある。
62 - LLVM とは任意のプログラミング言語の静的コンパイルと 動的コンパイルの両方をサポートできる事を目的としたプロ ジェクトから始まった、モジューラと再利用可能な コンパイラ とツールチェーン技術の集まりである。
63 - Clang は高速なコンパイルを目的とした LLVM をバック エンドとした、C/C++/Objective-C の コンパイラ である。
64
65 # LLVM CrossCompile
66 - Makefile に変更を加えることで LLVM/Clang 上に実装 された CbC で Raspberry Pi で実行できる ARM の コードを生成できるようにCrossCompilerを作ったが、動作していない
67 - LLVMかxv6のどちらに修正が必要なのか分かってないのでデバッガを使って調査していく
68
69
70 # KVM
71 - ARM版のxv6をデバッグするためにKVMを使用する。
72 - KVMとは完全仮想化を実現できる機能の事である。
73 - 完全仮想化なので、kernelに変更を加えなくても別のOSを動かせるメリットがある。
74 - KVMはqemuによって操作を行う。
75 - qemu-system-armはRaspberryPiをサポートしていなかったが、KVMを立ち上げるために使うxmlファイルにarch='armv7l' machine='versatileab'を指定する事で、解決した。
76
77
78 # GCC CrossCompile
79 - GCC は C/C++/Objective-C などを様々な言語をコンパイルすることのできるコンパイラである。
80 - GCCで実装されたCbCについてはARMのコードを生成するようにMakefileを作成した。
81 % - LLVMと同様に動作していなかったが、GCCで実装されたCbCコンパイラのバージョンをあげる事で、 動作させる事に成功した。
82 - Linux上でARMのコードを生成するためのツールチェーンであるgcc-linux-gnuを使う事でxv6をKVM上で動作させる事に成功した。
83
84
85
86 # 今後の課題
87 - LLVMで実装されたLLVMで作成したxv6が動作しない原因をKVMを用いて調べる。
88 - 必要であれば、xv6またはLLVMを修正していく。
89 - xv6kernelの構文に沿ってCbCで書き換える部分を考察する。
90
38 91
39 # T図形 92 # T図形
40 - CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。 93 - CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。
41 - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある 94 - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある
42 - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。 95 - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。
43 96
44 <div align="center"><img src="./images/examples_2.pdf" style="center"></div> 97 <div align="center"><img src="./images/examples_2.pdf" style="center"></div>
98
45 99
46 # Linux上でのCbCの実装 100 # Linux上でのCbCの実装
47 - OSX上に立ち上げられたLinux で CbC のCrossCompileを行う過程を図に示す。 101 - OSX上に立ち上げられたLinux で CbC のCrossCompileを行う過程を図に示す。
48 - CbCは C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。 102 - CbCは C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。
49 - これらはARM形式なのでRaspberryPiで実行できるファイルである。 103 - これらはARM形式なのでRaspberryPiで実行できるファイルである。
50 <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div> 104 <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div>
51 105
52 106 # LLVM CrossCompile Makefile
53
54 # xv6
55 - マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 とい う OS を ANSI-C に書き換え、x86 に移植した Xv6 OS である。Xv6 は Raspberry Pi に 移植する事ができる。ANSI-C で書かれている Xv6 を CbC に書き直す事で、Raspberry Pi で CbC を動かせるようになる。
56
57 # LLVM/Clang
58 - CbC には、LLVM/Clang 上に実装したものと、GCC で実装したものがある。
59 - LLVM とは任意のプログラミング言語の静的コンパイルと 動的コンパイルの両方をサポートできる事を目的としたプロ ジェクトから始まった、モジューラと再利用可能な compiler とツールチェーン技術の集まりである。
60 - Clang は高速なコンパイルを目的とした LLVM をバック エンドとした、C/C++/Objective-C の compiler である。
61
62 # LLVM CrossCompile
63 - Makefile に変更を加えることで LLVM/Clang 上に実装 された CbC で Raspberry Pi で実行できるような ARM の コードを生成できるように実装した。
64 - makefileの一部を下に示す。 107 - makefileの一部を下に示す。
65 - CCはコンパイラで、すでにmakeしたCbCのコンパイラを指定している。 108 - CCはコンパイラで、すでにmakeしたCbCのコンパイラを指定している。
66 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。 109 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。
67 - CFLAGS にターゲットオプションで arm-linux-gnueabihfを指定することで、ARMのコードを生成することができる。 110 - CFLAGS にターゲットオプションで arm-linux-gnueabihfを指定することで、ARMのコードを生成することができる。
68 - libgcc 111 - libgcc
112
69 113
70 ```c 114 ```c
71 QEMU = qemu-system-arm 115 QEMU = qemu-system-arm
72 116
73 include makefile.inc 117 include makefile.inc
85 129
86 # link the libgcc.a for __aeabi_idiv. ARM has no native support for div 130 # link the libgcc.a for __aeabi_idiv. ARM has no native support for div
87 LIBS =/net/open/RaspberryPi/rasbian-img/usr/lib/gcc/arm-linux-gnueabihf/6/libgcc.a 131 LIBS =/net/open/RaspberryPi/rasbian-img/usr/lib/gcc/arm-linux-gnueabihf/6/libgcc.a
88 ``` 132 ```
89 133
90 134 # LinuxのCPUコア
91 # GCC CrossCompile 135 - CPUごとのコア数 18
92 - GCC は C/C++/Objective-C などを様々な言語をコンパイルすることのできるコンパイラである。 136 - 論理プロセッサー 72
93 - GCCで実装されたCbCについてもARMのコードを生成するようにMakefileを実装した。 137 ```c
138 +dalmore+one grep cpu.cores /proc/cpuinfo | sort -u
139 cpu cores : 18
140 +dalmore+one grep processor /proc/cpuinfo | wc -l
141 72
142 ```
143
144 # OSXコア数
145 ```c
146 +firefly+one system_profiler SPHardwareDataType
147 Hardware:
148
149 Hardware Overview:
150
151 Model Name: Mac Pro
152 Model Identifier: MacPro5,1
153 Processor Name: 6-Core Intel Xeon
154 Processor Speed: 2.66 GHz
155 Number of Processors: 2
156 Total Number of Cores: 12
157 L2 Cache (per Core): 256 KB
158 L3 Cache (per Processor): 12 MB
159 Memory: 16 GB
160 Processor Interconnect Speed: 6.4 GT/s
161 Boot ROM Version: MP51.007F.B03
162 SMC Version (system): 1.39f11
163 SMC Version (processor tray): 1.39f11
164 Serial Number (system): YM20300FGWR
165 Serial Number (processor tray): J515201PEBH8C
166 Hardware UUID: F6CA8AEA-6A98-53A9-826F-B3A3D465F23B
167 ```
168
169 # arm1.xml
170 ```c
171 <domain type='qemu' id='22'>
172 <name>arm1</name>
173 <uuid>8028f71a-1db8-40a4-94fa-5a4a42014273</uuid>
174 <memory>131072</memory>
175 <currentMemory>131072</currentMemory>
176 <vcpu>1</vcpu>
177 <os>
178 <type arch='armv7l' machine='versatileab'>hvm</type>
179 <kernel>/var/lib/libvirt/images/zImage-versatile-2.6.24-rc7.armv5tel</kernel>
180 <cmdline>&quot;root=0800&quot;</cmdline>
181 <boot dev='hd'/>
182 </os>
183 <features>
184 <acpi/>
185 </features>
186 <clock offset='utc'/>
187 <on_poweroff>destroy</on_poweroff>
188 <on_reboot>restart</on_reboot>
189 <on_crash>restart</on_crash>
190 <devices>
191 <emulator>/bin/qemu-system-arm</emulator>
192 <disk type='file' device='disk'>
193 <driver name='qemu' type='raw'/>
194 <source file='/var/lib/libvirt/images/arm1.img'/>
195 <target dev='hdc' bus='scsi'/>
196 </disk>
197 <input type='mouse' bus='ps2'/>
198 <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' passwd='43u@khii'>
199 <listen type='address' address='0.0.0.0'/>
200 </graphics>
201 <video>
202 <model type='cirrus' vram='16384' heads='1' primary='yes'/>
203 </video>
204 </devices>
205 </domain>
206
207 ```
208
209 # GCC CrossCompile makefile
94 - CC にarm-linux-gnu-gccを指定することでARMのコードを生成できるようになる 210 - CC にarm-linux-gnu-gccを指定することでARMのコードを生成できるようになる
95 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。 211 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。
96
97 ```c 212 ```c
98 QEMU = qemu-system-arm 213 QEMU = qemu-system-arm
99 214
100 include makefile.inc 215 include makefile.inc
101 CC = arm-linux-gnu-gcc 216 CC = arm-linux-gnu-gcc
118 OBJCOPY_INIT = $(call quiet-command,$(OBJCOPY) ¥ 233 OBJCOPY_INIT = $(call quiet-command,$(OBJCOPY) ¥
119 -S -O binary --prefix-symbols="_binary_$@" $@.out $@, " OBJCOPY $(TARGET_DIR)$@") 234 -S -O binary --prefix-symbols="_binary_$@" $@.out $@, " OBJCOPY $(TARGET_DIR)$@")
120 ``` 235 ```
121 236
122 237
123 # 今後の課題 238
124
125 Xv6 で CbC が動くようになれば、Raspberry Pi 以外のハードウェアでの実装も容易に なるので、Linux 上での実装を目指して研究を進めていく。xv6 で CbC が動けば、続け て Linux 上で Gears OS の実装も行なっていく。
126
127
128
129