SlideShare a Scribd company logo
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, 純粋仮想関数、コンストラクタ

More Related Content

What's hot

DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
uchan_nos
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
Kota Saito
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
Tomoya Kawanishi
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspec
ikdysfm
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
研究効率化Tips Ver.2
研究効率化Tips Ver.2研究効率化Tips Ver.2
研究効率化Tips Ver.2
cvpaper. challenge
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
 

What's hot (20)

DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
Map
MapMap
Map
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspec
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
研究効率化Tips Ver.2
研究効率化Tips Ver.2研究効率化Tips Ver.2
研究効率化Tips Ver.2
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
 

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
 
サイボウズ・ラボへ転籍して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 programming
uchan_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 LPS
uchan_nos
 
OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作
uchan_nos
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
uchan_nos
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG
uchan_nos
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
uchan_nos
 
Building libc++ for toy OS
Building libc++ for toy OSBuilding libc++ for toy OS
Building libc++ for toy OS
uchan_nos
 
プランクトンサミットの歴史2019
プランクトンサミットの歴史2019プランクトンサミットの歴史2019
プランクトンサミットの歴史2019
uchan_nos
 
Introduction of security camp 2019
Introduction of security camp 2019Introduction of security camp 2019
Introduction of security camp 2019
uchan_nos
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2
uchan_nos
 
Timers
TimersTimers
Timers
uchan_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もくもく会
 
サイボウズ・ラボへ転籍して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
 

Recently uploaded

Kyndryl Developer Services のご紹介 2024年7月
Kyndryl Developer Services のご紹介  2024年7月Kyndryl Developer Services のご紹介  2024年7月
Kyndryl Developer Services のご紹介 2024年7月
Takayuki Nakayama
 
【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models
【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models
【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models
Sony - Neural Network Libraries
 
「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析
「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析
「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析
Hironori Washizaki
 
能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて
能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて
能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて
Tetsuya Nihonmatsu
 
MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。
MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。
MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。
iPride Co., Ltd.
 
2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ
2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ
2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ
Tatsuya Ishikawa
 
「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン
「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン
「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン
shogotaguchi
 
【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説
【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説
【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説
TsuyoshiSaito7
 
Matsuo-Iwasawa lab. Research Unit Introduction
Matsuo-Iwasawa lab. Research Unit IntroductionMatsuo-Iwasawa lab. Research Unit Introduction
Matsuo-Iwasawa lab. Research Unit Introduction
Matsuo Lab
 
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
Takuya Minagawa
 
MOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツール
MOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツールMOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツール
MOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツール
TsuyoshiSaito7
 

Recently uploaded (11)

Kyndryl Developer Services のご紹介 2024年7月
Kyndryl Developer Services のご紹介  2024年7月Kyndryl Developer Services のご紹介  2024年7月
Kyndryl Developer Services のご紹介 2024年7月
 
【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models
【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models
【AI論文解説】LLMの事前学習をvisionに適用する手法Autoregressive Image Models
 
「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析
「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析
「スマートエスイー」におけるスマートシステム&サービスおよびDX推進人材の産学連携育成ならびに参照モデルに基づく育成プログラム分析
 
能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて
能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて
能動的サイバー防御の時代へ - GPTsから垣間見えた私達と未来のAIについて
 
MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。
MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。
MySQLの文字コードと照合順序について 2024/07/05の勉強会で発表されたものです。
 
2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ
2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ
2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ
 
「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン
「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン
「福利厚生をコストから投資へ」AIで社員1人ひとりに最適な支援を届ける 全く新しいカフェテリアプラン
 
【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説
【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説
【GPT4-o越えのリアルタイム会話AI】kyutai labsのMoshiデモ動画を解説
 
Matsuo-Iwasawa lab. Research Unit Introduction
Matsuo-Iwasawa lab. Research Unit IntroductionMatsuo-Iwasawa lab. Research Unit Introduction
Matsuo-Iwasawa lab. Research Unit Introduction
 
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
 
MOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツール
MOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツールMOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツール
MOSHI: 革新的な音声AI QAIが開発した次世代のコミュニケーションツール
 

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