Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Recap: An Operating System in Go
Search
MakKi
October 17, 2025
Programming
180
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
52
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
66
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
XSLTで作るBrainfuck処理系
makki_d
0
420
眼鏡と視力についての誤解を解く
makki_d
0
230
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
780
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
700
君は古の言語M4を知っているか (LT)
makki_d
0
580
Other Decks in Programming
See All in Programming
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
350
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
670
VibeCodingからAgenticWorkflowへ
starfish719
0
390
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
140
Google Apps Script で Ruby を動かす
kawahara
0
150
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
520
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.5k
Android CLI
fornewid
0
220
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
330
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
470
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
100
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
180
Featured
See All Featured
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
The browser strikes back
jonoalderson
0
1.5k
Visualization
eitanlees
152
17k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
320
We Are The Robots
honzajavorek
0
300
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Ethics towards AI in product and experience design
skipperchong
2
340
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
BBQ
matthewcrist
89
10k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.2k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
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 ◦ 来年以降も津々浦々 おいしいお酒を求めて 求む:はんだ付けできる会場 もし知っていたら教えてください