Upgrade to Pro — share decks privately, control downloads, hide ads and more …

全てのエンジニアに知ってもらいたいOSの中身/OS that we should know

全てのエンジニアに知ってもらいたいOSの中身/OS that we should know

builderscon tokyo 2018
2018-09-08 10:00-11:00 @ Track-C

Akira Morikawa

September 08, 2018
Tweet

More Decks by Akira Morikawa

Other Decks in Technology

Transcript

  1. - システム構築においてOSレイヤを意識する機会が減ってきた - パブリッククラウドサービスの台頭 - システム動作環境のコンテナ化 - PaaS ( Platform

    as a Service ) - FaaS ( Function as a Service ) - OSに対する価値の変化が顕著になってきた / 環境の変化 OS認知の低下
  2. セグメント セグメント メモリ : 1 MB 可変長/最大64KB コンベンショナルエリア UMA :

    Upper Memory Area (予約領域) 640KB Intel 80286(余談) HMA 64KB 完全にバグだったもの
  3. Intel 8086 CPU レジスタ メモリ セグメント 高速 > 低速 16bit

    (整数レジスタ) / レジスタ CPU の中でデータを保持する箱 = + X と Y の箱が必要 X X Y レジスタって?
  4. 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
  5. リアルモード プロテクトモード - 16bit - RAMに自由アクセス - RAM 640KBを利用可能 -

    32bit - RAMにアクセス制限 - RAM 4GBを利用可能 ロングモード - 64bit - RAMにアクセス制限 - RAM 1TBを利用可能 ※理論上は1PBまで (※80286以外)
  6. 特権管理 特権命令 Ring 3 Ring 2 Ring 1 Ring 0

    Device drivers Device drivers Applications Kernel 低 高 権限 リングプロテクション
  7. 一般保護例外 メモリ OS アプリ-A アプリ-B ( Ring-0 ) ( Ring-3

    ) ( Ring-3 ) アプリ-A 一般保護例外 ( GPF : General Protection Fault ) ページフォルト ( PF : Page Fault )
  8. Segmentation Fault - Segmentation Fault - SYSSEGVシグナルに紐付くいずれかの例外が発生した(※Linux) - 一般保護例外 -

    CPU保護機構に基づく権限的な例外が発生した - Segmentation Faultの一種 - 混同しがち(※自分的に)
  9. メモリ管理 / ページング リニアアドレス空間 ページ リニアアドレス PDE PTE OFFSET PDE

    PTE ※PDE毎に1ページのサイズを4KB/4MBから選択できる ※PDEを複数段に分割管理する場合がある
  10. メモリ管理 / セグメンテーション GDT リニアアドレス空間 セグメント セグメントベース リミット値 特権レベル(DPL) Segment

    Descriptor : 実行時権限(CPL)と比較される 最大8,192個 リニアアドレス ※現在多くのOSでは、メモリ全体を1つのセグメントとしている 論理アドレス OFFSET SEGMENT
  11. タスク管理 タスク生成 実行可能状態 入出力要求 (スーパーバイザコール) 待ち状態 実行状態 ディスパッチャ 入出力完了 (待機完了)

    プリエンプション ディスパッチング タスク終了 / プリエンプティブ 各タスクの状態はTSS : Task State Segmentによって管理される
  12. BIOS起動の場合 ブートシーケンス BIOS Bootstrap Loader Kernel Loader Kernel MBR =

    512バイト 最低限の初期化処理 カーネルロードに 必要な初期化処理 カーネル本体
  13. 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 ジャンプ ブートシーケンス 後で説明
  14. 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
  15. INT = 割込 割込の種類 命令 ソフトウェア割込 ユーザプログラムがシステムコールを呼び出す ハードウェア割込(IRQ) 周辺機器からの信号(InterRupt reQuest)によって発生する

    例外 TRAP INT, INTO命令の実行によって発生する FAULT 保護機能、MMUのチェックによって発生する ABORT 処理を続けられないエラーによって発生する 強 弱
  16. 例外の種類 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
  17. 例外の種類 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
  18. Kernel User Land Operating System Application User Hardware ライブラリ システムコール

    時間管理 メモリ管理 タスク管理 ドライバ シェル アクセサリ ファイル管理
  19. / 95 システムコール - システムコールを発行する方法は 3 種類 - SYSCALL 新しい方法、AMD発、古いCPUでは対応していない

    - SYSENTER 新しい方法、Intel発、古いCPUでは対応していない - INT 0x80 最も古い方法、特化していないのでオーバーヘッド多い - EAXの値によって呼び出される機能が異なる - 特権が必要な処理をOSに要求する(Call-Gate方式) 80
  20. system_call_table 1/2 0 1 2 3 : sys_read() sys_write() sys_open()

    sys_close() : OS起動時にメモリ上に設定しておく (※各動作モードを切替えた際)
  21. 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() :
  22. 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
  23. CPUがメモリを管理する為の情報を一元管理する - Segment Descriptor - TSS Descriptor - Call Gate

    Descriptor 異なる特権レベル呼出に利用する - Interrupt Gate Descriptor 割込/例外処理時に利用する - Task Gate Descriptor タスクスイッチ時に利用する - Trap Gate Descriptor 割込/例外処理時に利用する : Global Descriptor Table
  24. 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 ~ エンジニアの登壇を応援する会 出張版
  25. 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 - アセンブラの基礎
  26. Appendix / Books - 32ビットコンピュータをやさしく語る はじめて読む486 / 蒲地輝尚 - 30日でできる!OS自作入門

    / 川合 秀実 - ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ / 坂井弘亮 - 新装改訂版 Linuxのブートプロセスをみる / 白崎 博生 - プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識 / 矢沢 久雄 - CPUの創りかた / 渡波 郁 - ゼロからトースターを作ってみた結果 / トーマス・トウェイツ
  27. #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