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
デバイスドライバ
Search
Satoru Takeuchi
PRO
May 06, 2025
Technology
0
80
デバイスドライバ
以下動画のテキストです
https://youtu.be/rIbvTC3p-ZI
Satoru Takeuchi
PRO
May 06, 2025
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
APIとABIの違い
sat
PRO
5
54
ファイルシステムへのアクセス方法
sat
PRO
0
23
ファイルシステム
sat
PRO
1
23
低レイヤソフトウェア技術者が YouTuberとして食っていこうとした話
sat
PRO
7
6.1k
ポーリングと割り込み
sat
PRO
1
78
Rook: Intro and Deep Dive With Ceph
sat
PRO
1
140
会社員しながら本を書いてきた知見の共有
sat
PRO
3
880
デバイスにアクセスするデバイスファイル
sat
PRO
1
60
ファイルシステムのデータを ブロックデバイスへの操作で変更
sat
PRO
1
48
Other Decks in Technology
See All in Technology
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
170
Codeful Serverless / 一人運用でもやり抜く力
_kensh
6
310
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
230
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
200
ヘブンバーンズレッドにおける、世界観を活かしたミニゲーム企画の作り方
gree_tech
PRO
0
570
Grafana Meetup Japan Vol. 6
kaedemalu
1
330
ChatGPTとPlantUML/Mermaidによるソフトウェア設計
gowhich501
1
120
AWSで始める実践Dagster入門
kitagawaz
0
430
Language Update: Java
skrb
2
280
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
30k
フィンテック養成勉強会#56
finengine
0
130
テストを軸にした生き残り術
kworkdev
PRO
0
180
Featured
See All Featured
Building Adaptive Systems
keathley
43
2.7k
Practical Orchestrator
shlominoach
190
11k
Code Reviewing Like a Champion
maltzj
525
40k
KATA
mclloyd
32
14k
Gamification - CAS2011
davidbonilla
81
5.4k
The Pragmatic Product Professional
lauravandoore
36
6.9k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Why Our Code Smells
bkeepers
PRO
339
57k
Transcript
デバイスドライバ May. 6th, 2025 Satoru Takeuchi X: satoru_takeuchi 1
デバイスドライバとは • デバイスの操作を担当するカーネル内のコンポーネント • おおざっぱにいうとデバイスの種類だけ存在する ◦ 📝 Linuxのコード数千万行のうち、ほとんどはデバイスドライバのコード 2
デバイスの操作方法 • デバイスには1つ以上のレジスタという領域が存在 • どのレジスタにどうアクセスすればデバイスをどんなふうに操作できるかが仕様に書かれている • デバイスドライバはユーザからの要求に応じて仕様通りにレジスタにアクセス 3 デバイス カーネル空間
物理世界 レジスタ デバイスドライバ アクセス
デバイスのレジスタにアクセスする方法 • メモリマップトI/O ◦ デバイスのレジスタをカーネルの仮想アドレス空間にマップしてアクセス ◦ メモリと同じようにアクセスできる ◦ 主流の方法。本動画でもこちらについて説明 •
ポートマップトI/O ◦ デバイスのレジスタを portと呼ばれるメモリとは別のインタフェースを介してアクセス ◦ 専用の機械語命令を発行する必要がある (例: x86だとin,out命令) 4
メモリマップトI/O • デバイスアクセス時はデバイスのレジスタをカーネルの仮想アドレス空間にマップし てアクセス ◦ 📝 実はカーネルがデバイスを認識した段階でデバイスのレジスタは物理アドレス空間にマップされ ている ◦ 📝
物理アドレスのどこに存在するかは OSではなくUEFIやACPIから得る 5 メモリ デバイスAの レジスタ(群) カーネルの 仮想アドレス空間 デバイスBの レジスタ(群) …
デバイスドライバのサンプル • 簡単な仕様の仮想的なディスクデバイスを使ってデバイスドライバがどんなことをし ているかを学ぶ 6 レジスタのオフセット 役割 0 読み書きに使うメモリ領域の開始アドレス 10
読み書きに使うディスク内のデータの開始オフセット 20 読み書きサイズ 30 ここに書き込むと処理を要求。 0なら読み出し、1なら書き込み 40 要求された処理が終わったかどうかを示す。処理を開始した時点で 0 になり、完了したら1になる。
初期状態 • カーネル仮想アドレス空間のアドレス500にディスクのレジスタがマップされている 7 メモリ 0 500 510 520 530
540 ??? ??? ??? ??? ??? 仮想アドレス空間 ディスクデバイス 2222 3333 1111 10 0 20
やりたいこと • メモリ領域0~100にディスクのオフセット100~200のデータを読み出す 8 メモリ 0 500 510 520 530
540 ??? ??? ??? ??? ??? ディスクデバイス 2222 3333 1111 100 0 200 ??? 100 仮想アドレス空間
デバイスドライバの読み出し処理はこんなかんじ func read(mem_addr, dev_offset, size) { regs[] = {500, 510,
520, 530, 540} regs[0] = mem_addr regs[1] = dev_offset regs[2] = size regs[3] = 0 } 9
読み書きするアドレス、オフセットの設定 • アドレス500,510,520にマップされたレジスタを設定 10 メモリ 0 500 510 520 530
540 0 100 100 ??? ??? ディスクデバイス 2222 3333 1111 100 0 200 ??? 100 仮想アドレス空間 メモリアドレス データサイズ ディスク上のオフセット
ディスクデバイスに処理を依頼 • アドレス530にマップしたレジスタに0を書き込む(読み出しを意味する) 11 メモリ 0 500 510 520 530
540 0 100 100 0 0 ディスクデバイス 2222 3333 1111 100 0 200 ??? 100 仮想アドレス空間
ディスクデバイスがデータを転送 12 メモリ 0 500 510 520 530 540 0
100 100 0 0 ディスクデバイス 2222 3333 1111 100 0 200 2222 100 仮想アドレス空間
ディスクデバイスが読み出し完了を示す • 📝 デバイスドライバが読み出し完了を検出する方法は次の動画で説明 13 メモリ 0 500 510 520
530 540 0 100 100 0 1 ディスク 2222 3333 1111 100 0 200 2222 100 仮想アドレス空間
まとめ • デバイスはデバイス内のレジスタ領域へのアクセスによって操作 • 何をしたいときにどうレジスタにアクセスすべきかは仕様に書いている • デバイスドライバはユーザからの要求に応じて仕様通りレジスタにアクセス • メモリマップトI/Oの場合アセンブリコード無しでメモリアクセスの感覚でデバイスの レジスタにアクセスできる
14