SlideShare a Scribd company logo
1 of 15
サイボウズ・ラボへ転籍
して1年を振り返る
2020年12月26日
忘れないゼミ@Discord
サイボウズ・ラボ 内田公太
自己紹介
名前:内田公太
Twitter:@uchan_nos
2018年~東京工業大学 情報工学系 特任助教(週2)
2020年~サイボウズ・ラボ株式会社(週3)
2008年にロ技研入部
2012年6月~2013年3月:サイボウズ・ラボユース第2期生
2014年4月~2020年1月:サイボウズ株式会社
2020年1月~現在:サイボウズ・ラボ株式会社
みなさん、この本知ってますか?
• 2006年に出版された
• 30日かけてOSを手作りする
• 内田はこの本でOSを学んだ
• 中学2年頃に川合さんから原稿を
渡されて読んでた
• 内田のバイブル的存在
低レイヤ技術者育成
内田のラボでの活動テーマは「低レイヤ技術者育成」
2020年のラボカツ
現代のPCで動く教育用OSの開発
『30日でできる!OS自作入門』の「はりぼてOS」はもう起動しない
セキュリティ・キャンプ全国大会 2020 オンライン
低レイヤ技術に明るい若者の発掘・育成をするよ
OSと言語処理系を全部自作するOpeLaプロジェクト
セルフホストなOS+言語処理系を自作するという夢を追い求めるよ
ラボカツ1:教育用OSの開発
MikanOS
未完、蜜柑
 https://github.com/uchan-nos/mikanos
MikanOSの特徴
UEFIで起動
64ビットモードで動作
USBマウス・キーボードが使える
ページングによるメモリ管理
MikanOSの見た目
東工大での自作OSの授業
システム開発プロジェクト応用第二
シラバス
http://www.ocw.titech.ac.jp/index.php?module=General&action=T0300&GakubuCD=4&GakkaCD=342323&KeiCD=23&course=23&KougiCD=202004868&Nendo=2020&vid=03
今年限りの講義
200分×7回で自作OSの全体像を舐めていく
オペレーティングシステム / UEFIと64ビット環境
画面描画とフォント / PS/2とUSBマウス
APICと割り込み / メモリ管理
タイマー / マルチタスク
ファイルシステム / アプリケーション
アドレス変換 / システムコール
アプリによるファイル読み書き / アプリのメモリ管理
ラボカツ2:セキュリティ・キャンプ
「システムソフトウェア自作トラック」のプロデュースを担当
今年も多数の低レイヤ人材を輩出!
システムソフトウェア自作トラック:
コンピュータシステムの基盤となるシステムソフトウェアを実際
に手を動かして作ることで理解を深める
OS
データベース
Cコンパイラ
ラボカツ3:OpeLaプロジェクト
セルフホストなOSと言語処理系を自作
OpeLa OS
OpeLa言語仕様とコンパイラ
x86-64/AArch64アセンブラ
リンカ、ライブラリ、ビルドツール
OpeLaを道具として、低レイヤに興味
ある若い人を発掘・育成したい
ドキュメント
https://github.com/osdev-jp/osdev-jp.github.io/wiki/uchan-OpeLa
自作コンパイラ
ソースコード
第1世代
自作コンパイラ
入力
第2世代
自作コンパイラ
コンパイル
セルフホスト:
自分自身をコンパイルすること
自作言語をセルフホストする道のり
第1世代
自作コンパイラ
opelac.cpp
clang++
入力
第1世代
自作コンパイラ
コンパイル
第2世代
自作コンパイラ
opelac.opl
書き直し
コンパイル
入力
第2世代
自作コンパイラ
コンパイル
第3世代
自作コンパイラ
入力
ここまでくれば
ぐるぐる回せる
(はず)
OpeLaの進捗
OpeLaコンパイラに基礎的な文法を実装した
四則演算、大小比較
ローカル、グローバル変数
if、for
関数定義と呼び出し
ポインタ、配列、文字列
x86-64とAArch64のアセンブラを出力するようにした
x86-64のLinuxと、M1 Macで実験可能
lewing@isc.tamu.edu Larry Ewing and The GIMP https://www.apple.com/jp/mac/m1/
OpeLa言語によるRPN
func main() {
var stk [128]int;
stk_i := 0;
var a int;
var b int;
var buf [128]char;
bytes := read(0, &buf[0], 128);
p := &buf[0];
for i := 0; i < bytes; i += 1 {
if p[i] == ' ' || p[i] == 'n' {
} else if p[i] == '+' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a + b;
stk_i -= 1;
} else if p[i] == '-' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a - b;
stk_i -= 1;
} else if p[i] == '*' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a * b;
stk_i -= 1;
} else if p[i] == '/' {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a / b;
stk_i -= 1;
} else { // digit
stk_i += 1;
stk[stk_i] = p[i] - '0';
}
}
var s [2]char;
s[0] = stk[stk_i] + '0';
s[1] = 'n';
write(1, &s[0], 2);
}
extern "C" read func(fd int, s *char, n int) int;
extern "C" write func(fd int, s *char, n int) int;
【完全版】自作セルフホストの道のり
第1世代
opelac.cpp
clang++
第1世代
opelac
第2世代
opelac.opl
第2世代
opelac
第3世代
opelac
自作OS用
opelac.opl
自作OS向
けに修正
自作OS用
opelacこれらはLinux用opelac
自作OSのセルフホストを目指して
1. 自作OSをLinux用opelacでク
ロスコンパイル
2. 自作OS向けに調整した自作
言語処理系をLinux用opelac
でクロスコンパイル
3. 自作OSを自作OS用opelacで
コンパイル
4. 自作OS向けに調整した自作
言語処理系を自作OS用
opelacでコンパイル
自作OS
my_os.opl
Linux用
opelac
Linux 自作OS
自作OS用
opelac.opl
自作OS用
opelac
1
2 3
4
まとめ
内田のラボでの活動テーマは「低レイヤ技術者育成」
MikanOSを作ったよ
セキュリティ・キャンプのプロデューサをやったよ
OpeLaコンパイラを実装してるよ
【宣伝】サイボウズ・ラボユース
世界に通用する日本の若手エンジニアの発掘と育成が目的
学生の若手クリエイターに研究開発の機会を提供する場
https://labs.cybozu.co.jp/youth.html
「サイボウズ・ラボユース生」
アルバイト代が出る(上限:年間103万円)
サイボウズ・ラボ社員からのアドバイスがある
成果物の権利はラボユース生に帰属
成果物を卒論や修論にしてもいいし、売ったりしてもいい
原則としてOSSにする、以外の制約がない

More Related Content

What's hot

つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定
つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定
つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定Naoki Akai
 
非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】
非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】
非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】Hiroyuki Ishikawa
 
セッション「それっぽい」ウェブサイトを作る
セッション「それっぽい」ウェブサイトを作るセッション「それっぽい」ウェブサイトを作る
セッション「それっぽい」ウェブサイトを作るSora Arakawa
 
ARLT_24_vue.jsで作るwebアプリ
ARLT_24_vue.jsで作るwebアプリARLT_24_vue.jsで作るwebアプリ
ARLT_24_vue.jsで作るwebアプリarcircle tmu
 
セッション「ミニプログラムで変わるスマホアプリ」
セッション「ミニプログラムで変わるスマホアプリ」セッション「ミニプログラムで変わるスマホアプリ」
セッション「ミニプログラムで変わるスマホアプリ」Sora Arakawa
 
高校の文化祭でデジタルサイネージを作ってみた
高校の文化祭でデジタルサイネージを作ってみた高校の文化祭でデジタルサイネージを作ってみた
高校の文化祭でデジタルサイネージを作ってみたSora Arakawa
 
Web × プログラミング ~JavaScript編~(2017/2/16)
Web × プログラミング ~JavaScript編~(2017/2/16)Web × プログラミング ~JavaScript編~(2017/2/16)
Web × プログラミング ~JavaScript編~(2017/2/16)Hiroyuki Ishikawa
 
アイマスハッカソン2018 in 京都 進行スライド
アイマスハッカソン2018 in 京都 進行スライドアイマスハッカソン2018 in 京都 進行スライド
アイマスハッカソン2018 in 京都 進行スライドcrssnky
 
20180416 jp stripes_fukuoka_vol3_public
20180416 jp stripes_fukuoka_vol3_public20180416 jp stripes_fukuoka_vol3_public
20180416 jp stripes_fukuoka_vol3_publicHideki Ojima
 
20180706 jp stripes_okinawa_kickoff
20180706 jp stripes_okinawa_kickoff20180706 jp stripes_okinawa_kickoff
20180706 jp stripes_okinawa_kickoffHideki Ojima
 
姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返る
姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返る姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返る
姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返るJun Nogata
 
DiとDIコンテナについて
DiとDIコンテナについてDiとDIコンテナについて
DiとDIコンテナについてAkiko Sugawa
 
2015 7-4-innovation egg4th-lt-upload-version
2015 7-4-innovation egg4th-lt-upload-version2015 7-4-innovation egg4th-lt-upload-version
2015 7-4-innovation egg4th-lt-upload-versionMasaya Hayashi
 
20180116 jp stripes_福岡_vol2
20180116 jp stripes_福岡_vol220180116 jp stripes_福岡_vol2
20180116 jp stripes_福岡_vol2Hideki Ojima
 
サオリチラシ
サオリチラシサオリチラシ
サオリチラシshiarashiara
 
若者が勉強会に参加しない問題
若者が勉強会に参加しない問題若者が勉強会に参加しない問題
若者が勉強会に参加しない問題Makoto Henmi
 
会津Swift開発合宿振り返り
会津Swift開発合宿振り返り会津Swift開発合宿振り返り
会津Swift開発合宿振り返りKenji Tanaka
 

What's hot (18)

つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定
つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定
つくばチャレンジ2020第1回LT大会 環境変化に頑健なLiDARベースの自己位置推定
 
非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】
非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】
非(エンジニア|プログラマ)でも知っておきたい正規表現【第5回 WordBench山口 セッション2】
 
セッション「それっぽい」ウェブサイトを作る
セッション「それっぽい」ウェブサイトを作るセッション「それっぽい」ウェブサイトを作る
セッション「それっぽい」ウェブサイトを作る
 
ARLT_24_vue.jsで作るwebアプリ
ARLT_24_vue.jsで作るwebアプリARLT_24_vue.jsで作るwebアプリ
ARLT_24_vue.jsで作るwebアプリ
 
セッション「ミニプログラムで変わるスマホアプリ」
セッション「ミニプログラムで変わるスマホアプリ」セッション「ミニプログラムで変わるスマホアプリ」
セッション「ミニプログラムで変わるスマホアプリ」
 
高校の文化祭でデジタルサイネージを作ってみた
高校の文化祭でデジタルサイネージを作ってみた高校の文化祭でデジタルサイネージを作ってみた
高校の文化祭でデジタルサイネージを作ってみた
 
AizuVR LT
AizuVR LTAizuVR LT
AizuVR LT
 
Web × プログラミング ~JavaScript編~(2017/2/16)
Web × プログラミング ~JavaScript編~(2017/2/16)Web × プログラミング ~JavaScript編~(2017/2/16)
Web × プログラミング ~JavaScript編~(2017/2/16)
 
アイマスハッカソン2018 in 京都 進行スライド
アイマスハッカソン2018 in 京都 進行スライドアイマスハッカソン2018 in 京都 進行スライド
アイマスハッカソン2018 in 京都 進行スライド
 
20180416 jp stripes_fukuoka_vol3_public
20180416 jp stripes_fukuoka_vol3_public20180416 jp stripes_fukuoka_vol3_public
20180416 jp stripes_fukuoka_vol3_public
 
20180706 jp stripes_okinawa_kickoff
20180706 jp stripes_okinawa_kickoff20180706 jp stripes_okinawa_kickoff
20180706 jp stripes_okinawa_kickoff
 
姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返る
姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返る姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返る
姫路IT系勉強会 Vol.12 2012年の姫路IT系勉強会を振り返る
 
DiとDIコンテナについて
DiとDIコンテナについてDiとDIコンテナについて
DiとDIコンテナについて
 
2015 7-4-innovation egg4th-lt-upload-version
2015 7-4-innovation egg4th-lt-upload-version2015 7-4-innovation egg4th-lt-upload-version
2015 7-4-innovation egg4th-lt-upload-version
 
20180116 jp stripes_福岡_vol2
20180116 jp stripes_福岡_vol220180116 jp stripes_福岡_vol2
20180116 jp stripes_福岡_vol2
 
サオリチラシ
サオリチラシサオリチラシ
サオリチラシ
 
若者が勉強会に参加しない問題
若者が勉強会に参加しない問題若者が勉強会に参加しない問題
若者が勉強会に参加しない問題
 
会津Swift開発合宿振り返り
会津Swift開発合宿振り返り会津Swift開発合宿振り返り
会津Swift開発合宿振り返り
 

More from uchan_nos

MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するuchan_nos
 
OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事uchan_nos
 
小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器uchan_nos
 
トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路uchan_nos
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトuchan_nos
 
自作言語でお絵描き
自作言語でお絵描き自作言語でお絵描き
自作言語でお絵描きuchan_nos
 
OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会uchan_nos
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道uchan_nos
 
Security Nextcamp remote mob programming
Security Nextcamp remote mob programmingSecurity Nextcamp remote mob programming
Security Nextcamp remote mob programminguchan_nos
 
Langsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPSLangsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPSuchan_nos
 
OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作uchan_nos
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装uchan_nos
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPGuchan_nos
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osuchan_nos
 
Building libc++ for toy OS
Building libc++ for toy OSBuilding libc++ for toy OS
Building libc++ for toy OSuchan_nos
 
プランクトンサミットの歴史2019
プランクトンサミットの歴史2019プランクトンサミットの歴史2019
プランクトンサミットの歴史2019uchan_nos
 
Introduction of security camp 2019
Introduction of security camp 2019Introduction of security camp 2019
Introduction of security camp 2019uchan_nos
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2uchan_nos
 
USB3 host driver program structure
USB3 host driver program structureUSB3 host driver program structure
USB3 host driver program structureuchan_nos
 

More from uchan_nos (20)

MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続する
 
OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事
 
小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器
 
トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
 
自作言語でお絵描き
自作言語でお絵描き自作言語でお絵描き
自作言語でお絵描き
 
OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道
 
Security Nextcamp remote mob programming
Security Nextcamp remote mob programmingSecurity Nextcamp remote mob programming
Security Nextcamp remote mob programming
 
Langsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPSLangsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPS
 
OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
 
Building libc++ for toy OS
Building libc++ for toy OSBuilding libc++ for toy OS
Building libc++ for toy OS
 
プランクトンサミットの歴史2019
プランクトンサミットの歴史2019プランクトンサミットの歴史2019
プランクトンサミットの歴史2019
 
Introduction of security camp 2019
Introduction of security camp 2019Introduction of security camp 2019
Introduction of security camp 2019
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2
 
Timers
TimersTimers
Timers
 
USB3 host driver program structure
USB3 host driver program structureUSB3 host driver program structure
USB3 host driver program structure
 

サイボウズ・ラボへ転籍して1年を振り返る