343 Views
December 26, 20
スライド概要
uchanが2020年1月にサイボウズ・ラボ株式会社へ転籍したので、1年の振り返りをしました。
サイボウズ・ラボ株式会社で教育向けのOSやCPU、コンパイラなどの研究開発をしています。
サイボウズ・ラボへ転籍 して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++ 第2世代 自作コンパイラ opelac.opl 第1世代 自作コンパイラ コンパイル 第2世代 自作コンパイラ コンパイル ここまでくれば ぐるぐる回せる (はず) 第3世代 自作コンパイラ
OpeLaの進捗 OpeLaコンパイラに基礎的な文法を実装した 四則演算、大小比較 ローカル、グローバル変数 if、for 関数定義と呼び出し ポインタ、配列、文字列 x86-64とAArch64のアセンブラを出力するようにした x86-64のLinuxと、M1 Macで実験可能 [email protected] 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 第2世代 opelac.opl clang++ 第1世代 opelac 自作OS用 opelac.opl 第2世代 opelac これらはLinux用opelac 第3世代 opelac 自作OS用 opelac 自作OS向 けに修正
自作OSのセルフホストを目指して 自作OS my_os.opl 1 自作OS用 opelac.opl 1. 自作OSをLinux用opelacでク ロスコンパイル 2. 自作OS向けに調整した自作 言語処理系をLinux用opelac でクロスコンパイル 3. 自作OSを自作OS用opelacで コンパイル 4. 自作OS向けに調整した自作 言語処理系を自作OS用 opelacでコンパイル 4 2 3 Linux用 opelac 自作OS用 opelac Linux 自作OS
まとめ 内田のラボでの活動テーマは「低レイヤ技術者育成」 MikanOSを作ったよ セキュリティ・キャンプのプロデューサをやったよ OpeLaコンパイラを実装してるよ
【宣伝】サイボウズ・ラボユース 世界に通用する日本の若手エンジニアの発掘と育成が目的 学生の若手クリエイターに研究開発の機会を提供する場 https://labs.cybozu.co.jp/youth.html 「サイボウズ・ラボユース生」 アルバイト代が出る(上限:年間103万円) サイボウズ・ラボ社員からのアドバイスがある 成果物の権利はラボユース生に帰属 成果物を卒論や修論にしてもいいし、売ったりしてもいい 原則としてOSSにする、以外の制約がない