4
|
1 title:Gears OS on Raspberry Pi
|
|
2 author:Yu Tobaru
|
|
3 profile:
|
|
4
|
|
5 # Raspberry Pi 上での Gears OS
|
|
6 - 本研究室では Code Segment と Data Segment という単位でプログラムを記述する CbC(Continuation base C) とCbC を用いて実装する Gears OS の研究を行っている。
|
5
|
7 - Code Segment は並列処理の単位として利用でき、Data Segment はデータそのもので型を持っていて、CbC はメタレベルの処理、並列処理を記述することができる。
|
|
8 - メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理を記述 することができる。
|
|
9 - 本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi で Gears OS を動かせるようになる事で、ハードウェア上でもメタレベルの処理、並列実行ができるプログラミングを記述できるようになる事を目指している。
|
4
|
10
|
6
|
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 で動かす事ができる。
|
|
15
|
4
|
16
|
|
17 # RaspberryPi上でCbCのmake
|
|
18 - Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC を make することができない。
|
|
19 - Raspberry Pi 3 だとメモリは 1GB あり CbC を make できるが、時間がかかる。
|
5
|
20 - make 時間の比較として研究室のメモリ 16GB のサーバ(firefly) と学科のサーバの一つ で Linux 環境であるメモリ 756GB の Dell PowerEdge630(DALMORE)を用いる。
|
4
|
21 - それぞれのサーバではGoogleによって開発されたbuildシステムninja-buildをもちいてmakeを行なった。
|
|
22 - ninja-buildはコア数を調べて実行するので使わない場合と比べてmakeが高速になる。
|
|
23
|
|
24 # make 時間の比較
|
6
|
25 <div align="center"><img src="./images/maketime.pdf" width="700" height="250" style="center"></div>
|
4
|
26
|
|
27 # CrossCompile
|
|
28 - CrossCompile を行うことで make 時間の問題を解決する方法がある。
|
|
29 - CrossCompile と は、別の OS で実行可能なコードを生成するコンパイルの手法である。
|
|
30 - Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、その コードを Raspberry Pi に移す事で、実行できるようになる。
|
5
|
31 - Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。
|
4
|
32
|
6
|
33
|
|
34 # OSX CrossCompile
|
|
35 - OSX上でCbCを実装を試みた
|
|
36 - OSX上でCrossCompileを行うとMach-Oのバイナリが生成される。
|
|
37 - Mach-oのローダーを作らなければならず、実装は困難である。
|
|
38
|
|
39
|
4
|
40 # Linux CrossCompile
|
|
41 - Linux環境でCbCを動かす際にCrossCompileを行なう方法がある。
|
6
|
42 - RaspberryPiはARMのコードを生成するので、CrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。
|
|
43
|
|
44
|
|
45 %# T図形
|
|
46 % - CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。
|
|
47 % - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある
|
|
48 % - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。
|
|
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 の コンパイラ である。
|
5
|
64
|
6
|
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
|
4
|
91
|
|
92 # T図形
|
6
|
93 - CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。
|
|
94 - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある
|
|
95 - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。
|
|
96
|
|
97 <div align="center"><img src="./images/examples_2.pdf" style="center"></div>
|
4
|
98
|
|
99
|
|
100 # Linux上でのCbCの実装
|
|
101 - OSX上に立ち上げられたLinux で CbC のCrossCompileを行う過程を図に示す。
|
5
|
102 - CbCは C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。
|
4
|
103 - これらはARM形式なのでRaspberryPiで実行できるファイルである。
|
|
104 <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div>
|
|
105
|
6
|
106 # LLVM CrossCompile Makefile
|
4
|
107 - makefileの一部を下に示す。
|
|
108 - CCはコンパイラで、すでにmakeしたCbCのコンパイラを指定している。
|
|
109 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。
|
|
110 - CFLAGS にターゲットオプションで arm-linux-gnueabihfを指定することで、ARMのコードを生成することができる。
|
|
111 - libgcc
|
|
112
|
6
|
113
|
4
|
114 ```c
|
|
115 QEMU = qemu-system-arm
|
|
116
|
|
117 include makefile.inc
|
|
118 CC = /usr/local/cbclang/bin/clang
|
|
119 AS = arm-linux-gnu-as
|
|
120 LD = arm-linux-gnu-ld
|
|
121 OBJCOPY = arm-linux-gnu-objcopy
|
|
122 OBJDUMP = arm-linux-gnu-objdump
|
|
123
|
|
124 CFLAGS = -target arm-linux-gnueabihf -march=armv7a -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -I. -I ../cbclang/arm -g -O0
|
|
125 LDFLAGS = --noinhibit-exec
|
|
126 ASFLAGS = -target arm-linux-gnueabihf
|
|
127
|
|
128 LIBGCC = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
|
|
129
|
|
130 # link the libgcc.a for __aeabi_idiv. ARM has no native support for div
|
|
131 LIBS =/net/open/RaspberryPi/rasbian-img/usr/lib/gcc/arm-linux-gnueabihf/6/libgcc.a
|
|
132 ```
|
|
133
|
6
|
134 # LinuxのCPUコア
|
|
135 - CPUごとのコア数 18
|
|
136 - 論理プロセッサー 72
|
|
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 ```
|
4
|
143
|
6
|
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
|
4
|
210 - CC にarm-linux-gnu-gccを指定することでARMのコードを生成できるようになる
|
|
211 - AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。
|
|
212 ```c
|
|
213 QEMU = qemu-system-arm
|
|
214
|
|
215 include makefile.inc
|
|
216 CC = arm-linux-gnu-gcc
|
|
217 AS = arm-linux-gnu-as
|
|
218 LD = arm-linux-gnu-ld
|
|
219 OBJCOPY = arm-linux-gnu-objcopy
|
|
220 OBJDUMP = arm-linux-gnu-objdump
|
|
221
|
|
222 CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -I. -g -O0
|
|
223
|
|
224 ASFLAGS =
|
|
225
|
|
226 LIBGCC = $(shell $(CC) -print-libgcc-file-name)
|
|
227
|
|
228 LINK_BIN = $(call quiet-command,$(LD) $(LDFLAGS) ¥
|
|
229 -T $(1) -o $(2) $(3) $(LIBS) -b binary $(4), " LINK $(TARGET_DIR)$@")
|
|
230
|
|
231 LINK_INIT = $(call quiet-command,$(LD) $(LDFLAGS) ¥
|
|
232 $(1) -o $@.out $<, " LINK $(TARGET_DIR)$@")
|
|
233 OBJCOPY_INIT = $(call quiet-command,$(OBJCOPY) ¥
|
|
234 -S -O binary --prefix-symbols="_binary_$@" $@.out $@, " OBJCOPY $(TARGET_DIR)$@")
|
|
235 ```
|
|
236
|
|
237
|
|
238
|