view slide/thesis.html @ 5:0aabd94a0126

スライド修正
author tobaru
date Wed, 21 Feb 2018 15:39:20 +0900
parents d0d503dd3fd5
children 3a99fc0296ce
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/projection.css"   media="screen,projection">
<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>

<script>
  $(document).ready( function() {
    Slideshow.init();

    $('code').each(function(_, el) {
      if (!el.classList.contains('noprettyprint')) {
        el.classList.add('prettyprint');
      }
    });
    prettyPrint();
  } );

  
</script>

<!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
<!--[if IE]>
<script src="s6/js/jquery.microsoft.js"></script>
<![endif]-->



</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-21 15:36:39 +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="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.png" 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="linux-crosscompile">Linux CrossCompile</h1>
<ul>
  <li>Linux環境でCbCを動かす際にCrossCompileを行なう方法がある。</li>
  <li>RaspberryPiはARMのコードを生成するので、LinuxでもCrossCompileによってARMのコードを生成すればRaspberry Pi でも実行可能なファイルを作ることができる。</li>
  <li>C言語で書かれた簡単なファイルをCrossCompileしたコマンドを示す。</li>
</ul>

<pre lang="c"><code>./bin/clang -target arm-linux-gnueabi -mfpu=neon-fp16 -marm
-I /net/open/Linux/arm/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/include/
 hello.c -c -mfloat-abi=hard
</code></pre>


</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="xv6">xv6</h1>
<ul>
  <li>マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 とい う OS を ANSI-C に書き換え、x86 に移植した Xv6 OS である。Xv6 は Raspberry Pi に 移植する事ができる。ANSI-C で書かれている Xv6 を CbC に書き直す事で、Raspberry Pi で CbC を動かせるようになる。</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="llvmclang">LLVM/Clang</h1>
<ul>
  <li>CbC には、LLVM/Clang 上に実装したものと、GCC で実装したものがある。</li>
  <li>LLVM とは任意のプログラミング言語の静的コンパイルと 動的コンパイルの両方をサポートできる事を目的としたプロ ジェクトから始まった、モジューラと再利用可能な compiler とツールチェーン技術の集まりである。</li>
  <li>Clang は高速なコンパイルを目的とした LLVM をバック エンドとした、C/C++/Objective-C の compiler である。</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="llvm-crosscompile">LLVM CrossCompile</h1>
<ul>
  <li>Makefile に変更を加えることで LLVM/Clang 上に実装 された CbC で Raspberry Pi で実行できるような ARM の コードを生成できるように実装した。</li>
  <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="gcc-crosscompile">GCC CrossCompile</h1>
<ul>
  <li>GCC は C/C++/Objective-C などを様々な言語をコンパイルすることのできるコンパイラである。</li>
  <li>GCCで実装されたCbCについてもARMのコードを生成するようにMakefileを実装した。</li>
  <li>CC にarm-linux-gnu-gccを指定することでARMのコードを生成できるようになる</li>
  <li>AS(アセンブラ)やLD(リンカー)はarm-linux-gnuに続くコマンドを指定する。</li>
</ul>

<pre lang="c"><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 $&lt;, "  LINK     $(TARGET_DIR)$@")
OBJCOPY_INIT = $(call quiet-command,$(OBJCOPY) ¥
        -S -O binary --prefix-symbols="_binary_$@" $@.out $@, "  OBJCOPY  $(TARGET_DIR)$@")
</code></pre>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h1 id="section">今後の課題</h1>

<p>Xv6 で CbC が動くようになれば、Raspberry Pi 以外のハードウェアでの実装も容易に なるので、Linux 上での実装を目指して研究を進めていく。xv6 で CbC が動けば、続け て Linux 上で Gears OS の実装も行なっていく。</p>

<!-- === end markdown block === -->
</div>


</div><!-- presentation -->
</body>
</html>