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
50
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
63
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
XSLTで作るBrainfuck処理系
makki_d
0
410
眼鏡と視力についての誤解を解く
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
580
Other Decks in Programming
See All in Programming
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
250
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
140
Contextとはなにか
chiroruxx
1
390
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
0
410
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.8k
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
570
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
360
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.7k
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
OS アップデート対応の取り組み方がもっと共有されてほしい
andpad
0
110
Featured
See All Featured
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Ethics towards AI in product and experience design
skipperchong
2
320
Fireside Chat
paigeccino
42
4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Claude Code のすすめ
schroneko
67
230k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Faster Mobile Websites
deanohume
310
32k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Making the Leap to Tech Lead
cromwellryan
135
10k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
640
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
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 ◦ 来年以降も津々浦々 おいしいお酒を求めて 求む:はんだ付けできる会場 もし知っていたら教えてください