Mercurial > hg > Papers > 2018 > tobaru-thesis
view slide/thesis.pdf.html @ 6:3a99fc0296ce
mindmap slide 修正
author | tobaru |
---|---|
date | Thu, 22 Feb 2018 02:31:50 +0900 |
parents | 0aabd94a0126 |
children | 79fb933328ec |
line wrap: on
line source
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Gears OS on Raspberry Pi</title> <meta name="generator" content="Slide Show (S9) v2.5.0 on Ruby 2.4.1 (2017-03-22) [x86_64-darwin15]"> <meta name="author" content="Yu Tobaru" > <!-- style sheet links --> <link rel="stylesheet" href="s6/themes/screen.css" media="screen"> <link rel="stylesheet" href="s6/themes/print.css" media="print"> <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection"> <!-- JS --> <script src="s6/js/jquery-1.11.3.min.js"></script> <script src="s6/js/jquery.slideshow.js"></script> <script src="s6/js/jquery.slideshow.counter.js"></script> <script src="s6/js/jquery.slideshow.controls.js"></script> <script src="s6/js/jquery.slideshow.footer.js"></script> <script src="s6/js/jquery.slideshow.autoplay.js"></script> <!-- prettify --> <link rel="stylesheet" href="scripts/prettify.css"> <script src="scripts/prettify.js"></script> <style> .slide {page-break-after: always;} </style> </head> <body> <div class="layout"> <div id="header"></div> <div id="footer"> <div align="right"> <img src="s6/images/logo.svg" width="200px"> </div> </div> </div> <div class="presentation"> <div class='slide cover'> <table width="90%" height="90%" border="0" align="center"> <tr> <td> <div align="center"> <h1><font color="#808db5">Gears OS on Raspberry Pi</font></h1> </div> </td> </tr> <tr> <td> <div align="left"> Yu Tobaru <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> </div> </td> </tr> </table> </div> <div class='slide '> <!-- === begin markdown block === generated by markdown/1.2.0 on Ruby 2.4.1 (2017-03-22) [x86_64-darwin15] on 2018-02-22 02:27:48 +0900 with Markdown engine kramdown (1.13.2) using options {} --> <!-- _S9SLIDE_ --> <h1 id="raspberry-pi--gears-os">Raspberry Pi 上での Gears OS</h1> <ul> <li>本研究室では Code Segment と Data Segment という単位でプログラムを記述する CbC(Continuation base C) とCbC を用いて実装する Gears OS の研究を行っている。</li> <li>Code Segment は並列処理の単位として利用でき、Data Segment はデータそのもので型を持っていて、CbC はメタレベルの処理、並列処理を記述することができる。</li> <li>メタレベルの処理では、メモリ管理、スレッド管理、CPU や GPU の資源管理を記述 することができる。</li> <li>本研究では、ARM で動くシングルボードコンピュータである Raspberry Pi で Gears OS を動かせるようになる事で、ハードウェア上でもメタレベルの処理、並列実行ができるプログラミングを記述できるようになる事を目指している。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section">実装までの流れ</h1> <ul> <li>RaspberryPi上にGearsOSを実装するために、まずはCbCコンパイラをRaspberryPi(ARM)用に作成する</li> <li>その後に、CbCをを使ってxv6というOSを参考にRaspberryPiで動くGearsOSを作る</li> <li>xv6 とは ANIX V6 とい う OS を ANSI-C に書き換え、x86 に移植した OS である。xv6 は Raspberry Pi で動かす事ができる。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="raspberrypicbcmake">RaspberryPi上でCbCのmake</h1> <ul> <li>Raspberry Pi 1 のメモリは 256MB と小さいため、 CbC を make することができない。</li> <li>Raspberry Pi 3 だとメモリは 1GB あり CbC を make できるが、時間がかかる。</li> <li>make 時間の比較として研究室のメモリ 16GB のサーバ(firefly) と学科のサーバの一つ で Linux 環境であるメモリ 756GB の Dell PowerEdge630(DALMORE)を用いる。</li> <li>それぞれのサーバではGoogleによって開発されたbuildシステムninja-buildをもちいてmakeを行なった。</li> <li>ninja-buildはコア数を調べて実行するので使わない場合と比べてmakeが高速になる。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="make-">make 時間の比較</h1> <div align="center"><img src="./images/maketime.pdf" width="700" height="250" style="center" /></div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="crosscompile">CrossCompile</h1> <ul> <li>CrossCompile を行うことで make 時間の問題を解決する方法がある。</li> <li>CrossCompile と は、別の OS で実行可能なコードを生成するコンパイルの手法である。</li> <li>Raspbian 以外の OS 環境であらかじめ Raspberry Pi で CbC が動くように CrossCompile を行い、その コードを Raspberry Pi に移す事で、実行できるようになる。</li> <li>Raspberry Pi の OS である Rasbian は qemu によるメモリの拡張もできないので、別の手法で Raspberry Pi 上に CbC を実装する方が好ましい。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="osx-crosscompile">OSX CrossCompile</h1> <ul> <li>OSX上でCbCを実装を試みた</li> <li>OSX上でCrossCompileを行うとMach-Oのバイナリが生成される。</li> <li>Mach-oのローダーを作らなければならず、実装は困難である。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="linux-crosscompile">Linux CrossCompile</h1> <ul> <li>Linux環境でCbCを動かす際にCrossCompileを行なう方法がある。</li> <li>RaspberryPiはARMのコードを生成するので、CrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="llvmclang">LLVM/Clang</h1> <ul> <li>CbC には、LLVM/Clang 上に実装したものと、GCC で実装したものがある。</li> <li>LLVM とは任意のプログラミング言語の静的コンパイルと 動的コンパイルの両方をサポートできる事を目的としたプロ ジェクトから始まった、モジューラと再利用可能な コンパイラ とツールチェーン技術の集まりである。</li> <li>Clang は高速なコンパイルを目的とした LLVM をバック エンドとした、C/C++/Objective-C の コンパイラ である。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="llvm-crosscompile">LLVM CrossCompile</h1> <ul> <li>Makefile に変更を加えることで LLVM/Clang 上に実装 された CbC で Raspberry Pi で実行できる ARM の コードを生成できるようにCrossCompilerを作ったが、動作していない</li> <li>LLVMかxv6のどちらに修正が必要なのか分かってないのでデバッガを使って調査していく</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="kvm">KVM</h1> <ul> <li>ARM版のxv6をデバッグするためにKVMを使用する。</li> <li>KVMとは完全仮想化を実現できる機能の事である。</li> <li>完全仮想化なので、kernelに変更を加えなくても別のOSを動かせるメリットがある。</li> <li>KVMはqemuによって操作を行う。</li> <li>qemu-system-armはRaspberryPiをサポートしていなかったが、KVMを立ち上げるために使うxmlファイルにarch=’armv7l’ machine=’versatileab’を指定する事で、解決した。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="gcc-crosscompile">GCC CrossCompile</h1> <ul> <li>GCC は C/C++/Objective-C などを様々な言語をコンパイルすることのできるコンパイラである。</li> <li> <p>GCCで実装されたCbCについてはARMのコードを生成するようにMakefileを作成した。</p> </li> <li>Linux上でARMのコードを生成するためのツールチェーンであるgcc-linux-gnuを使う事でxv6をKVM上で動作させる事に成功した。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-1">今後の課題</h1> <ul> <li>LLVMで実装されたLLVMで作成したxv6が動作しない原因をKVMを用いて調べる。</li> <li>必要であれば、xv6またはLLVMを修正していく。</li> <li>xv6kernelの構文に沿ってCbCで書き換える部分を考察する。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="t">T図形</h1> <ul> <li>CbC を Raspberry Pi で動かすためのアプローチの手法をを、I と T の形をした図の組み合わせによって説明を行う。</li> <li>I の上部分に cbclang や Xv6 などのソースコード名を、下部分にその機能の記述言語を記してある</li> <li>T の上部分は左に入力されるファイル、右に出力されるその機能によって出力されるファイルが記され、下部分にその機能の記述言語が記されている。</li> </ul> <div align="center"><img src="./images/examples_2.pdf" style="center" /></div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="linuxcbc">Linux上でのCbCの実装</h1> <ul> <li>OSX上に立ち上げられたLinux で CbC のCrossCompileを行う過程を図に示す。</li> <li>CbCは C によって記述されているため、CからARM形式の.oファイルを生成し、.oからARMのa.outを出力する。</li> <li>これらはARM形式なのでRaspberryPiで実行できるファイルである。</li> </ul> <div align="center"><img src="./images/OSX_Linux_VM.pdf" style="center" /></div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="llvm-crosscompile-makefile">LLVM CrossCompile Makefile</h1> <ul> <li>makefileの一部を下に示す。</li> <li>CCはコンパイラで、すでにmakeしたCbCのコンパイラを指定している。</li> <li>AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。</li> <li>CFLAGS にターゲットオプションで arm-linux-gnueabihfを指定することで、ARMのコードを生成することができる。</li> <li>libgcc</li> </ul> <pre lang="c"><code>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 </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="linuxcpu">LinuxのCPUコア</h1> <ul lang="c"> <li>CPUごとのコア数 18</li> <li>論理プロセッサー 72</li> </ul> <pre><code>+dalmore+one grep cpu.cores /proc/cpuinfo | sort -u cpu cores : 18 +dalmore+one grep processor /proc/cpuinfo | wc -l 72 </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 lang="c" id="osx">OSXコア数</h1> <pre><code>+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 </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 lang="c" id="arm1xml">arm1.xml</h1> <pre><code><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> </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="gcc-crosscompile-makefile">GCC CrossCompile makefile</h1> <ul lang="c"> <li>CC にarm-linux-gnu-gccを指定することでARMのコードを生成できるようになる</li> <li>AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。</li> </ul> <pre><code>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)$@") </code></pre> <!-- === end markdown block === --> </div> </div><!-- presentation --> </body> </html>