OSを手作りするという
趣味と仕事
2021年11月14日
サイボウズ・ラボ株式会社 内田公太
自己紹介
内田公太 @uchan_nos
サイボウズ・ラボ株式会社
教育用OS、言語処理系の研究開発
趣味1:自作OSコミュニティ「osdev-jp」の運営
「自作OSもくもく会」をたまに開催
「自作OSアドベントカレンダー」の設置
趣味2:「uchanの電子工作ラボ」運営
電子回路のはんだ付けや計測の設備
https://uchan.net/lab/
OSとは
Operating System
Microsoft Windows 11 のスクリーンショット Google Android
OS自作とは
ほかのOSの力を借りずに起動する
ソフトウェアを作る
各ハードウェアを制御し、アプリが
動くようにする
ハードウェアに近い世界
パソコンを支配する感覚
「大きな組み込みマイコン」と評す
る人もいる パソコンを支配する人と
支配されるパソコン
※「OS自作」により作られたソフトが「自作OS」
私とOS自作との出会い:OSASK
2000年に初リリース
2005年頃まで開発されていた
国産OS
川合氏が主担当
100KB以下の極小OSイメージ
ウィンドウシステム
プリエンプティブ・マルチタス
ク
OSASKのスクリーンショット
私とOS自作との出会い:初めてのML投稿
中学2年生の11月
OSASKと川合氏に出会って
しばらく後
インターネットコミュニティ
に初めて触れた瞬間
2003年というのは、各家庭に
常時接続インターネットが普
及し始めた頃
皆さんには想像し難いでしょ
うが……
OSASK-MLに私が送った初めてのメール
※ML(メーリングリスト)とは、今でいうDiscordサーバーやLINEグループみたいな感じ
私とOS自作との関わり
2000年 小5:「OS」に出会う
パソコンのOS再インストールがきっかけ
2003年 中2:OSASKに出会う
2005年 高1:「30日でできる!OS自作入門」に出会う
執筆途中の原稿を読ませてもらった
2007年 高3:「はりぼて友の会」として活動
2009年 大2:OS自作の演習講義の補佐
セキュリティ&プログラミングキャンプ2009のOS自作組チューター
2013年 修2:OS自作熱が再燃
2016年 社2:osdev-jpを立ち上げ
2021年 社7:「ゼロからのOS自作入門」を出版
MikanOS:私の自作OS
「ゼロからのOS自作入門」のサ
ンプルOS
現代のPCで起動
64ビットモードで動作
USBマウス、キーボード対応
プリエンプティブ・マルチタスク
FAT32ファイルシステム
ページングによるメモリ管理
30章後のMikanOS
趣味としてのOS自作
趣味としてのOS自作
2000年 小5:OSに出会う
パソコンのOS再インストールがきっかけ
2003年 中2:OSASKに出会う
2005年 高1:「30日でできる!OS自作入門」に出会う
執筆途中の原稿を読ませてもらった
2007年 高3:「はりぼて友の会」として活動
2009年 大2:OS自作の演習講義の補佐
セキュリティ&プログラミングキャンプ2009のOS自作組チューター
2013年 修2:OS自作熱が再燃
2016年 社2:osdev-jpを立ち上げ
2021年 社8:「ゼロからのOS自作入門」を出版
「OS自作」に触れる前
小学3年の頃:自分専用のパソコンを手に入れる
小学5年の頃:パソコンが壊れ、OSの再インストールに挑戦
このときに「OS」というものの存在をうっすら認識
小学6年の頃:親と一緒にPICマイコンを学ぶ
中学1年の頃:C言語に入門、のちにDelphiも
DelphiはGUIソフトを作れるという触れ込みで学んだ
中学2年の頃:フリーソフト探しに熱中
「フリーソフト」とは無料で使えるソフト
• この頃(2000年頃)は「オープンソース」は流行前
Linuxをインストールしたのもこの頃
フリーソフトの宝庫
Vectorのバナー
「OS自作」との遭遇前夜
中学2年の頃、フリーソフト探し中に「OSASK」と出会った
Vectorを徘徊していたら、偶然「OSASK」を発見
国産OSということで興味を持つ
OSASK作者(川合氏)へ連絡を取った
Vector登録版は少々古く、最新版を使う方法を聞いた気がする
当時の最新版は「OSASK/AT 4.5」とかだった気がする
今でもVectorには当時のまま登録されている
「OS自作」との遭遇
OSASKコミュニティでしばらく活動
OSASKのIntroシリーズでプログラミングを学ぶ
Introシリーズ:C言語でOSASKアプリを作る教材
標準Cから飛び出した本格的なアプリ開発ができる
文字の表示から始まり、キー入力、サウンド、グラフィック、…
そのうち、自分でもOSを作ってみたくなる
川合氏にチャット(IRC)で相談
「30日でできる!OS自作入門」を執筆中であると
明かされる
原稿を読ませてもらえることに!
伝説の書籍
仕事としてのOS自作
仕事としてのOS自作
2000年 小5:OSに出会う
パソコンのOS再インストールがきっかけ
2003年 中2:OSASKに出会う
2005年 高1:「30日でできる!OS自作入門」に出会う
執筆途中の原稿を読ませてもらった
2007年 高3:「はりぼて友の会」として活動
2009年 大2:OS自作の演習講義の補佐
セキュリティ&プログラミングキャンプ2009のOS自作組チューター
2013年 修2:OS自作熱が再燃
2016年 社2:osdev-jpを立ち上げ
2021年 社8:「ゼロからのOS自作入門」を出版
サイボウズ・ラボでの仕事
2014年にサイボウズへ新卒入社
2020年にサイボウズ・ラボへ転籍
サイボウズ・ラボではOSや言語処理系(≒コンパイラ)を軸とし
た教育活動が仕事のテーマ
「ゼロからのOS自作入門」の執筆
サイボウズ・ラボユースのメンター
セキュリティ・キャンプの講師
実製品に搭載されるようなOSや言語処理系をがりがり作っている、
というわけではない
自作言語処理系
自作OS
仕事の例:OpeLaプロジェクト
2020年後半~2021年前半
自作OS上で自作言語処理系を動かし、
OSと言語処理系をビルドする
というロマンあふれるプロジェクト
言語処理系を作る途中で、路線変更
OpeLaプロジェクトは凍結
今やってること
「ゼロからのOS自作入門」サポート
質問掲示板(GitHub Issues)に来た質問に回答
毎週土曜日の夜に雑談会を開催し、質問を受け付け
新たな教材づくり
「Cコンパイラの自作」あたりを軸に
「OS自作」ではないけど、関連した技術
FPGAと戯れたりもしている
詳細はまだ秘密
先日開催したFPGA勉強会
何か質問ありますか?
OS自作の何が楽しいの?
普段使っている「OS」の役割、仕組みが分かる
ブラックボックスの中を解明する楽しみ
例:ファイルシステムって具体的に何をしているのか
例:複数のアプリを同時に動かす仕組みとは
PCを自分で操れる
他のOSに邪魔されず、CPUの全機能が使える
USBコントローラも自分で制御する
マイコン組み込み開発が好きな人はハマるかも
他の人にはない開発経験を得られる
OS自作している人は少数派、希少な存在
OSとは
定義はいろいろ
https://e-words.jp/w/OS.html
「OSとは、ソフトウェアの種類の
一つで、機器の基本的な管理や制
御のための機能や、多くのソフト
ウェアが共通して利用する基本的
な機能などを実装した、システム
全体を管理するソフトウェア。」
https://en.wikipedia.org/wiki/Operating
_system#/media/File:Kernel_Layout.svg
OSとは
『30日でできる! OS自作入門』の定義
結局のところ、それぞれの作者が
「これはOSなんだ」と言い張っ
て、周囲の人も「まあそうかな」
と思えばどんなソフトでもOSな
んです。
osdev-jpの立ち上げ
時は過ぎて2012年、サイボウズへインターンに行く
「サイボウズ・ラボユース」というインターン制度
お金をもらって好きなものを開発できるという神制度
2014年、サイボウズへ入社
インフラ基盤のソフトを開発する部署へ
毎年3月に、ラボユースの卒業式&成果発表会に出席
2016年の成果発表会に自作OSメンバーが集結→osdev-jp結成
hikaliumさん、Livaさん、そして私
その場に川合氏もいた
言語処理系とは
プログラミング言語を実行するための基盤
C言語の世界で説明すると……
コンパイラ:C言語で書いたプログラムをアセンブリ言語に変換
アセンブラ:アセンブリ言語プログラムをオブジェクトコードに変換
リンカ:オブジェクトコードをつなぎ合わせて実行ファイルを生成
ライブラリ:よく使う関数などを提供
CPU:実行ファイルに含まれる機械語を実行
コンパイラ
C言語
プログ
ラム
アセンブラ リンカ
CPU
実行
ファイ
ル
言語処理系
ライブラリ
OpeLaはどこまで作ったの?
OpeLa言語のコンパイラを途中まで作った
四則演算はもちろん、if文やfor文、関数などをサポート
ジェネリクスも若干サポート
func main() int {
printf("hello, worldn");
}
extern "C" printf func(*byte, ...) int;
OpeLa言語で書いたハローワールド

OSを手作りするという趣味と仕事