BSDカーネルの設計と実装 読書会(4) 3.5章 100〜103p メモリ管理サービス

1,286 views

Published on

BSDカーネルの設計と実装 読書会 (4) のときに僕が担当した部分の資料です.

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,286
On SlideShare
0
From Embeds
0
Number of Embeds
361
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

BSDカーネルの設計と実装 読書会(4) 3.5章 100〜103p メモリ管理サービス

  1. 1. BSDカーネルの設計と実装 読書会(4)3.5章 100〜103p メモリ管理サービス @miettal
  2. 2. 正誤● 99pの図3-3 FreeBSDにおけるプロセスのメモ リとディスク上の配置 実行ファイルディスク イメージ ● X 非初期化データ ● O 初期化済みデータ
  3. 3. 3.5章 メモリ管理サービス の内容● メモリセグメント● 実行ファイルの種類とその判別● プログラムのメモリへの配置● プロセスエントリ
  4. 4. メモリセグメント● プロセスの持つメモリ領域の分類?● テキスト← int main(void){ printf(...● データ←グローバル変数やstatic変数 ● 初期化されたデータ← int ptr = 0xff00; ● 初期化されないデータ(BSS)← int ptr;● スタック←ローカル変数や仮引数,戻り番地... プロセスのメモリセグメント スタック データ テキスト
  5. 5. 実行ファイル● 通常のファイルの内,一つ以上の実行ビットが 1のファイル(パーミッションのこと)● FreeBSDは以下の2種類の形式をサポート ● インタプリタが実行するファイル ● 直接実行可能なファイル(AOUT, ELF, 圧縮済みELF)
  6. 6. execヘッダ● 実行ファイルは先頭にexecヘッダ(マジックナンバー)を持つ● イメージアクティベータがマジックナンバーを見て,実行の準 備をする ● インタプリタが実行するファイル – 0x23, 0x21(“#!”) インタプリタが 実行するファイル ELF ● 実行可能なファイル “#!” 0x7f – ELF ● 0x7f “/bin/sh” ELFヘッダ – AOUT プログラム テキスト ● 0407(8進数注意) データ ● 0410 (初期化済み) ● 0314 デバッグ情報
  7. 7. インタプリタが実行するファイル● 以下の内容のヘッダを持つ ● インタプリタの場所(128文字まで) 例) #!/bin/sh –● インタプリタにインタプリタが実行するファイ ルを指定することはできない ●つまりネスト禁止● イメージアクティベータはインタプリタを探 し,ファイルを引数としてセットする b.sh a.sh #!/bin/sh #!/a.sh echo “TEST” できない
  8. 8. 直接実行可能なファイル● 主に以下の内容のヘッダを持つ ● 対象アーキテクチャ,対象オペレーティングシステム ● 静的リンクか共有ライブラリを使用するか ● テキスト,データセグメントのサイズ ● デバッグ情報のサイズ● イメージアクティベータはヘッダの情報を読み ● 対象OSが違っても(Linux向けなど),正しく動作するよ うにする – OSが違うとシステムコールの番号が違ったり,システムコール の呼び出し方が違うため
  9. 9. プロセスのメモリ(1) プロセスのメモリ プログラム ... データ データ (初期化済み) (初期化済み) 最初のページだけ読む テキスト 0x00001000 テキスト プログラム カウンタ ヘッダ 空 0x00000000プログラムの最初の部分だけコピーされる NULLポインタのため開けておく
  10. 10. プロセスのメモリ(1) プロセスのメモリ プログラム ... データ データ (初期化済み) (初期化済み) ページフォールト テキスト プログラム カウンタ テキスト ヘッダ 空 0x00000000実行を続けていくとコピーしていないページ部分にプログラムがアクセスする
  11. 11. プロセスのメモリ(1) プロセスのメモリ プログラム ... データ データ (初期化済み) (初期化済み) テキスト プログラム カウンタ 0x00001000 テキスト ヘッダ 空 0x00000000プロセスは,それぞれのページに対応するプログラムのメモリのオフセットを保持している 要求時ページングと呼ぶ
  12. 12. 0xbfbfffff プロセスのメモリプロセスのメモリ(2) ps_strings シグナルコード env argv・スタック上限は実行時に決 envポインタまっている argvポインタ・スタックを前もって大きく argcするように(シェルなどに) スタック伝える・スタック上限を超える場 ↓ スタック上限合,スタック上限を大きくし 共有ライブラリて,execシステムコールで自分自身を再起動する? ↑・共有ライブラリはmmapシ ヒープステムコールにより確保 データ (初期化済み) テキスト 空 0x00000000
  13. 13. 0xbfbfffff プロセスのメモリプロセスのメモリ(3) ps_strings シグナルコード env argv・システムが実行時に引数な envポインタどをセット argvポインタ・ps_strings構造体はpsコマ argcンドがプロセスのargvの場所 スタックを知るために用いる ・psコマンドで引数を表 ↓示されるのはこのため 共有ライブラリ・シグナルコードはシグナルに対応する処理へのポインタ ↑を格納している(と思われ ヒープる) データ (初期化済み) テキスト 空 0x00000000
  14. 14. 0xbfbfffff プロセスのメモリプロセスのメモリ(4) ps_strings シグナルコード env argv・sbrkシステムコールで拡張 envポインタ・ライブラリ関数mallocを通 argvポインタ常は使う argc スタック ↓ 共有ライブラリ ↑ ヒープ データ (初期化済み) テキスト 空 0x00000000
  15. 15. プロセスエントリ● カーネルはプロセスの情報を含むプロセスエン トリをリンクリストで保持する.● プロセスエントリはスワップアウトしたとき, メモリ上に復活させるための情報が含まれてい なければならない● スワップアウトされている間でも必要な情報 (優先度など)はユーザー構造体ではなくプロ セス構造体になければならない
  16. 16. ソースコードとの対応箇所● kern/kern_exec.c● kern_execve● Imgp● execsw
  17. 17. 演習問題● 3.7 ● 初期化済みデータはメモリに展開されるデータと同 じものが実行ファイルに書かれている ● ファイルサイズ削減のため – 非初期化データは領域サイズを指定するだけで済む.そ うすれば,その領域を0で埋めればよい● 3.8 ● ほとんどスライド説明したので省略

×