view slide/thesis.md @ 7:79fb933328ec default tip

slide
author tobaru
date Thu, 22 Feb 2018 12:20:52 +0900
parents 3a99fc0296ce
children
line wrap: on
line source

title:Gears OS on Raspberry Pi
author:河野研 桃原優
profile:

# Raspberry Pi 上での Gears OS
- 本研究室ではCbC(Continuation base C)言語を用いて実装する Gears OS の研究を行っている。
- 本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi で Gears OS を動かせるようになる事で、ハードウェア上でもメタレベルの処理、並列実行ができるプログラミングを記述できるようになる事を目指している。
	- メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理を記述 することができる。

# スライドの流れ
- RaspberryPi上でのGearsOSの実装
- RaspberryPi上でのCbCのmake
- make時間の比較
- OSX上でのCbCのCrossCompile
- Linux上でのCbCのCrossCompile
- ARM版xv6をKVMで立ち上げる

# RaspberryPi上でのGearsOSの実装
- RaspberryPiはARMのバイナリを扱う
- まずはCbCコンパイラをARMのバイナリを生成するように作成する。
- その後に、作成したARM版xv6を参考にCbC言語を使ってRaspberryPiで動くGearsOSを実装する。


# xv6
- xv6 とはUNIX V6というOS をANSI C(標準規格のC言語) に書き換えたシンプルな OS である。
- UNIX V6 は1975年にリリースされた古いOSでANSI C以前のC言語で実装されていた。
- ARMのバイナリを生成するARM版xv6 は Raspberry Pi 上で動かす事ができる。

# RaspberryPi上でCbC言語のmake  
- RaspberryPi上でGearsOSを動かしたいので、まずはRaspberryPi上でCbCのmakeを行なった。

# RaspberryPi上でCbC言語のmake
- Raspberry Pi上でGearsOSを実装するために、LLVMで実装したCbC言語のmakeを試した。
- Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC言語 を make することができない。
- Raspberry Pi 3 だとメモリは 1GB あり CbC言語 を make できるが、時間がかかる。
- Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので別のOS上でRasbianを立ち上げてもmake時間を短縮できない。


# make 時間の比較
- 次の環境を用いて、LLVM上に実装されたCbCのmake時間の比較を行なった
<div align="center"><img src="./images/maketime.pdf" width="900" height="250" style="center"></div>
- 毎回756GB,32Coreのサーバをフル稼働させるのは現実的でないが、16GB,4Coreの環境でもmake時間が早くなっているのがわかる。



# Ninja
- それぞれのサーバではGoogleによって開発されたbuildシステムninja-buildをもちいてmakeを行なった。
- ninja-buildは適切なCore数で実行してくれるので、CPUの数を調べて指定する手間を省ける。
- 環境によってはCPUの数を指定しない場合よりかなり高速にmakeを行える。

# CrossCompile
- CrossCompile を行うことで make 時間の問題を解決する方法がある。
- CrossCompile とは、別の OS で実行可能なコードを生成するコンパイルの手法である。
- Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC言語 が動くように CrossCompile を行い、その コードを Raspberry Pi に移す事で、実行できるようになる。
- Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、CrossCompileで Raspberry Pi 上に CbC言語 を実装する方が好ましい。

# CrossCompileを行なった環境
- OSX
- Linux
	- LLVM/Clangで実装されたCbC
	- GCCで実装されたCbC

# OSX CrossCompile
- OSX上でCbC言語を実装を試みた
- OSX上でCrossCompileを行うとMach-Oのバイナリが生成される。
- Mach-Oのローダーを作らなければならず、実装は困難である。


# Linux CrossCompile
- Linux環境でCbC言語を動かす際にCrossCompileを行なう方法がある。
- RaspberryPiはARMのコードを生成するので、CrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。
% # T図形
%  - CbC言語 を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。 
%  - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある
%  - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。
% <div align="center"><img src="./images/examples_2.pdf" style="center"></div>

# Linux上でのCbC言語の実装
- OSX上に立ち上げられたLinux で ARM版xv6を使い、CbC言語のファイルからa.outを出力するまでの過程を図に示す。
- CbC言語は C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。
- これらはARM形式なのでRaspberryPiで実行できるファイルである。
<div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div>

% - OSX上に立ち上げられたLinux で CbC言語 のCrossCompileを行う過程を図に示す。

# CbC言語の種類
- CbC言語 には、2種類の方法によって実装されている。
	- LLVM/Clang 上に実装したCbC
	- GCC 上に実装したCbC

# LLVM/Clang
- LLVM とは任意のプログラミング言語のコンパイルをサポートする事を目的としたプロジェクトです。
- モジューラと再利用可能なコンパイラとツールチェーン技術の集まりである。
- Clang はLLVMをバックエンドとしたコンパイラで、C/C++/Objective-C の高速なコンパイルを目的としている。

# LLVM CrossCompile
- LLVM上に実装されたCbCに対してCrossCompileを行なった。
- ARM版xv6のMakefile に変更を加えることで LLVM/Clang 上に実装 された CbC言語 で Raspberry Pi で実行できる ARM の コードを生成できるようにCrossCompilerを作ったが、動作していない
- LLVMかxv6のどちらに修正が必要なのか分かってないのでデバッガを使って調査していく


# KVM
- ARM版のxv6をデバッグするためにKVMを使用する。
- KVMとは完全仮想化を実現できる機能の事である。
- 完全仮想化なので、kernelに変更を加えなくても別のOSを動かせるメリットがある。
- KVMはqemuによって操作を行う。
- qemu-system-armはRaspberryPiをサポートしていなかったが、KVMを立ち上げるために使うxmlファイルに変更を加える事で、KVMを立ち上げることに成功した。
% - qemu-system-armはRaspberryPiをサポートしていなかったが、KVMを立ち上げるために使うxmlファイルにarch='armv7l' machine='versatileab'を指定する事で、解決した。


# GCC CrossCompile
- GCC上に実装されたCbCについてCrossCompileを行なった。
- GCC は C/C++/Objective-C などを様々な言語をコンパイルすることのできるコンパイラである。
- GCCで実装されたCbC言語についてはARMのコードを生成するようにMakefileを作成した。
- Linux上でARMのコードを生成するためのツールチェーンであるgcc-linux-gnuを使う事でxv6をKVM上で動作させる事に成功した。


% - LLVMと同様に動作していなかったが、GCCで実装されたCbC言語コンパイラのバージョンをあげる事で、 動作させる事に成功した。

# 今後の課題
- LLVMで実装されたでCbCで作成したxv6が動作しない原因をKVMを用いて調べる。
- 必要であれば、xv6またはLLVMを修正していく。
- ARM版xv6のkernelの構文に沿ってCbC言語で書き換える部分を考察する。


# T図形
 - CbC言語 を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。 
 - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある
 - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。
 
 <div align="center"><img src="./images/examples_2.pdf" style="center"></div>


# Linux上でのCbC言語の実装
- OSX上に立ち上げられたLinux で CbC言語 のCrossCompileを行う過程を図に示す。
- CbC言語は C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。
- これらはARM形式なのでRaspberryPiで実行できるファイルである。
<div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center"></div>

# LLVM CrossCompile Makefile
- makefileの一部を下に示す。
- CCはコンパイラで、すでにmakeしたCbC言語のコンパイラを指定している。
- AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。
- CFLAGS にターゲットオプションで arm-linux-gnueabihfを指定することで、ARMのコードを生成することができる。
- libgcc


```c
QEMU = qemu-system-arm

include makefile.inc
CC = /usr/local/cbclang/bin/clang
AS = arm-linux-gnu-as
LD = arm-linux-gnu-ld
OBJCOPY = arm-linux-gnu-objcopy
OBJDUMP = arm-linux-gnu-objdump

CFLAGS = -target arm-linux-gnueabihf -march=armv7a -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -I. -I ../cbclang/arm -g -O0
LDFLAGS = --noinhibit-exec
ASFLAGS = -target arm-linux-gnueabihf

LIBGCC = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)

# link the libgcc.a for __aeabi_idiv. ARM has no native support for div
LIBS =/net/open/RaspberryPi/rasbian-img/usr/lib/gcc/arm-linux-gnueabihf/6/libgcc.a
```

# LinuxのCPUコア
- CPUごとのコア数 18
- 論理プロセッサー 72
```c
+dalmore+one grep cpu.cores /proc/cpuinfo | sort -u
cpu cores	: 18
+dalmore+one grep processor /proc/cpuinfo | wc -l
72
```

# OSXコア数
```c
+firefly+one system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: Mac Pro
      Model Identifier: MacPro5,1
      Processor Name: 6-Core Intel Xeon
      Processor Speed: 2.66 GHz
      Number of Processors: 2
      Total Number of Cores: 12
      L2 Cache (per Core): 256 KB
      L3 Cache (per Processor): 12 MB
      Memory: 16 GB
      Processor Interconnect Speed: 6.4 GT/s
      Boot ROM Version: MP51.007F.B03
      SMC Version (system): 1.39f11
      SMC Version (processor tray): 1.39f11
      Serial Number (system): YM20300FGWR
      Serial Number (processor tray): J515201PEBH8C     
      Hardware UUID: F6CA8AEA-6A98-53A9-826F-B3A3D465F23B
```

# arm1.xml
```c
<domain type='qemu' id='22'>
  <name>arm1</name>
  <uuid>8028f71a-1db8-40a4-94fa-5a4a42014273</uuid>
  <memory>131072</memory>
  <currentMemory>131072</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='armv7l' machine='versatileab'>hvm</type>
    <kernel>/var/lib/libvirt/images/zImage-versatile-2.6.24-rc7.armv5tel</kernel>
    <cmdline>&quot;root=0800&quot;</cmdline>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/bin/qemu-system-arm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/var/lib/libvirt/images/arm1.img'/>
      <target dev='hdc' bus='scsi'/>
    </disk>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' passwd='43u@khii'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
    </video>
  </devices>
</domain>

```

# GCC CrossCompile makefile
- CC にarm-linux-gnu-gccを指定することでARMのコードを生成できるようになる
- AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。
```c
QEMU = qemu-system-arm

include makefile.inc
CC = arm-linux-gnu-gcc
AS = arm-linux-gnu-as
LD = arm-linux-gnu-ld
OBJCOPY = arm-linux-gnu-objcopy
OBJDUMP = arm-linux-gnu-objdump

CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -I. -g -O0

ASFLAGS =

LIBGCC = $(shell $(CC) -print-libgcc-file-name)

LINK_BIN = $(call quiet-command,$(LD) $(LDFLAGS) ¥
        -T $(1) -o $(2) $(3) $(LIBS) -b binary $(4), "  LINK     $(TARGET_DIR)$@")

LINK_INIT = $(call quiet-command,$(LD) $(LDFLAGS) ¥
        $(1) -o $@.out $<, "  LINK     $(TARGET_DIR)$@")
OBJCOPY_INIT = $(call quiet-command,$(OBJCOPY) ¥
        -S -O binary --prefix-symbols="_binary_$@" $@.out $@, "  OBJCOPY  $(TARGET_DIR)$@")
```


 # T図形
  - CbC言語 を Raspberry Pi で動かすためのアプローチの手法を、I と T の形をした図の組み合わせによって説明を行う。 
  - I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある
  - T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。
 
 <div align="center"><img src="./images/examples_2.pdf" style="center"></div>