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
210
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
zero-micro: Codex Microがzero-kb02にそっくりだったので作ったった
makki_d
0
100
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
80
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
84
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
XSLTで作るBrainfuck処理系
makki_d
0
460
眼鏡と視力についての誤解を解く
makki_d
0
260
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
800
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
730
Other Decks in Programming
See All in Programming
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
980
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.3k
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
ChromeでローカルLLM
ryu1013
0
160
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
No More NoSuchMethodError
exoego
1
110
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
190
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
1k
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
180
Vue Fes Japan の “作る側”に関わってみて
naokihaba
1
180
Simple Storage Service(S3) is not simple
iwatsukayura
0
310
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2.7k
Featured
See All Featured
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.5k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
640
A Modern Web Designer's Workflow
chriscoyier
699
190k
Odyssey Design
rkendrick25
PRO
2
880
The SEO Collaboration Effect
kristinabergwall1
1
600
Mobile First: as difficult as doing things right
swwweet
225
10k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Optimizing for Happiness
mojombo
378
71k
Bash Introduction
62gerente
615
220k
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 ◦ 来年以降も津々浦々 おいしいお酒を求めて 求む:はんだ付けできる会場 もし知っていたら教えてください