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
全てのエンジニアに知ってもらいたいOSの中身/OS that we should know
Search
Akira Morikawa
September 08, 2018
Technology
48
15k
全てのエンジニアに知ってもらいたいOSの中身/OS that we should know
builderscon tokyo 2018
2018-09-08 10:00-11:00 @ Track-C
Akira Morikawa
September 08, 2018
Tweet
Share
More Decks by Akira Morikawa
See All by Akira Morikawa
コロナ禍だからこそ考えるオフラインコミュニティの意義 / significance of community
ariaki
0
1.7k
アウトプットの始め方/start output 20230121
ariaki
0
240
web-secure-phpcon2020
ariaki
3
3.2k
オブジェクトライフサイクルとメモリ管理を学ぼう / OOC 2020
ariaki
8
3.4k
エンジニアはアウトプットによって成長できるのか? / Grow with your output
ariaki
24
6.2k
アウトプットを始めよう / How to begin output jawsug-bgnr
ariaki
2
3.6k
参加者の安全を守れていますか? / Protecting community safety
ariaki
1
6.5k
タピオカに学ぶ二段階認証 / tapioca-mfa
ariaki
5
1.2k
古に学ぶ個人開発のススメ / My recommendation of personal development
ariaki
1
1.3k
Other Decks in Technology
See All in Technology
APIとはなにか
mikanichinose
0
110
20241220_S3 tablesの使い方を検証してみた
handy
4
680
pg_bigmをRustで実装する(第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
shinyakato_
0
110
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
280
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
540
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
1
260
AWS re:Invent 2024 ふりかえり勉強会
yhana
0
440
多領域インシデントマネジメントへの挑戦:ハードウェアとソフトウェアの融合が生む課題/Challenge to multidisciplinary incident management: Issues created by the fusion of hardware and software
bitkey
PRO
2
110
普通のエンジニアがLaravelコアチームメンバーになるまで
avosalmon
0
120
Amazon Kendra GenAI Index 登場でどう変わる? 評価から学ぶ最適なRAG構成
naoki_0531
0
130
Opcodeを読んでいたら何故かphp-srcを読んでいた話
murashotaro
0
320
Wantedly での Datadog 活用事例
bgpat
2
650
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
GraphQLとの向き合い方2022年版
quramy
44
13k
The Invisible Side of Design
smashingmag
298
50k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Facilitating Awesome Meetings
lara
50
6.1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
The Language of Interfaces
destraynor
154
24k
Building Your Own Lightsaber
phodgson
103
6.1k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Transcript
全ての (Web) エンジニアに 知ってもらいたいOSの中身 builderscon tokyo 2018 2018-09-08 (Sat) 10:00-11:00
/ Track-C @ariaki4dev CC-BY-4.0
About Me 森川 晃 / ariaki MEDIA DO Co., Ltd.
ariaki4dev
[email protected]
問題提起
あなたはどんなOSを使ってますか? 思い浮かべてください
あなたはサーバOSを 最近インストールしましたか?
Desktop OS (Jul, 2018) Website OS (Jul, 2018) 現在のOSシェア https://netmarketshare.com/operating-system-market-share.aspx
https://w3techs.com/technologies/overview/operating_system/all
Desktop OS (Jul, 2018) Website OS (Jul, 2018) https://netmarketshare.com/operating-system-market-share.aspx https://w3techs.com/technologies/overview/operating_system/all
昔と比べて認知度が下がった(気がする) 現在のOSシェア
OS認知の低下 サーバOSの管理はもう時代遅れかな?
サーバOS管理の辛さを1行で表現する
/ 95 rm -fr --no-preserve-root / 10 setenforce 0
- システム構築においてOSレイヤを意識する機会が減ってきた - パブリッククラウドサービスの台頭 - システム動作環境のコンテナ化 - PaaS ( Platform
as a Service ) - FaaS ( Function as a Service ) - OSに対する価値の変化が顕著になってきた / 環境の変化 OS認知の低下
- 業界全体でエンジニアの割合が変化した Web系のエンジニアが急増 機械学習やビッグデータ等のエンジニアも増えている アセンブラやC言語の認知率が低下 - ハード/ソフト両面の高度化が進み、理解の難易度が上がった / エンジニアの変化 OS認知の低下
ちょっと待って!
あなたが作るプログラムはすべて OSの上で動いています
OSを知るとちょっと幸せになれる (かも)
プログラムが動く仕組みがちょっとわかる プログラムエラーの中身がちょっとわかる OSの役割がちょっとわかる そうだ、Linux Kernelを読んでみよう
OSの中身をちょっと理解した OSが自作できるようになった にちょっと興味もった
開 演
ブートシーケンスから OSの動きを紐解く
/ 95 仮想8086モード リアルモード プロテクトモード ロングモード 16bit 32bit 64bit BIOSブート時のCPU動作モード
電源ON 互換モード Legacy Mode 20
CPU動作モード? 歴史的背景 16bit リアルモード 32bit プロテクトモード 仮想8086モード 64bit ロングモード (64bitモード)
互換モード
昔々、ある所に・・・
None
None
None
- 1978年に発売された初めての16bit CPU - 利用可能な物理メモリ1MB Intel 8086
リアルモード is ※現在のCPUはあくまで互換仕様なので改良されています
is プロテクトモード ※現在のCPUはあくまで互換仕様なので改良されています
1982 1985 8086 1978 1980 1989 ・・・ 2004 80286 80386
80486 16bit 32bit 64bit x64
/ 95 40年前のCPUと互換動作すんの? え、まじ? 30
https://2it201jv.wordpress.com/2014/01/13/8086-pin-diagram/ Intel 8086
https://2it201jv.wordpress.com/2014/01/13/8086-pin-diagram/ A『アドレスバス』 AD『データバス』 20bit出力用(1,048,576通り) 16bit入出力(65,536通り) Intel 8086 - 16bit Register
- 16bit CPU - 1MB Memory
セグメント セグメント メモリ : 1 MB 可変長/最大64KB Intel 8086 コンベンショナルエリア
UMA : Upper Memory Area (予約領域) 640KB
セグメント セグメント メモリ : 1 MB 可変長/最大64KB コンベンショナルエリア UMA :
Upper Memory Area (予約領域) 640KB Intel 80286(余談) HMA 64KB 完全にバグだったもの
Intel 8086 CPU レジスタ メモリ セグメント 高速 > 低速 16bit
(整数レジスタ) / レジスタ CPU の中でデータを保持する箱 = + X と Y の箱が必要 X X Y レジスタって?
Intel 8086 / レジスタ 汎用レジスタ データ記憶や演算用 セグメントレジスタ メモリセグメント計算用 0 15
15 8 7 Flag IP CS DS SS ES SP BP SI DI AX BX CX DX - 32bit : 先頭にEがつく 例)AX → EAX - 64bit : 先頭にRがつく 例)AX → RAX 0
リアルモード プロテクトモード - 16bit - RAMに自由アクセス - RAM 640KBを利用可能 -
32bit - RAMにアクセス制限 - RAM 4GBを利用可能 ロングモード - 64bit - RAMにアクセス制限 - RAM 1TBを利用可能 ※理論上は1PBまで (※80286以外)
リアルモード is FREEDOM - メモリどこでも読める - メモリどこでも書ける - 明らかにヤバそう
- 16bit CPU - 利用可能メモリが16MBに増加 - プロテクトモード - マルチタスク実装 Intel
80286
/ 95 is 特権管理 - リングプロテクション - メモリ保護 - TSS
: プロテクトモード 40
特権管理 メモリ管理 タスク管理 解説タイム
特権管理 メモリ管理 タスク管理 解説タイム
特権管理 特権命令 Ring 3 Ring 2 Ring 1 Ring 0
Device drivers Device drivers Applications Kernel 低 高 権限 リングプロテクション
Ring 0 ※あくまでイメージです※
Ring-3 Ring-2 Ring-1 Ring-0 特権管理 Call-Gate方式 ※x64では通常使用されない システムコール (※後述)
一般保護例外 メモリ OS アプリ-A アプリ-B ( Ring-0 ) ( Ring-3
) ( Ring-3 ) アプリ-A 一般保護例外 ( GPF : General Protection Fault ) ページフォルト ( PF : Page Fault )
Segmentation Fault - Segmentation Fault - SYSSEGVシグナルに紐付くいずれかの例外が発生した(※Linux) - 一般保護例外 -
CPU保護機構に基づく権限的な例外が発生した - Segmentation Faultの一種 - 混同しがち(※自分的に)
特権管理 メモリ管理 タスク管理 解説タイム
メモリ管理 メモリ この位置のデータが欲しい
/ 95 メモリ管理 メモリ この範囲の中から指定しよう →『ページ』(4KB / 4MB) 50
メモリ管理 メモリ この区画の中から指定しよう →『PTE』(ページ × N個の集合)
メモリ管理 メモリ 更に大きな区画の中から指定しよう →『PDE』(PTE × N個の集合)
メモリ管理 / ページング リニアアドレス空間 ページ リニアアドレス PDE PTE OFFSET PDE
PTE ※PDE毎に1ページのサイズを4KB/4MBから選択できる ※PDEを複数段に分割管理する場合がある
メモリ管理 リニアアドレス空間 リニアアドレスをまとめた区画 →『セグメント』 PDE PTE OFFSET
メモリ管理 / セグメンテーション GDT リニアアドレス空間 セグメント セグメントベース リミット値 特権レベル(DPL) Segment
Descriptor : 実行時権限(CPL)と比較される 最大8,192個 リニアアドレス ※現在多くのOSでは、メモリ全体を1つのセグメントとしている 論理アドレス OFFSET SEGMENT
- ページング - セグメンテーション メモリ管理
特権管理 メモリ管理 タスク管理 解説タイム
タスク管理 / マルチタスク タスク-B タスク-A コンテキストスイッチ タイムスライス タイマ割込
タスク管理 タスク生成 実行可能状態 入出力要求 (スーパーバイザコール) 待ち状態 実行状態 ディスパッチャ 入出力完了 (待機完了)
プリエンプション ディスパッチング タスク終了 / プリエンプティブ 各タスクの状態はTSS : Task State Segmentによって管理される
/ 95 60 だいたい全編CPUの話 してる気がする
脱線しすぎた (既定路線)
ブートシーケンスから OSの動きを紐解く ここから本気出す
BIOS起動の場合 ブートシーケンス BIOS Bootstrap Loader Kernel Loader Kernel MBR =
512バイト 最低限の初期化処理 カーネルロードに 必要な初期化処理 カーネル本体
BIOS起動 1 POST : Power On Self Test 実行 2
ブートストラップローダを実行 3 a) INT 0x19 ( Bootstrap Routine) を発行 b) INT 0x13 ( Disk Services ) を発行 c) ブートディスクの先頭セクタ(MBR : Master Boot Record)を 0x7c00 に読み込む →失敗時は INT 0x18 ( Boot Fault Routine ) 発行 d) ブートレコードの末尾が 0x55AA ( Boot Signature ) である事を確認する e) ロードされたメモリ領域へ FAR ジャンプ ブートシーケンス 後で説明
0x7c00 なんだろう?
0x7c00の起源 - IBM PC 5150(1981年発売)のROM BIOSが起源 - David Bradley氏が開発(※Ctrl-Alt-Delete実装した人) -
以前のOS “86-DOS”の実装は知らなかった - DOS 1.0は最小で32KBのメモリを必要としていた - 先頭の方は予約されていて使えない - じゃあメモリ末尾(32KB)にロードしよう - MBR自体が512バイト+MBRが使うデータ領域に512バイト - 32k - 512 - 512 = 0x7c00 【参考記事】なぜx86ではMBRが"0x7C00"にロードされるのか?(完全版) https://www.glamenv-septzen.net/view/614
INT 0x19 なんだろう?
INT = 割込 CPU ハードウェア ソフトウェア Kernel
INT = 割込 CPU ソフトウェア システムコール ソフトウェアが自身の実行権限(Ring-3)を超 えて上位の機能を呼び出す
/ 95 INT = 割込 割込コントローラ タイマIC ディスクコントローラ キーボードコントローラ CPU
ハードウェアの動作状況をCPUを通じてOSに 通知する 70
INT = 割込 割込の種類 命令 ソフトウェア割込 ユーザプログラムがシステムコールを呼び出す ハードウェア割込(IRQ) 周辺機器からの信号(InterRupt reQuest)によって発生する
例外 TRAP INT, INTO命令の実行によって発生する FAULT 保護機能、MMUのチェックによって発生する ABORT 処理を続けられないエラーによって発生する 強 弱
例外の種類 1/2 番号 名称 種類 シグナル 説明 0 除算エラー FAULT
SIGFPE 0で除算された 1 デバッグ例外 TRAP SIGTRAP デバッグ中に発生(ステップ実行) 3 ブレークポイント TRAP SIGTRAP デバッグ中に発生 4 オーバーフロー TRAP SIGSEGV 桁あふれが発生した 5 BOUND範囲超過 FAULT SIGSEGV アドレス有効範囲外のコードを実行した 6 無効オペコード FAULT SIGILL 無効なオペコードを検出した 7 デバイス使用不能 FAULT ── CR0レジスタTSフラグによって発生 8 ダブルフォルト ABORT ── CPUが連続した例外を処理できない場合に発生 9 コプロセッサセグメン トオーバーラン ABORT SIGFPE 外部算術演算コプロセッサによって発生(80386限定) Segmentation Fault
例外の種類 2/2 番号 名称 種類 シグナル 説明 10 無効TSS FAULT
SYSSEGV 無効なTSSを持つプロセスに切り替えた 11 セグメント不在 FAULT SIGBUS メモリ中に存在しないセグメントを参照した 12 スタックフォルト FAULT SIGBUS 命令がスタックセグメントの範囲を超えた 13 一般保護 FAULT SYSSEGV プロテクトモードの保護規則に違反した 14 ページフォルト FAULT SYSSEGV 参照されたページへのアクセスが拒否された 16 浮動小数点エラー FAULT SYSFPE 浮動小数点演算に失敗した 17 アライメントチェック FAULT SYSBUS オペランドのアドレスが正しくアラインされていない 18 マシンチェック ABORT ── マシンチェック機構がCPUやバスエラーを検出 19 SIMD浮動小数点 FAULT SYSFPE SSE/SSE2回路が浮動小数点演算でエラーを検出 General Protection Fault
Kernel User Land Operating System Application User Hardware ライブラリ システムコール
時間管理 メモリ管理 タスク管理 ドライバ シェル アクセサリ ファイル管理
Demonstration Hello, World ! - 実行環境:CentOS 7.5 - 使用言語:gcc -
デバッガ:gdb
Demonstration gcc -Wall -O0 -ggdb3 -o hello hello.c コンパイル: [
hello.c ]
Demonstration ltrace ./hello
Demonstration strace ./hello
Demonstration gdb → ステップ実行 → layout asm 【参考記事】 Linuxカーネルに見る、システムコール番号と引数、システムコール・ラッパーとは http://www.atmarkit.co.jp/ait/articles/1703/01/news171.html
/ 95 システムコール - システムコールを発行する方法は 3 種類 - SYSCALL 新しい方法、AMD発、古いCPUでは対応していない
- SYSENTER 新しい方法、Intel発、古いCPUでは対応していない - INT 0x80 最も古い方法、特化していないのでオーバーヘッド多い - EAXの値によって呼び出される機能が異なる - 特権が必要な処理をOSに要求する(Call-Gate方式) 80
システムコールの流れ(超要約版) Kernel Program CPU write() system_call() 処理開始 system_call_table 命令実施 システムコール
sys_read() sys_write() sys_open() sys_close() :
システムコールの定義 https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl
system_call_table 1/2 0 1 2 3 : sys_read() sys_write() sys_open()
sys_close() : OS起動時にメモリ上に設定しておく (※各動作モードを切替えた際)
system_call_table 2/2 MSR: Model Specific Register IA32_EFER IA32_STAR IA32_LSTAR IA32_CSTAR
: IA32_PAT system_call_table system_call_table system_call_table レガシーモード 64bitモード 互換モード SYSENTER / SYSCALL sys_read() sys_write() sys_open() sys_close() :
Interrupt Descriptor Table Gate Descriptor Call Gate Descriptor IDT INT
0x80 Interrupt Gate Descriptor Task Gate Descriptor (Interrupt Descriptor Table) system_call_table #0 #1 : #128 : sys_read() sys_write() sys_open() sys_close() : Trap Gate Descriptor
CPUがメモリを管理する為の情報を一元管理する - Segment Descriptor - TSS Descriptor - Call Gate
Descriptor 異なる特権レベル呼出に利用する - Interrupt Gate Descriptor 割込/例外処理時に利用する - Task Gate Descriptor タスクスイッチ時に利用する - Trap Gate Descriptor 割込/例外処理時に利用する : Global Descriptor Table
CPU動作モード Intel CPUの簡単な歴史 特権管理 メモリ管理 タスク管理 割込 システムコール 今日覚えた事
最後に
Discover Something New
/ 95 Discover Something New Old 90
None
Commercials
Go言語 初心者向けハンズオン https://techdo.connpass.com/event/100306/ 登壇の技術を勉強する会 #1 https://engineers.connpass.com/event/100460/ 9/ 9/ 14 21
沖縄Go言語LT大会 https://engineers.connpass.com/event/100437/ 10/ 4 ~ エンジニアの登壇を応援する会 出張版
We’re Hiring ! https://www.mediado.jp/mediado/recruit/
Build Something Amazing written by ariaki4dev
Appendix / Web Sites - Intel 80386 Reference Programmer's Manual
- Linux Inside - ハードウェアの基本 - コメントから読むLinuxカーネル - ブートストラップ - パソコン実習室 - 0から作るOS開発 - OSASK計画 - OS Wiki - OS Project Wiki - Linuxをはじめよう! - OpenBSD kernel hack memo annex - アセンブラの基礎
Appendix / Books - 32ビットコンピュータをやさしく語る はじめて読む486 / 蒲地輝尚 - 30日でできる!OS自作入門
/ 川合 秀実 - ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ / 坂井弘亮 - 新装改訂版 Linuxのブートプロセスをみる / 白崎 博生 - プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識 / 矢沢 久雄 - CPUの創りかた / 渡波 郁 - ゼロからトースターを作ってみた結果 / トーマス・トウェイツ
#444444, rgb(68, 68, 68) #43bdc1, rgb(67, 189, 193) #da6272, rgb(218,
98, 114) builderscon builderscon builderscon builderscon builderscon builderscon builderscon builderscon Discover Something New Journey to operating system as we should know, written by ariaki4dev