Mercurial > hg > Papers > 2018 > tobaru-thesis
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>"root=0800"</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 |