こんにちは。WhatACotton です。応募課題晒しに引き続き参加記も書いていこうかと思います。この記事では1日ずつ追って書いていくのではなく、全体的にどういうことをしていたのかをメインで書いていきたいと思います。
# 目次
- 事前学習期間に何をしていたか
- 開発ゼミで何をしたか
- LT で喋ってきた
- グループワークも盛り上がった
- 色々な人と関わってきた
- 共通講義など
以下、こんな話をしていきたいと思います。
# 本題
# 事前学習期間に何をしていたか
セキュリティキャンプは 8/12 ~ 8/17 の期間で行われたわけですが、それまでの事前学習期間に受講生はゼミごとに課題をこなすことになります。
この期間に何をするかはゼミによって様々ですが CPU 自作ゼミでは、書籍を参考にしながら CPU を作りました。
この書籍の 3 章までを実装すること、また FPGA の基本的な使い方をなぞることが事前課題でした。
書籍には第 2 章までで CPU を自作し、その後、第 3 章で 5 段パイプラインを施すという内容が書かれています。受講生は Discord でやり取りをする1のですが、私は楽しみすぎたので数日で何をやるか聞き、課題を教えてもらった 3 日後くらいまでに 2 章まで終わらせました。(徹夜したので、その後色々寝不足で損をして公開したのはまた別の話…w)
本番 2 週間くらい前から改めて内部実装を理解し、第 3 章まで終わらせました。それまでに前年度のゼミのリポジトリを見て、どのようなことをしていくのかについて少し調べていました。
そこで動かない makefile を見つけて講師に修正してもらい、動かすことができるようになり、そのような状態で本番に望むことになりました。makefile が動いたことで回路を実際にエラボレーションすることができ、キャンプ中の中間目標が達成された状態の CPU を触ることができました。
また、キャンプ以外のいろいろなイベントも教えていただき、ちょこちょこ足を運んでいたので、今回のゼミの範囲を超えた理解にも繋がり、とても有意義な事前準備期間だったと思います。
具体的には ACRi ルームハンズオン2と FPGAX3に参加しました。また期間的にはキャンプ後のイベントですが、 SWEST264にも参加することになり、色々な場所に参加する機会を得ることにもなったので本当に参加できて良かったと思います。
# キャンプ中何をしたか
まず、事前学習で実装した CPU を実際に FPGA に載せるためにはどのようなことをすればよいのか、どのような場所で苦戦するのかについて聞いたあと、実際に一つの苦戦ポイントと戦ってみるというのが第 1 演習でした。具体的にどのように解決したかを説明すると面白くないのであまり詳しいことは載せませんがメモリの読み込み可否と読み込みを最適化して、動作速度の向上を実現することができました。
第 2,第 3 演習は USB シリアル通信である UART 通信を CPU から動かしてみるというものです。第 2 演習が送信、第 3 演習が受信です。
ただ、ここでも具体的に値を送受信するモジュールは講師が作成してくださったものを使用していて、あくまでも私が開発したものはそのモジュール間の通信を担うコネクタです。
CPU からは MMIO(Memory mapped IO)が生えていて、その MMIO からシリアル通信を吐き出すというものです。送信よりも受信のほうが難しかったです。またこのモジュールを作るにあたって、応募課題の ready-valid 通信につながってきました。ちなみにモジュールを作らなくても今回の開発で用いている chisel の組み込み関数を用いることで実現することができます。しかし、私はそのモジュールを使いまわしてイーサネットの通信がやりたかったので、モジュールを作るという選択をしました。
その後は今回はやりませんでしたが、割り込みの実装などが用意されていたようです。その後自分がやりたいことに取り組んでいくこととなります。私はイーサネットの通信に挑戦しました。ロジアナでそれっぽい波形を観測することはできましたが、パソコンでは認識せず、時間が足りなかったのでそこで終了となりました。
ちなみにゼミで使ったリポジトリはこちらです。
# 感想
大分どの演習も苦戦しました。一番苦戦したのは UART の送受信のところです。具体的にどこが大変だったかというと、CPU を自作しているのでもちろん C 言語で書いたコードをコンパイルしてそれをバイナリ(今回は正確には HEX)で保存して実行していくわけですが、C 言語側から見る領域と CPU を内部で見ている領域を同じにすることで C 言語側から CPU の状態を読み取るということを実現しているのです。
私にはこれがなかなか理解できず、苦戦しました。講師曰く普段からラズパイなどのハードウェアとつながっているようなものに触れているとわかりやすいとのことです。私はそもそも低レイヤに入門したのが今年 4 月なので、全く経験がなく、大変でした。しかし一回理解できてからすんなり実装まで行くことができたのでとても嬉しかったです。
私は正直開発ゼミは期間がとても短い中で何らかの成果を出す必要があるため、とても過酷だと思います。特に私のように事前知識がそこまで構築されていない状態で行くとなおさらだと思います。
また、開発環境は万全にしていきましょう。私は arch 系の cachyOS というものを使っていたのですが、パッケージの依存関係が数日前に大爆発してしまい、1 日目はProxmox の NoVNC の窓から Manjaro を起動して、そこで開発をするというとんでも環境で開発していました。なぜかターミナルからは ssh できるのに、開発サーバーに VSCode からアクセスできなかったためです。
コードの編集は NoVNC の窓から行って、make を ssh 越しでターミナルから行うというなんとも奇妙な開発環境でした。更にはファイル転送も全然できず、グーグルドライブ経由でファイルを落としてくるというなんとも最悪な方法を取らざるを得ませんでした。開発が始まって 1 日目の夜に arch linux をインストールし、事なき(?)を得ました。
一応ではありますが、CPU 自作ゼミに参加するならば、linux のコマンドが多少打てることを推奨したいです。なぜなら make を使ってエラボレーションを行ったり、gcc なども RISC-V 向けの特殊なものを使うため、その導入に苦戦するとただでさえ会期は短いのに実行環境で苦戦しかねないからです。ただ、マスターしている必要はまったくなく、講師が丁寧に教えてくれるので、それができないからと言って参加できないというわけではなく、あくまでも私個人がそう思うというだけです。
あと、キャンプの資料には自分の実装したいものを実装することが最終の演習ですが、講師曰くあくまでも目安らしいので、あまり焦らず、目の前の問題を着実にこなしていったほうがいいと思います。私はかなり焦っていた節があったので、同じ轍を踏んでほしくないからです。
# LT で喋ってきた
LT 大会で私はcharis worksのことについて話してきました。かなり下のレイヤーのゼミに参加しているのに、LT で発表する内容はアプリケーションの大分高レイヤーなところを話したので、キャンプ中人と話すときにかなりウケが良かったように感じました。
# グループワークも盛り上がった
私が参加したグループではセキュリティ教育の手法に対して、バイナリかるたを参考にしてログに関するかるたを考案し、なかなか楽しく共同作業ができました。今後、このプロジェクトは続けていく予定です!
# 色々な人と関わってきた
また、様々なゼミの方たちと交流することができました。特にハイパーバイザ周りの話などを詳しく聞いたりすることができ、今まで言葉しか知らなかったようなものへの解像度が上がり、パソコン全体としての動きもかなりふわっとですが理解できてきました。このことがかなり自分にとって大きな成長だったと思います。自分が大きなコンピュータアーキテクチャの中で、どこを触っているのかについてよくわかればわかるほど、周辺のスタックとの結びつきがわかり、自作しているものを発展させるための糸口になると思います。
# 共通講義など
共通講義などでは普段お話を聞くことのできないような人たちから、その現場でどのようなセキュリティに関する問題があるのかについてや、犯罪心理学からの観点からセキュリティに関する分析など、今まで考えたことのないようなものまで聞くことができたのでとても興味深かったです。
# まとめ
セキュリティキャンプはあまりにも楽しかったですし、一瞬でした。よく言われる話ですが、セキュリティキャンプは終わってからが本番なので、これからも精進していきたいなと強く思います。
これからも頑張っていきたいと思います。
-
合格発表後、書類手続きなどが終わると、年度ごとに建てられるセキュリティキャンプの Discord サーバーに案内されます。そこで会期前から講師とコンタクトを取ることができます。 ↩︎