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
Game Boy Emulator作成で学んだ Golangのメモリライフタイム
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
あつまるくん
July 29, 2024
Technology
430
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Game Boy Emulator作成で学んだ Golangのメモリライフタイム
DMM.go#8で登壇した際の発表資料です
connpass
-
https://dmm.connpass.com/event/322113/
あつまるくん
July 29, 2024
Other Decks in Technology
See All in Technology
AI coding 整合正規方法
philipz
0
380
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.3k
What the customer really needed
kawaguti
PRO
3
210
Goodbye ShellScript, Hello File-based App
shunsock
0
420
Reactの設計論
uhyo
24
14k
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
cscengineer
PRO
0
130
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
200
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
2.1k
LLMに渡さなかった仕事
nanaism
0
1.1k
ソフトウェアDNAとクラウドエージェントのススメ
cloudace
0
120
「どのログを見ればいい?」 から始めた サーバーレス障害解析
y_waka1
1
110
AIエージェントの一手は 誰も見ていない - Falco拡張OSS「Prempti」とeBPFで サーバーレス実行基盤を二層防御する
keitah
0
340
Featured
See All Featured
Site-Speed That Sticks
csswizardry
13
1.5k
エンジニアに許された特別な時間の終わり
watany
109
250k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Test your architecture with Archunit
thirion
2
2.4k
A Modern Web Designer's Workflow
chriscoyier
699
190k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
580
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
580
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
420
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
Transcript
© DMM Game Boy Emulator作成で学んだ Golangのメモリライフタイム ~Boot ROMの起動~ DMM.go
#8
© DMM 自己紹介 清水 諄孔 GitHub: atsumarukun 入社: 2024年 新卒入社
所属: 開発統括本部 テックリード室 趣味: PCに触れること OS開発経験 2
© DMM 目的 Golangにおけるメモリのライフタイムを知る 3
© DMM 前提知識 4 メモリは1byte(8bit)単位で区切られており、 アドレスはメモリ内部での場所(何番目の領域か)を指します。 アドレスは16進数で表記する 1byte 1byte 1byte
1byte 0x00 0x01 0x02 0x03
© DMM 前提知識 5 ポインタは定数や変数が保存されている アドレスを保持する変数のことです。 variable1 variable2 0x00 0x01
0x02 2byte以上ある変数のポインタは先頭アドレスになる variable2 0x03
© DMM 内容 やったこと ❶ ❷ 通常のメモリ管理 ❸ Golangのメモリ管理 6
© DMM 内容 やったこと ❶ ❷ 通常のメモリ管理 ❸ Golangのメモリ管理 7
© DMM BootROMを起動 8
© DMM 開発の流れ 1. 各種メモリを実装 2. CPUを実装 3. PPUを実装 4.
LCDを実装 5. サイクルベースでエミュレータを実装 6. カートリッジを実装 7. Joypadを実装 8. APUを実装 9
© DMM 開発の流れ 1. 各種メモリを実装 2. CPUを実装 3. PPUを実装 4.
LCDを実装 5. サイクルベースでエミュレータを実装 6. カートリッジを実装 7. Joypadを実装 8. APUを実装 10
© DMM デバイスの管理 CPUにおけるデバイスの管理方法を知っていますか? 11
© DMM デバイスの管理 I/OデバイスはMMIOというアドレス空間で管理されます。 これにより、CPUはメモリと同じようにI/Oデバイスを操作できます。 12
© DMM デバイスの管理 CPUがメモリやI/Oをアドレス空間で認識するのであれば これらの変数をStatic領域に保存する必要があるのでは...? 13
© DMM 内容 やったこと ❶ ❷ 通常のメモリ管理 ❸ Golangのメモリ管理 14
© DMM メモリ領域の種類 メモリ領域には以下の4種類があります。 このうち、ヒープ領域とスタック領域は動的に確保されます。 テキスト領域 スタティック領域 ヒープ領域 スタック領域 15
© DMM テキスト領域 テキスト領域には、コンパイルされたプログラムが格納されます。 CPUが格納された機械語の命令を読むことでプログラムが実行されます。 16
© DMM スタティック領域 スタティック領域には静的変数が格納されます。 グローバル変数やstatic装飾子を用いて定義した変数が格納されています。 17
© DMM ヒープ領域 ヒープ領域は動的に管理されます。 プログラマが明示的に確保、解放を行う必要があります。 18
© DMM スタック領域 スタック領域は、スタック上にメモリを確保していきます。 関数内で定義された変数は関数終了時に自動削除されます。 argument1 argument2 variable func stack(argument1
uint8, argument2 uint8) { var variable uint8 // 何かしらの処理 } 19
© DMM スタック領域 まず、関数の引数をスタック領域に格納します。 argument1 argument2 variable func stack(argument1 uint8,
argument2 uint8) { var variable uint8 // 何かしらの処理 } 20
© DMM スタック領域 その後、関数内で定義されている変数を 順番に格納していきます。 argument1 argument2 variable func stack(argument1
uint8, argument2 uint8) { var variable uint8 // 何かしらの処理 } 21
© DMM スタック領域 関数の実行が終わると、スタック領域から削除されます。 argument1 argument2 variable func stack(argument1 uint8,
argument2 uint8) { var variable uint8 // 何かしらの処理 } 22
© DMM 内容 やったこと ❶ ❷ 通常のメモリ管理 ❸ Golangのメモリ管理 23
© DMM Golangにおけるメモリ管理 Golangでは、変数を関数に渡すと自動的にヒープ領域に移動します。 そのため、関数終了時に値が削除されることはありません。 go build -gcflags -m main.goでわかる通り、コンパイル時に移動される
var variable uint8 = 1 // <- この時点ではスタック領域 fmt.Println(variable) // <- ここでヒープ領域に移動 24
© DMM メモリ領域 メモリ領域は右の図のようになっています。 ヒープ領域 ↓ ↑ スタック領域 スタティック領域 テキスト領域
var variable uint8 = 1 fmt.Println(variable) 25
© DMM メモリ領域 静的変数を定義した段階では、 スタック領域に確保されます。 ヒープ領域 ↓ ↑ スタック領域 スタティック領域
テキスト領域 var variable uint8 = 1 fmt.Println(variable) 26
© DMM メモリ領域 関数に渡されると、コンパイル時に ヒープ領域へ移動されます。 ヒープ領域 ↓ ↑ スタック領域 スタティック領域
テキスト領域 var variable uint8 = 1 fmt.Println(variable) 27
© DMM サンプルプログラム uint8_t* address; void function(void) {
uint8_t variable = 1; printf("%p\n", &variable); // -> 0xffffe469565f address = &variable; } int main(void) { function(); printf("%p\n", address); // -> 0xffffe469565f printf("%d\n", *address); // -> 102 return 0; } 関数内のアドレスと、グローバル変数のポ インタの値は等しくなります。 アドレスの値を見ると、1になっていないこ とがわかります。 C言語 28
© DMM サンプルプログラム var address *uint8 func main() {
(func() { var variable uint8 = 1 fmt.Printf("%p\n", &variable) // -> 0xffffe469565f address = &variable })() fmt.Printf("%p\n", address) // -> 0xffffe469565f fmt.Println(*address) // -> 1 } C言語同様、アドレスの値は関数内とグ ローバル変数で等しくなります。 しかし、アドレスの値を見ると1のままであ ることがわかります。 Go言語 29
© DMM 依存関係の逆転 type AccountRepository Interface {} type Account struct
{ db *sql.DB } func NewAccount(db *sql.DB) AccountRepository { return &Account{ db: db, } } 関数の戻り値で直接構造体のアドレスを返 すことができます。 これにより、関数の戻り値に Interfaceを指定が可能になります。 30
© DMM まとめ Go言語ではライフタイムの管理を自動的に行ってくれるため、 プログラマがメモリ管理を意識しなくても開発できるようになっている ことがわかりました。 31
© DMM ご清聴ありがとうございました 32