SlideShare una empresa de Scribd logo
1 de 49
Descargar para leer sin conexión
C++でできる!OS自作入門
OS入門へのいざない
C++勉強会in広島
@uchan_nos
そもそもOSとは

•

身近な例 Windows, OS X, Linux, iOS, Android

•

ハードウェアとアプリの橋渡しをするソフト

•

メモリ管理、ハードウェア制御、タスク管理、…
OS自作 #とは

•

Windowsみたいなソフトを自分で作る

•

具体的にどうやって作るのか?
!

•

そんなあなたに『OS自作入門』
  30日でできる!OS自作入門

30日!

マルチタスク

GUI
OS自作の楽しさ
•

自分のコンピュータを支配している感覚

→ ハードウェアを直接いじる

•

普段使ってるOSの裏側を実体験できる

→ メモリ管理、タスク管理ってどうなってる?

•

独自アイデアを盛り込んだOSの創造

→ エミュレータOS、クラウドOS
OS自作の苦労
•

自分がOSなので、OSの助けを借りられない

→ main関数さえ自分で呼び出す

•

画面表示も自分の責任

→ 画面表示にバグがあると涙目

•

エミュレータと実機での差

→ エミュレータだと上手く動いたのに!
BITNOS
•

私が作っているOS

•

NOS = Not Operating System

OSぽい画面のジョークソフト

(Akkie氏命名)

•

Bit NOS : ちょびっとだけNOS

•

5回くらい作り直しているが、
まだ全く完成しない
OS起動プロセス
OSってどうやって起動するの??
OSの起動 MBR読み込み

MBR: Master Boot Record

BIOS
先頭セクタ
= MBR

0x7c00
0x7e00
OSの起動 MBRコピー
0x7a00
0x7c00
0x7e00

MBR
MBR

自身をコピー&
コピー先へジャンプ
OSの起動 パーティション解析

パーティション情報
OSの起動 PBL読み込み

PBL: Partition Boot Loader

MBR

パーティション
先頭セクタ
= PBL

0x7c00
0x7e00

MBR
PBL
OSの起動 なぜMBRをコピーするか
BIOSを模倣するため
•

パーティションがないメディア

→ PBLがディスク先頭

•

BIOSは機械的にディスク先頭を0x7c00に読み込む

•

MBRがPBLを0x7c00に配置し、BIOSを模倣
OSの起動 PBLの仕事

•

FATを解析

•

"BITNOS.SYS"を探してロード
•

•

ローダー+カーネル(2段階ロード)

ロード先へジャンプ
OSの起動 ローダーの仕事
•

BIOSを使う用事を済ます

→ 画面モード設定、キーボードLED状態取得

•

プロテクトモード(32ビットモード)へ移行

•

カーネル部分を、所定の位置へコピー

→ リンカへの指示と合わせる

•

カーネル(kmain)にジャンプ
カーネルの仕事
アプリ アプリ
•

ハードウェア初期化

カーネル
ハードウェア

•

割り込み管理

→ キーボード/マウス、タイマ、ネットワーク

•

タスク管理

•

メモリ管理
OS開発とC++
OS自作入門とC言語
•

『30日でできる!OS自作入門』はC & アセンブリ

•

C言語でキューの実装→だるい
int以外のキュー
struct FIFO32 {
int *buf;
int p, q, size, free, flags;
};

!

も欲しいのだが…

void fifo32_init(struct FIFO32 *fifo, int size, int *buf)
{
fifo->size = size;
fifo->buf = buf;
fifo->free = size;
fifo->flags = 0;
fifo->p = 0;
fifo->q = 0;
}
C++でOS開発
•

先人たち
•

BayOS : C++コンパイラだけで対応可能な機能だけ使用

•

MonaOS : 例外、純粋仮想関数なども使用

•

「gccをg++に置き換えるだけで使える機能」は簡単

•

でも、C++ならそれらしい機能使いたいよね!
•

純粋仮想関数、例外、実行時型情報、new/delete
OS開発におけるC++の楽しさ
•

『30日でできる!OS自作入門』のC言語コードを
改良していく楽しさ
•

•

キューをクラスで実装し直すのが好き

OS開発がオブジェクト指向言語でできる楽しさ
•

継承を使って分かりやすいコード

•

純粋仮想関数ひゃっはー
OS開発におけるC++の苦労
•

『30日でできる!OS自作入門』の開発環境を流用できない
•
•

•

自分でクロスコンパイラを用意
特に川合さん謹製リンカは.ctorsや.rodataに対応しない

C++特有の機能への対応
•

純粋仮想関数、例外、実行時型情報、new/delete、グ
ローバル変数コンストラクタなど
C++特有の機能への対応

•

new

•

純粋仮想関数

•

グローバル変数コンストラクタ
C++特有の機能への対応

•

new

•

純粋仮想関数

•

グローバル変数コンストラクタ
new演算子

•

new演算子は

1)メモリを確保し、2)コンストラクタを呼ぶ

•

OSが空きメモリを探し、メモリを割り当てる

•

g++がコンストラクタ呼び出しコードを追加する
new演算子の実装
void* operator new(size_t size)
{
void* buf = my_malloc(size);
return buf;
}
void* operator new[](size_t size)
{
void* buf = my_malloc(size);
return buf;
}

カーネルの.cppに書いておく
メモリ割り当て - リンクリスト方式
0x1000

Header* current
= (Header*)0x1000;

Allocated

0x2000

size=0xFF8
true

Header* next
= (Header*)(
(uintptr_t)current
+ sizeof(Header)
+ current->size);

size=0xAF8
false

Released

0x2B00

struct Header
{
size_t size;
bool is_allocated;
};
配置new演算子
•

new演算子は

1)メモリを確保し、2)そこでコンストラクタを呼ぶ

•

配置new演算子は

1)指定されたメモリ領域でコンストラクタを呼ぶ

•

プログラマがメモリ領域を与える

•

g++がコンストラクタ呼び出しコードを追加する
配置new演算子の実装
普通のnew

配置new

void* operator new(size_t size)
{
void* buf = my_malloc(size);
return buf;
}
void* operator new(size_t size, void* buf)
{
return buf;
}
配置newの使いドコロ
例えばこんな場面
ScreenRenderer* screen_renderer;
!

void KernelMain(void) {
BIOSで設定した画面解像度など取得;
!

!

}

if (24ビット色モード) {
screen_renderer = new 24ビットレンダラ(解像度);
} else if (32ビット色モード) {
screen_renderer = new 32ビットレンダラ(解像度);
}
…
配置newの使いドコロ
例えばこんな場面
ScreenRenderer* screen_renderer;
!

様々なところで使う
→グローバル変数

void KernelMain(void) {
BIOSで設定した画面解像度など取得;
!

!

}

if (24ビット色モード) {
screen_renderer = new 24ビットレンダラ(解像度);
} else if (32ビット色モード) {
screen_renderer = new 32ビットレンダラ(解像度);
}
…
配置newの使いドコロ
例えばこんな場面
ScreenRenderer* screen_renderer;
!

様々なところで使う
→グローバル変数

void KernelMain(void) {
BIOSで設定した画面解像度など取得;
!

!

}

if (24ビット色モード) {
screen_renderer = new 24ビットレンダラ(解像度);
} else if (32ビット色モード) {
screen_renderer = new 32ビットレンダラ(解像度);
}
…

でもインスタンスは
後で生成したい
→ newを使う
配置newの使いドコロ

•

普通、newは新たなメモリを割り当てる

(コンパイラがコンストラクタ呼び出しコードを自動で追加)

•

メモリ割り当てはOSの仕事

•

割り当て機能が無い段階でnewを使いたい!

•

→ 配置new
配置newの使いドコロ
class A {
int val_;
const char* str_;
public:
A() : val_(41), str_("foo") {}
};

41

確保した
メモリ

41
"foo"

"foo"

new A();

char buf[32];
new(buf) A();

buf
配置newの使いドコロ
配置newで無事解決!
ScreenRenderer* screen_renderer;
char buf[128];
void KernelMain(void) {
BIOSで設定した画面解像度など取得;
!

!

}

if (24ビット色モード) {
screen_renderer = new(buf) 24ビットレンダラ(解像度);
} else if (32ビット色モード) {
screen_renderer = new(buf) 32ビットレンダラ(解像度);
}
…
C++特有の機能への対応

•

new

•

純粋仮想関数

•

グローバル変数コンストラクタ
仮想関数テーブル

•

C++で仮想関数を使うと出てくる用語

•

virtualなメンバ関数のアドレスの表

•

クラス毎に生成され、インスタンスはvtableへのポインタを持つ

class A {
public:
virtual void foo();
virtual void bar();
};

A::foo
A::bar
class A {
public:
virtual void foo();
virtual void bar();
};

class B : public A {
public:
virtual void foo();
};

A's vtable

B's vtable

A::foo
A::bar

B::foo
A::bar
class A {
public:
virtual void foo();
virtual void bar();
};

class B : public A {
public:
virtual void foo();
};

A's vtable

B's vtable

A::foo
A::bar

B::foo
A::bar
B instance
vptr

p1

A* p1 = new B();
class A {
public:
virtual void foo();
virtual void bar();
};

class B : public A {
public:
virtual void foo();
};

A's vtable

B's vtable

A::foo
A::bar

B::foo
A::bar
B instance
vptr
A instance
vptr

p1
p2
A* p1 = new B();
A* p2 = new A();
class A {
public:
virtual void foo();
virtual void bar();
};

class B : public A {
public:
virtual void foo();
};

A's vtable

B's vtable

A::foo
A::bar

B::foo
A::bar
B instance
vptr

A instance
Aのポインタ経由でも
vptr

正しくBのメソッドを呼べる

p1
p2
A* p1 = new B();
A* p2 = new A();
仮想関数テーブル実物
class Base
{
public:
virtual ~Base() {}
virtual int foo() = 0;
virtual int bar() {return 42;}
};
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI4Base)
16 (int (*)(...))Base::~Base
24 (int (*)(...))Base::~Base
32 (int (*)(...))__cxa_pure_virtual
40 (int (*)(...))Base::bar

class MyClass : public Base
{
public:
virtual int foo() {return 43;}
};

0
8
16
24
32
40

(int (*)(...))0
(int (*)(...))(& _ZTI7MyClass)
(int (*)(...))MyClass::~MyClass
(int (*)(...))MyClass::~MyClass
(int (*)(...))MyClass::foo
(int (*)(...))Base::bar
仮想関数テーブル実物
class Base
{
public:
virtual ~Base() {}
virtual int foo() = 0;
virtual int bar() {return 42;}
};
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI4Base)
16 (int (*)(...))Base::~Base
24 (int (*)(...))Base::~Base
32 (int (*)(...))__cxa_pure_virtual
40 (int (*)(...))Base::bar

自分で実装

class MyClass : public Base
{
public:
virtual int foo() {return 43;}
};

0
8
16
24
32
40

(int (*)(...))0
(int (*)(...))(& _ZTI7MyClass)
(int (*)(...))MyClass::~MyClass
(int (*)(...))MyClass::~MyClass
(int (*)(...))MyClass::foo
(int (*)(...))Base::bar
C++特有の機能への対応

•

new

•

純粋仮想関数

•

グローバル変数コンストラクタ
コンストラクタ呼び出し

class MyClass {
int val_;
public:
MyClass() : val_(41) {}
};
!

MyClass global_instance;
!

int main(void) {
…
}

コンストラクタは
誰が呼ぶ?
コンストラクタ呼び出し

class MyClass {
int val_;
public:
MyClass() : val_(41) {}
};
!

MyClass global_instance;
!

コンストラクタは
誰が呼ぶ?

int main(void) {
…
}

→規格では、main関数実行前に呼ばれる
コンストラクタ呼び出し

class MyClass {
int val_;
public:
MyClass() : val_(41) {}
};
!

MyClass global_instance;
!

コンストラクタは
誰が呼ぶ?

int main(void) {
…
}

→規格では、main関数実行前に呼ばれる
誰が呼ぶんだろう?
コンストラクタ呼び出し
処理系が用意
コンストラクタ呼び出し
大域変数0初期化

_start

return

PBL

call
main

普通のアプリ

jump
自分でやる

kmain

カーネル
コンストラクタ呼び出し
.ctors
0x000005A8
0x00001277
0x000018ED

コンストラクタを呼び出す
関数のアドレス

void __call_constructors()
{
typedef void (*ctor_caller_t)(void);
extern int __ctors, __ctors_count;

}

ctor_caller_t* ctors = (ctor_caller_t*)&__ctors;
uarch_t ctors_count = (uarch_t)&__ctors_count;
for (uarch_t i = 0; i < ctors_count; ++i)
{
ctors[i]();
}
まとめ

•

OS自作とは

•

OSの起動シーケンス

•

OSとC++
•

new, 純粋仮想関数、コンストラクタ

Más contenido relacionado

La actualidad más candente

Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテストTakuto Wada
 
CRDT in 15 minutes
CRDT in 15 minutesCRDT in 15 minutes
CRDT in 15 minutesShingo Omura
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
OSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてTakuto Wada
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動uchan_nos
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 

La actualidad más candente (20)

Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
入門 シェル実装
入門 シェル実装入門 シェル実装
入門 シェル実装
 
CRDT in 15 minutes
CRDT in 15 minutesCRDT in 15 minutes
CRDT in 15 minutes
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
OSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係について
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 

Más de 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
 
サイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返るサイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返る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
 

Más de 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もくもく会
 
サイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返るサイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返る
 
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
 

Último

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Último (9)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

C++でできる!OS自作入門