ブログが長らく休止状態になっていたのですが,現在,nlccという完全独自のCコンパイラを開発しています.
https://kozos.jp/nlcc/

nlの意味のひとつは「No Learn, No Listen」で,「何も見ず,聞かず,参考にせずに作る」です.まあ特別そうした確固たるポリシーがあるとかではないですが,そういうやりかたで作ってみたら面白い…というか独自性あるものになるかもと思って,そういうやりかたで作っています.

なのでおそらく,実装や用語や考え方が独自になっている部分が多いと思います.

前段階として,nlshという独自シェル(見ためはtcsh互換)と,nllibcという独自の標準Cライブラリを開発していて,それらと合わせた形で「nlux」として配布しています.

 

一応,gcc(に含まれる,cc1相当)の代替となることを目指して開発しています.

 

nlccやnlshは,nllibcを利用することで,システム標準のライブラリを一切使わずにビルドすることができます.ライブラリ的に完全に閉じてビルドできる,ということです.nllibcはスタートアップやシステムコールラッパーも持っているので,システムが持つそれらも不要です.
さらにnlcc/nlsh/nllibcも,nlccでコンパイルできます.
つまり,nllibcを使ってnlccをビルドして,そのnlccを使ってnllibcをビルドして,さらにそのnllibcを使ってnlccをビルドして...ということができます.

もちろん,システム標準のライブラリ(libc)を使ってビルドしたり,gcc/clang等を使ってビルドすることも可能です.

また,ヘッダファイルはシステム標準のものを使うが,ライブラリの本体はnllibcを使う,という方法でビルドすることも可能です.(ただこの対応はシステム依存部がややこしくなるので,将来的に廃止するかもしれない)

システム標準のヘッダファイルをインクルードしたファイルを,コンパイルすることもできます.(つまりFreeBSDやDebianが持つヘッダファイルもコンパイルを通すことができる,ということです)

FreeBSD/Debian/CentOSでのビルドに対応しています.(ただCentOS対応は将来的に廃止するかもしれない)
要するに,組合せ自由でビルドできる,ということです.

nlccの最大の特徴は,「アーキテクチャ対応する際の対応必要部分を最小限にしてある」という点です.
数百行程度のファイルを用意すれば,それで新規アーキテクチャに対応できます.
数百行のファイルを用意するだけで新しいアーキテクチャに対応できるとしたら,すごく面白いんではないかなと.

 

というように,nllibc使ってシステムのライブラリ使わずビルドできる,組合せ自由でビルドできる,アーキテクチャ対応しやすい,などといった特徴がありますが,まあ大熱血アセンブラ入門の著者がCコンパイラ作ったらこんなふうになるだろう,という考えでそうしてみました.

アーキテクチャ対応しやすいというのは,アーキテクチャ全体を俯瞰して処理や設計を極力共通化することと,ビルトインを充実させることで実現されています.
アーキテクチャ対応する際には,処理に応じたアセンブリの命令を登録するのですが,登録が面倒ならば未登録にしておけば,ビルトインで等価の処理をしてくれます.(もしくは等価の別処理(!=は==の演算での別処理に置き換えるとか)にしてくれます)
たとえばかけ算や割算は,命令を登録しなくてもOKです.登録しなければ,ビルトインが使われます.まあソフトウェア計算になるので要するにループ回した計算になるのでたいへん遅くなりますが,それでもとりあえず動くコードを生成してくれますし,対応の初期はとりあえずビルトインにしておいて検証して後できちんとした命令を登録する,ということが可能です.
まあもちろん,ビルトインが存在する処理に限られます.今のところシフト演算・かけ算・割算・剰余算・ビット反転(~n)・符号反転(-n)はビルトインに置き換え可能,符号拡張・比較演算の一部(==と<以外)は等価の別処理に置き換え可能です.つまりこれらは対応しなくても,とりあえずアーキテクチャ対応することはできます.

 

可変長引数,ビットフィールド,構造体の引数渡しにも対応しています.

(構造体の戻り値にも対応しているが,開放済みスタックを利用しているので不十分だがまあとりあえずは動くと思う)

 

現状,以下のアーキテクチャに対応しています.
x86/x86_64 (実際に動作し,テストセットがすべて通りnlcc自身をセルフビルドできるレベル)
AArch64/ARM/MIPS/PowerPC/Thumb/MIPS16 (とりあえずアーキテクチャ対応のファイルを用意し,アセンブリは出力できるが未検証,というレベル)
OSECPU (実験的実装のレベル)

 

nllibcも様々なアーキテクチャに対応しているので,原理的にはARMやMIPS上でもnllibc使ったセルフビルドができるはず...
(ただしnlccはコンパイラのみなので,プリプロセッサ・アセンブラ・リンカは別途必要)

64ビット対応はしてありますが,ホストが32ビットの場合には,long long のような64ビット値は64ビット値でなく,32ビット値として扱われます.(sizeofでは64ビット値として扱われるが,演算などは32ビットで行われる.なのでひとまず動作はするという感じ)

多種アーキテクチャを意識しているというのはあるのですが,そのぶん,最適化というものをほとんど一切していなくて,生成されるアセンブリの効率は悪いです.
gccでビルドしたnlccと,nlccでビルドしたnlccで,コンパイル速度を比較すると,明らかに遅いです.
原因はいろいろわかってはいるのですが,多種アーキテクチャに対応しやすいことを優先させていて,とりあえず速度向上の改良は後回しとしています.

先日,セキュリティ・キャンプ2017の募集が開始されました.現在,絶賛募集中です.

https://www.ipa.go.jp/jinzai/camp/2017/zenkoku2017.html

 

知らないかたのために説明すると,全国からU-22の学生を集めてセキュリティやその他IT分野の講義や演習を行う合宿演習です.お盆の時期に,4泊5日で行われます.

演習の内容は非常に高度で面白いのと,あと選考に通って参加できるようになれば,交通費・宿泊費・食費・教材費などの負担無く,無料で参加できるというのが嬉しいところです.講師はいろんな有名人が多く,とっても豪華な顔ぶれです.

 

私は集中コースの「言語やOSを自作しよう」というトラックで,組込みOS自作ゼミ」を担当します.

集中コースがどのようなものか,このトラックがどのようなものか,詳しくは以下に書きました.

http://kozos.jp/group/seccamp2017/

 

集中コースがどのようなものかというと,一言でいうと「ハッカソンによるものづくり」です.

セキュリティ・キャンプでは5日間のうち,専門講義は3日間あります.

「集中コース」ではこの3日間を通して,主に「ものづくり」をテーマとして,各自で開発テーマを決めて,ハッカソン形式で開発を行います. 

3日間,どっぷりとものづくりにひたることができるという,ものづくり好きには夢のような時間・環境を提供します. 

ものづくりが好きなひとは,ぜひ応募してほしいです.

youtubeに私のインタビューが出ているので,そっちも参考にしてください.応募についての話もあります.

https://www.youtube.com/watch?v=1cyWNT-3Aog

 

机上で議論するだけでなく実際にものづくりをすることで,コンピュータの動作原理を地に足ついた形で知り,脆弱性の根本原理を理解し本質的な対策を考えられ,そして実際に対策物を自分で作ることができるという素養を養う,というのが目的です.

 

ちなみに名前は「セキュリティ・キャンプ」ですが,セキュリティやっていないと参加できないかというと,そういうわけでもありません.個人的には,「もともと他の分野をやっていてセキュリティは興味無かった人が,セキュリティ・キャンプに参加することでセキュリティにも興味を持つようになった」というような「きっかけ」を作ることができればいいなと思っています.そういう卒業生も過去にいっぱいいます.

私自身も,もともとは組込み分野が専門でセキュリティにはあまり興味ありませんでしたが,セキュリティ・キャンプの講師をやるようになって,セキュリティにも興味を持つようになりました.

なので,「ものづくり大好きだけどセキュリティはやったことがありません」という人はむしろ大歓迎です!

 

応募ですが,今回は「選択コース」と「集中コース」の2つのコースがあります.

選択コースは5つのトラックがあります.選択コースに応募いただいた場合,選考に通ると,その5つのトラックから受講したい講義を,講義ごとに選んでいただくことになります.選ぶのは参加決定した後です.

集中コースは3つのトラックがあります.集中コースに応募いただく場合には,どのトラックを受講したいか応募の段階で決めて,そのトラックに対して応募していただくことになります.

ちなみに「選択コースと集中コース」や「集中コースのあるトラックと別のトラック」のようにして,重複して応募することはできません.(重複ある場合,どちらかが無効になります)

なのでセキュリティ・キャンプ2017では,選択コースにするか,集中コースのどのトラックにするかを選んだ上で,応募していただくことになります.

さらに集中コースでは,トラックによってはその中がゼミとして細分化されていて,どのゼミに入りたいかを選んで応募していただくことになります.

 

「SecHack365」という,若手セキュリティ人材育成プログラムが今年度よりスタートします.

主催はNICT(情報通信研究機構)です.

 

https://sechack365.nict.go.jp/


年間かけて,オンラインでハッカソンを行うのですが,2ヵ月に1箇所くらいのペースで各地を巡業し,見学会などのイベントなども行われます.

 

対象はU-25です.学生は無料で参加できます.

(社会人でも参加可能ですが,交通費や宿泊費などの実費が必要)

 

ハッカソンの際には,実行委員の大人たちが開発やアイディア出しなどをサポートします.

で,私もその実行委員として参加します.

またNICTの"NONSTOP"というクラウド開発環境が,オンラインで使えます.NONSTOP上の膨大な蓄積データを使って,研究や開発を行うことができます.

まあ詳しいことは,リンク先を見てみてください.

 

応募は課題ファイル申込期限が4月25日(火), 課題ファイル提出期限が4月28日(金) 17時必着です.
我こそはと思うひとはぜひ応募を!

 

久々の告知です.

3月のオープンソースカンファレンス2017Tokyo/Spring内で,コミュニティオリジナル企画として,今岡通博さんといっしょにいくつかのセミナーを実施します.

オープンソースカンファレンス2017Tokyo/Spring
https://www.ospn.jp/osc2017-spring/

コミュニティ オリジナル企画
https://www.ospn.jp/osc2017-spring/modules/article/article.php?articleid=5

ひとりプロジェクトの会
http://kozos.jp/group/hitori-prj-meeting/index.html

通常のセミナー枠でなく,長めの時間をとってコアな内容のセミナーを実施します.
要するに,マニアックな内容で参加者数とかをあまり考えずにやってみるという感じです.
日程・プログラムは以下です.
参加登録などはとくにありませんので,ご自由にご参加ください.

 

  • 日時 3月10日(金) 11:00-17:00
  • 場所 明星大学 日野キャンパス 26号館 510教室 (5F)
 
  • 11:00~12:50 「パケット大運動会ハンズオン」
    • 【担当】 坂井弘亮
    • 【概要】
      「パケット大運動会」は,指示されたネットワーク・パケットをいち早く作成 してサーバに送れば得点という競技です.時間中はサーバを立ち上げておきます ので,自由に参加して挑戦することができます.
      最初にバイナリエディタによるパケット作成の方法を説明します. パケットの作成方法について知りたいかたは,最初から参加してください.
      手作業によるパケット作成により,ネットワークの仕組みやパケットの構造を 実践的に知ることができます.
 
  • 13:00~14:50 「LANケーブル改造によるノード間のパケットモニタリング」
    • 【担当】 今岡通博
    • 【概要】
      LAN内のパケットをモニタリングすることはネットワークの理解を深めるるうえで 非常に有効な手段のひとつである。しかしスイッチングハブが一般的に なったためセキュリティ面では強化された一方、LAN内の他のノード間の パケットモニタリングすることが困難となった。 リピータハブを用いる方法もあるがスイッチングハブと比較し希少かつかなり 高価となった。 そこで容易かつ安価な方法でLAN内のパケットをモニタリングする手法を 紹介する。
      • リピーターHUBを使う方法
      • スプリッターを使う方法
      • LANケーブルを改造する方法
      • ミノムシクリップと改造ケーブルで活線LANから行う方法
 
  • 15:00~16:50 「SECCON2016決勝大会 マルチアーキ・デバッグプロトコル問題解説」
サーバ見直しを行っているのですが,以下のページがほとんど利用されていないので閉鎖しようかと思っています.
1週間くらいで閉鎖しますので,必要コンテンツなどあるかたはダウンロードしておいてください.

KOZOSのwikiのページ
http://wiki.kozos.jp/

「熱血!アセンブラ入門」の掲示板
http://bbs.kozos.jp/