Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Recap: An Operating System in Go
Search
MakKi
October 17, 2025
Programming
190
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Recap: An Operating System in Go
GopherConTour 2025 報告会
MakKi
October 17, 2025
More Decks by MakKi
See All by MakKi
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
56
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
72
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
XSLTで作るBrainfuck処理系
makki_d
0
440
眼鏡と視力についての誤解を解く
makki_d
0
240
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
790
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
710
君は古の言語M4を知っているか (LT)
makki_d
0
590
Other Decks in Programming
See All in Programming
Webの地図
yosuke_furukawa
PRO
5
3.9k
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.9k
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
Security issues being discussed on Web Platforms
petamoriken
0
520
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
320
フロントエンドUIフレームワークのこれまでとこれから
ssssota
4
2.1k
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
XHTMLが残したもの
yosuke_furukawa
PRO
2
640
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
460
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
2
1.4k
Technical Leadership for Architectural Decision Making
baasie
3
560
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
YesSQL, Process and Tooling at Scale
rocio
174
15k
We Have a Design System, Now What?
morganepeng
55
8.3k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
The Invisible Side of Design
smashingmag
301
52k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Exploring anti-patterns in Rails
aemeredith
3
500
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
230
Transcript
Recap: An Operating System in Go それとTinyGoあれこれ GopherCon Tour 2025
報告会
自己紹介 • 牧内大輔(MakKi) ◦ @makki_d makiuchi-d • KLab株式会社 ◦ 主にスマホゲーム作ってます
• OSS ◦ gozxing、EMLauncher、arelo、WSNet2、migy • TinyGo-Keeb コアメンバー ◦ https://tinygo-keeb.org/
GopherCon Tourに参加した理由 海外カンファレンス参加の難しさ 💸 お金 🏨✈ 宿や航空券の手配 🗣 言葉の壁
GopherCon Tourに参加した理由 海外カンファレンス参加の難しさ • 助けてくれる&英語を頑張るきっかけにする • NEWTさんがぜんぶ手配してくれる! • 残るはお金のみ 💸
お金 🏨✈ 宿や航空券の手配 🗣 言葉の壁
GopherCon Tourに参加した理由 海外カンファレンス参加の難しさ • 貯金崩したとして、あとから稼げばなんとかなる よし、行こう! 💸 お金 🏨✈ 宿や航空券の手配
🗣 言葉の壁
Recap: An Operating System in Go (Go言語から見たOS)
Goはシステムプログラミング言語?
システムプログラミング • 低レベルプログラミング ◦ ハードウェアやリソースを直接管理 • OSの無い環境で動くもの ◦ ファームウェア ◦
ブートローダー ◦ ベアメタル
GOOS
GOOSの効果 • 出力されるバイナリの形式が変わる ◦ windows PE32+ ◦ linux ELF ◦
darwin Mach-O ◦ …など • OS依存実装の切り替え ◦ ビルドタグによる指定 ▪ //go:build linux || windows ◦ ファイル名による指定 ▪ file_linux.go file_windows.go file_darwin.go
OS依存実装 GOOS=linux の net.Dial("tcp", ":8080") package net func Dial() net/dial.go
OS依存実装 GOOS=linux の net.Dial("tcp", ":8080") package net func Dial() func
(*Dialer) Dial() func (*Dialer) DialContext() func (*sysDialer) dialParallel() func (*sysDialer) dialSerial() func (*sysDialer) dialSingle() net/dial.go
OS依存実装 GOOS=linux の net.Dial("tcp", ":8080") package net func Dial() func
(*Dialer) Dial() func (*Dialer) DialContext() func (*sysDialer) dialParallel() func (*sysDialer) dialSerial() func (*sysDialer) dialSingle() net/dial.go //go:build unix || js || wasip1 || windows package net func (*sysDialer) dialTCP() func (*sysDialer) doDialTCP() func (*sysDialer) doDialTCPProto() net/tcpsock_posix.go //go:build unix || js || wasip1 || windows package net func internetSocket() net/ipsock_posix.go
OS依存実装 GOOS=linux の net.Dial("tcp", ":8080") package net func Dial() func
(*Dialer) Dial() func (*Dialer) DialContext() func (*sysDialer) dialParallel() func (*sysDialer) dialSerial() func (*sysDialer) dialSingle() net/dial.go //go:build unix || js || wasip1 || windows package net func (*sysDialer) dialTCP() func (*sysDialer) doDialTCP() func (*sysDialer) doDialTCPProto() net/tcpsock_posix.go //go:build unix || js || wasip1 || windows package net func internetSocket() net/ipsock_posix.go //go:build unix || windows package net func socket() net/sock_posix.go //go:build dragonfly || freebsd || linux || netbsd || openbsd package net func sysSocket() net/socket_cloexec.go //go:build unix || js || wasip1 package net func socketFunc() net/hook_unix.go
OS依存実装 GOOS=linux の net.Dial("tcp", ":8080") package net func Dial() func
(*Dialer) Dial() func (*Dialer) DialContext() func (*sysDialer) dialParallel() func (*sysDialer) dialSerial() func (*sysDialer) dialSingle() net/dial.go //go:build unix || js || wasip1 || windows package net func (*sysDialer) dialTCP() func (*sysDialer) doDialTCP() func (*sysDialer) doDialTCPProto() net/tcpsock_posix.go //go:build unix || js || wasip1 || windows package net func internetSocket() net/ipsock_posix.go //go:build unix || windows package net func socket() net/sock_posix.go //go:build dragonfly || freebsd || linux || netbsd || openbsd package net func sysSocket() net/socket_cloexec.go //go:build unix || js || wasip1 package net func socketFunc() net/hook_unix.go //go:build unix package syscall func Socket() syscall/syscall_unix.go //go:build linux && amd64 package syscall func socket() syscall/zsyscall_linux_amd64.go //go:build linux && amd64 package syscall func RawSyscall() func RawSysCall6() syscall/syscall_linux.go package syscall func Syscall6() internal/runtime/syscall/asm_linux_amd64.go
OS依存実装 GOOS=linux の net.Dial("tcp", ":8080") package net func Dial() func
(*Dialer) Dial() func (*Dialer) DialContext() func (*sysDialer) dialParallel() func (*sysDialer) dialSerial() func (*sysDialer) dialSingle() net/dial.go //go:build unix || js || wasip1 || windows package net func (*sysDialer) dialTCP() func (*sysDialer) doDialTCP() func (*sysDialer) doDialTCPProto() net/tcpsock_posix.go //go:build unix || js || wasip1 || windows package net func internetSocket() net/ipsock_posix.go //go:build unix || windows package net func socket() net/sock_posix.go //go:build dragonfly || freebsd || linux || netbsd || openbsd package net func sysSocket() net/socket_cloexec.go //go:build unix || js || wasip1 package net func socketFunc() net/hook_unix.go //go:build unix package syscall func Socket() syscall/syscall_unix.go //go:build linux && amd64 package syscall func socket() syscall/zsyscall_linux_amd64.go //go:build linux && amd64 package syscall func RawSyscall() func RawSysCall6() syscall/syscall_linux.go package syscall func Syscall6() internal/runtime/syscall/asm_linux_amd64.go TEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0 // a6 already in R9. // a5 already in R8. MOVQ SI, R10 // a4 MOVQ DI, DX // a3 MOVQ CX, SI // a2 MOVQ BX, DI // a1 // num already in AX. SYSCALL CMPQ AX, $0xfffffffffffff001 JLS ok NEGQ AX MOVQ AX, CX // errno MOVQ $-1, AX // r1 MOVQ $0, BX // r2 RET ok: // r1 already in AX. MOVQ DX, BX // r2 MOVQ $0, CX // errno RET internal/runtime/syscall/asm_linux_amd64.s
OS依存実装 GOOS=linux の net.Dial("tcp", ":8080") package net func Dial() func
(*Dialer) Dial() func (*Dialer) DialContext() func (*sysDialer) dialParallel() func (*sysDialer) dialSerial() func (*sysDialer) dialSingle() net/dial.go //go:build unix || js || wasip1 || windows package net func (*sysDialer) dialTCP() func (*sysDialer) doDialTCP() func (*sysDialer) doDialTCPProto() net/tcpsock_posix.go //go:build unix || js || wasip1 || windows package net func internetSocket() net/ipsock_posix.go //go:build unix || windows package net func socket() net/sock_posix.go //go:build dragonfly || freebsd || linux || netbsd || openbsd package net func sysSocket() net/socket_cloexec.go //go:build unix || js || wasip1 package net func socketFunc() net/hook_unix.go //go:build unix package syscall func Socket() syscall/syscall_unix.go //go:build linux && amd64 package syscall func socket() syscall/zsyscall_linux_amd64.go //go:build linux && amd64 package syscall func RawSyscall() func RawSysCall6() syscall/syscall_linux.go package syscall func Syscall6() internal/runtime/syscall/asm_linux_amd64.go TEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0 // a6 already in R9. // a5 already in R8. MOVQ SI, R10 // a4 MOVQ DI, DX // a3 MOVQ CX, SI // a2 MOVQ BX, DI // a1 // num already in AX. SYSCALL CMPQ AX, $0xfffffffffffff001 JLS ok NEGQ AX MOVQ AX, CX // errno MOVQ $-1, AX // r1 MOVQ $0, BX // r2 RET ok: // r1 already in AX. MOVQ DX, BX // r2 MOVQ $0, CX // errno RET internal/runtime/syscall/asm_linux_amd64.s
syscallのOS呼び出し =Goから見えるOS
GoでOS非依存プログラミング • TinyGo ◦ マイコンやWASM向けに小さいバイナリに特化 ◦ LLVMベース • TamaGo ◦
ベアメタル向け ◦ Goのfork ▪ GOOS=tamago ターゲットを追加 ▪ internal/runtime/syscall などにベアメタル用ランタイムの追加実装 • Embedded Go ◦ TamaGo と似たアプローチ?
ベアメタルサポートのプロポーザル proposal: all: add bare metal support #73608 • Go本体にベアメタルサポートを組み込む提案
◦ TamaGo を統合 ◦ GOOS=noos (あるいはGOOS=none)
他にもいろいろ話していたけど割愛……
関連LT Apps Without an Operating System?! • ベアメタルでGUIアプリ • TamaGo
• github.com/fyne-io/fyne-x ◦ GUIフレームワーク ◦ クロスプラットフォーム ◦ 少し試したけど便利そう
OSが無くても Goは活躍できる!
TinyGoが熱い!特に日本で!
TinyGoが熱い!特に日本で! • TinyGo Conference 2025 in JAPAN ◦ 大盛況でした •
TinyGo Keeb Tour ◦ 来年以降も津々浦々 おいしいお酒を求めて 求む:はんだ付けできる会場 もし知っていたら教えてください