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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
MakKi
October 17, 2025
Programming
170
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
47
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
60
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
XSLTで作るBrainfuck処理系
makki_d
0
390
眼鏡と視力についての誤解を解く
makki_d
0
230
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
780
range over funcのエラー処理
makki_d
1
1.8k
GoとテストとインプロセスDB
makki_d
3
700
君は古の言語M4を知っているか (LT)
makki_d
0
570
Other Decks in Programming
See All in Programming
Oxcを導入して開発体験が向上した話
yug1224
4
310
The NotImplementedError Problem in Ruby
koic
1
770
RTSPクライアントを自作してみた話
simotin13
0
600
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
220
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
110
OSもどきOS
arkw
0
560
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
130
Oxlintのカスタムルールの現況
syumai
6
1.1k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
190
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
750
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Fireside Chat
paigeccino
42
3.9k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Accessibility Awareness
sabderemane
1
140
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
Site-Speed That Sticks
csswizardry
13
1.2k
The Spectacular Lies of Maps
axbom
PRO
1
810
The Pragmatic Product Professional
lauravandoore
37
7.3k
4 Signs Your Business is Dying
shpigford
187
22k
First, design no harm
axbom
PRO
2
1.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
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 ◦ 来年以降も津々浦々 おいしいお酒を求めて 求む:はんだ付けできる会場 もし知っていたら教えてください