サイボウズ・ラボユース

低レイヤ開発

募集状況:今期募集終了

2026年度に新たに募集予定です。

メンター

内田 公太

テーマの概要

CPU、コンパイラ、OSなど、コンピュータの原理に関わる開発プロジェクトであり、自分が使うために作るもの。

詳しい説明を「その他」に記載しています。是非お読みください。

活動の進め方

普段は個人で開発を進めてもらい、オンラインの定例ミーティングで進捗を確認したり質疑応答を行ったり、コードレビューを実施したりします。 ラボユース活動を効果的なものとするために、定例ミーティングの前に話したいことを整理しておいてください。

  • 基本
    • 日報による活動報告
    • 掲示板上での非同期の質疑応答・アドバイス
    • 週に 1 回 30 分程度のオンラインミーティング
      • 進捗状況の共有
      • 質疑応答
      • 設計開発方針の議論
      • コードレビュー
  • 必要に応じて
    • 追加のオンラインミーティング
    • 追加のコードレビュー

メッセージ

心から作りたいと思うもののサポートをしたいです。 熱い思いがあるなら、実力が伴っていなくても可能な限りサポートしたいと思いますので、臆せずに応募いただければ嬉しいです。

内田が持つ次のような経験を元に、皆さんの研究開発をサポートします。

メンターからの技術・方針面でのサポート内容

  • テーマの詳細、次に実装する機能選択に関する議論
  • テスト駆動開発(TDD)や各種アジャイル手法を用いたソフトウェア開発の指導
  • アルゴリズムや手法を一緒に考える
  • C、C++、Rust、Python、Verilog で書かれたコードのレビュー
  • FPGA、論理回路、電子回路、マイコン、x86-64、PCI、UEFI、USB などの知識の提供
  • 文章執筆やプレゼン発表のアドバイス

過去の成果例

  • xv6 を自作 VMM 上で動かす
  • xv6 にリモートファイルシステム 9P を実装する
  • 自作 OS への USB デバイスドライバの実装
  • MikanOS への Linux 互換レイヤの実装
  • Rust による OS 開発
  • 自作 RISC-V CPU の高速化
  • NAND Only CPU の安定化と高機能化
  • 命令長 3 ビットでチューリング完全な CPU を標準ロジック IC で作る

応募要件

本コースへの応募に際しては、開発に用いるプログラミング言語などの基礎的技能をあらかじめ習得している必要があります。 可能であれば、能力を説明する資料(自作プログラムを載せた GitHub リポジトリや、これまでの活動が分かるブログ記事など)を応募用紙に書いてください。

C言語を例に、言語スキルの到達指標を載せます。 これらが絶対条件ではありませんが、レベル感の参考にしてください。

  • ソースコードの理解:「はじめての OS コードリーディング」や「ゼロからの OS 自作入門」に掲載されているソースコードの各行の動作は分かりますか? 書籍の内容に理解できない箇所があったとしても、ソースコードに関しては、少なくとも構文や動作を理解できる程度のスキルは必要です。
  • プログラムの作成:書籍やウェブサイト等を見ずに、malloc/free を使って双方向リンクリストを実装できますか? 本コースが対象にするような低レイヤの世界では、ポインタを使いこなせる力が必要です。

また、応募用紙には応募するテーマの現在の進捗を記載してください。応募時点ですでに何らかの成果物がある場合は、それを説明してください。まだ構想段階であれば、その構想について書いてください。開発のざっくりしたスケジュールがあれば教えてください(ラボユース期間内に限定してもいいし、ラボユース期間前後を含めていただいても構いません)。

募集期間

本コースは募集期間が通年ではありません。第 15 期のスケジュールを以下に示します。

  • 2025 年 8 月 21 日~8 月 28 日:募集期間(この期間に応募書類を提出してください)
  • 2025 年 9 月 1 日~9 月 12 日頃:書類選考と結果通知
  • 2025 年 9 月 1 日~9 月 26 日頃:面接と結果通知
  • 採択から最長 1 年間:ラボユースで活動

選考方針

低レイヤ開発コースでは次の点を重視します。

  • 具体的にそれを欲しがる人がいること。誰が欲しいか分からないけどあったら良さそうな気がするから作ります、より、自分が(あるいは身近なあの人が)欲しいので作ります、というテーマが望ましいです。
  • 独自性があること。既存のものに不満があるので改良するとか、欲しいものが存在しないから作る、という開発テーマをお待ちしております。

もし、大好きな○○(技術、手法、その他)を使って作品を作りたいという場合、正直にそう言って欲しいと私は思います。 本当は○○が好きだから使うのに、○○を使うことが技術的に有利だとか優れていると無理矢理説明しようとしても、「それをやりたいなら□□の方がいいんじゃないですか」という話になってしまうことが多いからです。 私は○○が好きだからそれを使ってこれを作るのだ、と宣言してもらった方が納得しやすいです(笑) ただし、本当に○○が技術的に優れているのであれば、是非それを主張してください。

自分が欲しいから作る

まず、自分が欲しいから作るという場合、モチベーションが維持しやすいです。モチベーションは開発を続ける一番の原動力です。自分が欲しいということなら、何のために作るのか、それを使って何をしたいのかは自然と明確になっていることでしょう。

また、開発プロジェクトでは常に「どこから作り始めるか、次に何の機能を作るか」がつきまといます。多くの場合は優先度の高い機能から作るのが良いです。欲しいのが自分なら優先度判定はすぐにできるでしょう。誰が使うか分からない場合は判断に迷いが生じます。

自分が欲しいものを作ると、自然と魅力のあるものになっていくと思います。ですので、是非、自分が欲しいと思う開発テーマで応募してください。もし対象ユーザーが自分でない場合でも、具体的なユーザー像を設定して欲しいです。

開発テーマの独自性について

独自のアイデアが含まれる開発テーマをお待ちしております。「独自」といっても、世界初のアイデアを求めているわけではありません(もちろん世界初のアイデアも歓迎しますが!)。例えば、次のようなアイデアは十分に独自性があると考えます。(採択を保証するものではありません)

  • 他の OS が持つ機能を自分の OS にも追加してみる
  • 既存の OSS(例えばテキストエディタ)を自分の OS に移植して動かしてみる
  • 既存の OS を、ほとんど移植されたことのないプログラミング言語に移植する
  • 同じ機能をもつプログラムが他の CPU より省サイズで実現できる CPU を目指す
  • パイプライン実行などの高速化機構を自分の CPU に付け足す
  • 自作コンパイラの実装に必要な最低限の機能だけを持つ CPU を作ってみる
  • 普及せず消えていった面白い仕様をもつ CPU を再現してみる
  • 自作 CPU の上で動く OS を開発する
  • ロボット制御ができる機能を持った CPU を自作する
  • 自作コンパイラと組み合わせて使えるリンカを自作する

逆に独自性がないと考えるのは、例えば、書籍などの資料をなぞるだけの開発テーマです。 「OS や CPU の勉強のために○○という本に沿って実装します」だけでは、残念ながら採択されない可能性が高いです。 プロジェクトの初期段階にそのような知識習得の期間がある分にはかまいませんが、メインテーマには独自アイデアを盛り込んでください。

その他

チーム応募

ラボユースの基本は個人活動ですが、チーム活動も認められる場合があります。チームによる制作に対してラボユースのサポートを受けようと思う場合、応募用紙にはチーム応募であることを明記し、メンバー数や各メンバーの所属・学年などチーム活動の概要を書いてください。

チーム活動の例として第 14 期の BFP チームがあります。メンバー数は 3 人で、定期ミーティングは 3 人まとめてやっていました。

開発テーマについての詳細説明

CPU 開発

CPU の開発自体が目標でも、何か他の開発プロジェクトの一部として CPU を開発するのでもかまいません。独自の CPU と並行して専用のコンパイラやアセンブラ、リンカなどを作るようなテーマも歓迎します。CPU 開発というと論理回路に目が行きますが、命令セットなどのソフト面も対象です、もちろん。

CPU の開発に際しては興味深い要素がたくさんあります。命令セット、レジスタ構成、信号線と命令デコーダなどです。また、CPU の枠を飛び越えて周辺機能を充実させ、MCU(マイコン)として完成度を高めていくような方向性もあるでしょう。自作 CPU から画面に文字や絵を出せたり、キーボード入力ができたり、ネットワーク通信ができたりしたら楽しいですよね。

命令セットは CPU を特徴づける主要な要素です。応募に際しては独自の命令セットを持ったものでも、既存の命令セットを採用したものでもかまいませんが、いずれにせよ独自色がある開発テーマをお待ちしております。

命令セットが独自という場合はそれだけで独自色を出しやすいです。一方、既存の命令セットを採用することで独自性を出す例を考えてみます。実機が手に入らないような珍しい CPU の命令セットを模倣するなんてどうでしょう。「その命令セット向けのプログラムが無改造で動く CPU を作ります」というテーマの場合、既存の命令セットであるからこそ独自性が出ると思います。手に入らない理由は様々だと思います。当時は流行っていたけど古すぎて入手困難になったり、そもそも実機生産数が少なくて入手困難だったり。

コンパイラ開発

コンパイラ開発に関しては、コンパイラだけを開発するテーマは想定していません(だからといって採用されないとも限りませんが)。独自の CPU 向けのコンパイラを作りますとか、CPU とコンパイラを同時並行で作りますとか、そういった「コンパイラと何かの組み合わせ」のようなテーマだと良いかなと思います。

リンカの自作も興味深い領域です。アセンブラよりリンカの方が先に作られた[1]とのことですが、今の時代はなかなか「リンカ自作」をしている人に出会いません。コンパイラは自作しても、最終的に実行可能ファイルにするために使うリンカは既製品という場合が多いのではないでしょうか。

[1]: 低レイヤを知りたい人のためのCコンパイラ作成入門によれば、「アセンブラがまだ使われておらず、機械語で直接コードを書いていた時代」にリンカを説明した書籍が出版されたのだそうです。

OS 開発

私は「OS」を広い意味で捉えています。OS=カーネルに限定せず、デバイスドライバやアプリケーションも OS の重要な構成要素だと思います。人間が便利にコンピュータを利用するには、タスク切り替えやメモリ管理を担当するカーネルはもちろんですが、ドライバやアプリケーションを含めたシステム全体が重要です。本開発コースで扱う OS の対象ハードウェアはパソコンに限らず、マイコンなども歓迎します。自作 CPU(MCU)向けの OS なんて作れたら、非常に面白そうですね。

「OS を作る」と聞くと、メモリ管理プログラムやタスクスケジューラを書くのかと思うかもしれません。それらは OS の大切な側面ですが、他にも、アプリケーションを作る土台としての側面や人間とのインターフェースとしての側面もあるのです。例えば、アプリケーション作りを支援するためには、システムコールや各種ライブラリの整備、分かりやすいドキュメントの充実が必要でしょう。人間にとって分かりやすいインターフェースを提供するためには、どのアプリケーションでも同じ操作ができるように OS が支援したり、目的のファイルを見つけやすくする機能があるといいかもしれません。

自作 CPU に載せる OS を作ろうと思ったとき、OS を動かすためにはページングなどのメモリ管理機構[2]が必要なのでは? 自分の CPU にはまだそういう機能は無いぞ? と思うかもしれません。そういう人は、きっと高機能な OS を想定してしまっているのでしょう。確かに、複数のプロセスが同時並行で動いたり、プロセス同士が干渉できないように保護したり、仮想記憶を提供したり、などといった高度な機能を実装するにはメモリ管理機構が欲しくなります。

[2]: メモリ管理機構(Memory Control Unit)は略して MCU です。マイコン(Microcontroller Unit)も MCU なので、紛らわしいですね。

しかし、そればかりが OS ではないと思います。例えば、SD カード用ドライバを持ち、FAT32 ファイルシステムを認識し、アプリケーションを SD カードから読み出して実行できるソフトウェアを想像してみます。これは「OS」でしょうか? 内田にとって、これは立派な OS です。特に、このようなソフトウェアが自作 CPU で動いたら、とっても感動するのではないでしょうか。


サイボウズ・ラボユースへの応募はこちらから

募集要項・エントリー