Shibuya Pm #9 PerlMachine

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    Shibuya Pm #9 PerlMachine - Presentation Transcript

    1. Perl マシン (PerlMachine) あのLTじゃ理解不能だから もっとkwsk 東京農工大学 wakapon (Asano Kazunari)
    2. 本日の内容
      • PerlMachine について
        • PerlMachine とは
        • 開発のきっかけ
        • 目標とか方針
        • PerlMachine の現状
        • 中身をkwsk
      • 今後の展開
        • 夏休みのしゅくだい
        • 宿題の片付け方
    3. PerlMachine とは
    4. PerlMachine とは
      • 高水準言語マシン ( 単一言語マシン )
        • 特定のプログラミング言語を専用として動作させることを目的とした計算機
        • オペレーティングシステムレベルから特定言語をターゲットにしてシステムを構築する
      • PerlMachine
        • Perl を動かすためにだけ存在する計算機
        • ソフトウェア階層の上から下までぜんぶ Perl で記述
    5. PerlMachine とは
      • ソースコード一式
        • CodeRepos にて
        • http://coderepos.org/share/wiki/Committers/wakapon
      • 入手
        • svn export http://svn.coderepos.org/share/lang/perl/PerlMachine/trunk
    6. 開発のきっかけ
    7. インスパイアされたもの
      • bootperl
        • http://search.cpan.org/~BSMITH/bootperl-0.00_01/
        • x86 がブートして、最初のプロセスでワンライナーが走る
          • perl –e "Hello World ";
        • ベアマシン上で Perl インスタンスが動いている
        • Hello World を表示して終わるなんてもったいない!1、と思った
      • Perl/Linux
        • http://perllinux.sourceforge.net/
        • カーネルは Linux 、ユーザレベルは Perl
        • ユーザレベルを Perl で網羅しようとしていた
        • カーネルが Linux なんてもったいない!!1、と思った
    8. 目標とか方針
    9. PerlMachine の目標
      • 学術的に
        • Perlで記述された高水準言語マシンの実現
      • Perlネタとして
        • bootで終わるのではなく、その先もずっとPerlで
        • ユーザレベルだけではなく、カーネルもぜんぶPerlで
        • Perl5処理系のソースコードと深くお付き合い
      • +α
        • 既存のありがたいCPAN Moduleを積極的に利用
        • 2008-06-24 online since 1995-10-26 6673 authors 13766 modules
    10. PerlMachine の設計方針
      • できる限りPerlで実現させる
        • どうしてもできない場合はXSUBで
      • 世の中にあるPerlのコードは動くようにする
        • 変な俺Perl仕様は作らない
      • 実行速度ってなんですか
        • ・・・
    11. PerlMachine の構成 AP Perl 処理系 インタプリタ キーボード ディスプレイ ディスク NIC マウス Hard- ware Soft- ware Perl C 標準ライブラリ
      • スレッドライブラリ
      • ウィンドウシステム
      • プロトコルスタック
      • ファイルシステム
      • XSUB
      • I/O メモリアクセス
      • 実メモリアクセス
      • デバイスドライバ
      • 各種デバイスドライバ
    12. PerlMachine の構成
      • ターゲットアーキテクチャ
        • PC/AT 互換機 x86
      • Perl 処理系
        • perl5.10.0 の microperl
        • 処理系も AP も特権モードで動作
      • ハードウェア資源管理
        • PerlOS
          • スレッドライブラリ (threads.pm) 作業中
          • ウィンドウシステム (tk.pm) 未定
          • TCP/IP プロトコルスタック 未定
          • etc...
    13. PerlMachine の現状
    14. 実現環境
      • 開発環境
        • windows + linux (VMwarePlayer + ssh + samba)
        • PerlOS は linux 上で gcc でコンパイルし、 samba 経由で windows 上のフロッピーディスクに書込み
      • 実機動作確認環境
      grub ブートローダ Celeron1.7GHz プロセッサ フロッピーディスク 1.44MB ディスク PS/2 接続 キーボード microperl (5.10.0) Perl 処理系
    15. PerlMachine の構成 ( 現状 ) AP main.pl Perl 処理系 microperl インタプリタ キーボード ディスプレイ FD Hard- ware Soft- ware Perl C 標準ライブラリ strict.pm warnings.pm feature.pm Carp.pm
      • 読込み専用 FAT ファイルシステム
      • XSUB
      • I/O メモリアクセス
      • 実メモリアクセス
      • ドライバ
      • 読込み専用 FD ドライバ
      • PIC, キーボードドライバ
      • VRAM ドライバ
    16. 現在までの成果物
      • ベアマシン上でperl5.10.0
        • say, switch-case, defined-or
      • Perlで書いた各種ドライバ
        • 読込み専用ファイルシステムドライバ
          • fat12/16/32, ext2
        • 読込み専用フロッピーディスクドライバ
        • 割込みコントローラドライバ
        • キーボードドライバ
        • VRAMドライバ
    17. ベアマシン上のperl5.10.0
      • 実行したプログラム
      use 5.10.0
    18. ベアマシン上のperl5.10.0
      • シミュレータ上での実行結果
    19. Perlプログラムの実行モデル
      • シングルタスク環境
        • 単一のメモリ空間上で複数のインタプリタインスタンスがシングルタスクで動作
        • 各インスタンスは同一セグメント内に malloc される
        • 各インスタンスはシーケンシャルに実行される
      時間 floppy ドライバ インスタンス floppy_wait; test1 プログラム インスタンス open (IN, '<…'); ファイルシステム インスタンス fs_read (…); test2 プログラム インスタンス print 'hoge'; デバイス操作が完了するまで CPU は何も命令を実行しない
    20. インタプリタインスタンス
      • インタプリタインスタンスとは
        • perl_alloc でメモリ上に作られる Perl インタプリタの実体
        • struct interpreter (perl.h)
        • struct interpreter のメンバは intrpvar.h の中身
        • プログラム中からは PL_xxx として使う (ex. PL_sv_yes)
      • インスタンスの中身
        • スタックポインタ、変数テーブル、 OP-tree 、エントリポイントなど
      • PerlOS のインタプリタインスタンス
        • 複数個生成可能でヒープ領域に配置される
        • 個々のインスタンスは独立
        • 割込み処理を伴う場合は専用のインスタンスを用意
    21. PerlOS のインタプリタインスタンス
      • 現在生成しているもの一覧
        • mainプログラム (動作テスト用)
        • 割込みハンドラとデバイスドライバ
          • キーボードドライバ
          • フロッピーディスクドライバ
            • (+ FATファイルシステムドライバ)
          • 割込みコントローラドライバ
          • VRAMドライバ
      • インスタンスの管理
        • カーネル内にインスタンスtableを作成し、インスタンスポインタを管理
    22. 割込み処理(キーボード)
      • 外部割込み処理
      irq1_entry IDT キーボード割込み インスタンス管理 table usr_prog call_pv キーボードインスタンス our @key_map; sub kb_hdl { … } package KB; フロッピー vram キーボード
    23. 割込み処理(フロッピーディスク)
      • 外部割込み処理
      irq6_entry IDT フロッピー割込み インスタンス管理 table usr_prog call_pv FD インスタンス our $int_flag; sub fd_hdl { … } package FD; フロッピー vram キーボード
    24. 割込み処理を伴う組込み関数の実行
      • 組込み関数 open ・ read ・ close ・ print の実行
        • ドライバ、ファイルシステムは Perl で実装
      # 実行プログラム $| = 1; my $file_path = ‘ /kernel/perl/keyboard.pl’; print “open ”; open (IN, “<$path”); my @buf = <IN>; print join (‘’, @buf); close (IN); print “close ”;
    25. PerlOS の内部処理
      • 動作画面で実行したプログラム
      $| = 1; my $file_path = ‘/kernel/perl/keyboard.pl’; print “open ”; # print open (IN, “<$path”); my @buf = <IN>; # ファイル読込み print join (‘’, @buf); # ファイル読込み close (IN); print “close ”;
    26. ファイル読込みの実行フロー
      • ファイル読込みの場合 ($buf = join ('', <IN>))
        • 処理系内 ( 省略 )
        • libc 内 ( かなり省略 )
          • libc の fread 関数
          • libc の _read 関数
        • PerlOS のファイルシステム内
          • fs_read 関数
          • ファイルシステムインスタンスの取得
          • ENTER, SAVETMPS, PUSHMARK, XPUSHs, call_pv, etc
          • fat_read サブルーチン
            • ファイル名を元にクラスタチェーンを手繰って LBA の取得
          • floppy_read サブルーチン
            • LBA を元にディスク上のデータ取得 ( 割込み )
            • 読込み結果を _read 関数で取得したポインタに書込み
    27. 組込み関数printの実行フロー
      • 画面出力の場合 (print &quot;Hello World &quot;)
        • 処理系内
          • pp_print 関数
          • do_print 関数
        • libc 内
          • printf 関数
          • バッファ処理いろいろ
          • libc の write 関数
          • libc の _write 関数
        • PerlOS の vram ドライバ内
          • vram インタプリタインスタンスの取得
          • ENTER, SAVETMPS, PUSHMARK, XPUSHs, call_pv, etc
          • vram_write_char サブルーチン
          • XSUB の writew 関数
            • ここでデバイスに文字の書込みを実行
    28. 中身をkwsk
    29. PerlMachine の現在の実装
      • PerlMachine = grub + microperl + newlib + FatFs + XSUB + Perl (+ CPAN Modules + pthread)
      • Perl が動き出すまでに利用する C モジュールはまったく自分でコーディングしていない
      • 書いたのは C モジュール同士のつじつま合わせのためのグルーコードと XSUB
    30. ブート
      • grub におまかせ
        • フロッピーディスクを FAT12 でフォーマット
        • PerlOS(/kernel/perlos.o.gz) を主記憶にロードするように menu.lst で指定
        • PerlOS が動き始めるときには 32bit プロテクトモード
      • grub を使うことの利点
        • 32bit プロテクトモードから自分のプログラムを書けばよい
        • プログラムは elf 形式で対応 (PerlOS も elf 形式 )
        • gzip 圧縮は自動的に解凍してくれる
        • module 機能を使えばディスク上のファイルも主記憶にロードしてもらえる
    31. microperl
      • PerlMachine で利用している Perl 処理系
        • Unix ユーティリティ無しに Perl をコンパイルするための Perl 処理系
        • 基本的な機能はすべて動作 (XS モジュールは除く )
        • Makefile.micro にソースファイル一覧
      • uconfig.h でコンフィギュレーション
        • 本番 Perl では config.h にあたるもの
        • OS 環境に依存する関数を使わないように設定できる
        • ポータビリティに優れる
      • PerlOS の microperl
        • MULTIPLICITY マクロを有効 ( マルチインスタンス有効 )
    32. microperl
      • プログラムの実行
        • perlembed そのまま
        • perl_parse で実行プログラムファイル名を指定
        • char *interp_argv[] = {&quot;main&quot;, &quot;main.pl&quot;};
        • PerlInterpreter *interp = perl_alloc ();
        • perl_construct (interp);
        • perl_parse (interp, 0, 2, interp_argv, 0);
        • perl_run (interp);
        • perl_destruct (interp);
        • perl_free (interp);
      • MULTIPLICITY
        • 変数 interp の実体をメモリ上に複数個独立して生成するためのマクロ
        • microperl のデフォルトの Makefile.micro では無効
    33. newlib
      • 組込みシステム向けの libc
        • microperl で要求される C ライブラリをカバー
      • 開発環境の linux 上の gcc でコンパイル
        • nostdinc -nostdlib -fno-builtin –ffreestanding
        • 標準ライブラリを使わないで、 static なバイナリを生成するためのおまじない
    34. FatFs
      • 小規模な組み込みシステム向けの汎用 FAT ファイルシステム・モジュール
        • http://elm-chan.org/fsw/ff/00index_j.html
        • 読込み専用にして使用 #define _READONLY 1
      • 利用目的
        • ブート後に Perl で書かれたドライバ群をロード
        • Perl のファイルシステムドライバをディスクから主記憶にロードするのは FatFs と C で書いたディスクドライバ
        • Perl がロードされた後は FatFs は使わない
        • 将来的には grub の module 機能に差替えるかも
    35. XSUB
      • 純粋なPerlだけだとできない機能
        • XSUBで実現
      • XSUB
        • 主記憶アクセス
        • I/Oポートアクセス
    36. XSUB
      • 主記憶アクセス
        • read[bwl]/write[bwl]
        • sv_2mortal しておけば FREETMPS で SvREFCNT_dec
        • XS (XS_readb)
        • { // バイト単位
        • dXSARGS;
        • ST (0) = sv_2mortal (newSVuv(*((U8 *)SvUV(ST(0)) + SvUV(ST(1)))));
        • XSRETURN (1);
        • }
        • XS (XS_writeb)
        • { // バイト単位
        • dXSARGS;
        • *((U8 *)SvUV(ST(0)) + SvUV(ST(1))) = (U8) SvUV (ST(2));
        • XSRETURN (0);
        • }
    37. XSUB
      • IO ポートアクセス
        • in[bwl]/out[bwl]
        • sv_2mortal しておけば FREETMPS で SvREFCNT_dec
        • XSRETURN_UV は内部で sv_2mortal してくれている
        • XS (XS_inb)
        • {
        • dXSARGS;
        • U16 port = SvUV (ST(0));
        • U8 value;
        • volatile asm (&quot;inb %%dx, %%al&quot; : &quot;=a&quot;(value) : &quot;d&quot;(port));
        • XSRETURN_UV (value);
        • }
    38. XSUB
      • XSUB の登録を perl_parse で行う
        • perl_parse の第 2 引数に XSUB の登録ルーチンを渡す
        • xsinit 関数を用意する
      • newXS/newXS_proto で登録
        • newXS (perl 内でのサブルーチン名 , C 関数ポインタ , __FILE__)
        • void xsinit (pTHX)
        • {
        • newXS (&quot;readb&quot;, XS_readb, __FILE__);
        • newXS (&quot;writeb&quot;, XS_writeb, __FILE__);
        • // 略
        • return;
        • }
    39. XSUB
      • 実際にドライバ内で利用する例
        • フロッピードライバへコマンドを送信
        • sub floppy_send_cmd
        • {
        • my @cmd = @_;
        • foreach my $cmd (@cmd)
        • {
        • # コマンド受付け可能かどうか
        • while (((inb(0x3F4)) & 0xC0) != 0x80)
        • { ; }
        • # コマンド発行
        • outb (0x3F5, $cmd);
        • }
        • }
    40. 今後の展開
    41. 今後の展開
      • マルチタスク環境
        • まずはシングルコアにおけるマルチタスク環境を目指す
        • ithreads で複数インタプリタインスタンス並列化
        • 複数インスタンスをタイムスライスでスケジューリング
      main.pl use threads; my @task = qw(a.pl b.pl); foreach (@task) { my $cv_ref = task_init($_); threads->create($cv_ref, …); } インスタンス A a.pl suspend インスタンス B b.pl インスタンス A a.pl resume 時間 whlie (1) { say 'a'; } whlie (1) { say 'b'; }
    42. 進め方
      • 第 0 段階
        • シングルコア上で C でスレッドライブラリの試作
        • Perl でスレッドライブラリを実現する際のたたき台
      • 第 1 段階
        • 前段階で試作したスレッドライブラリを使って、 pthread インタフェースの作成
        • pthread を利用した ithreads の実現と AP の動作確認
      • 第 2 段階
        • スレッドライブラリを Perl で置き換えたバージョンの作成
        • pthread やスレッド管理を Perl で実現させる
      • ご清聴ありがとうございました

    + Waka PonWaka Pon, 2 years ago

    custom

    1444 views, 0 favs, 0 embeds more stats

    More Info

    © All Rights Reserved

    Go to text version
    • Total Views 1444
      • 1444 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 2
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as innappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel

    Categories

    Tags