オペレーティングシステム2006 ファイル管理 (3) 演習へのヒント他

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

プログラミング演習 II 2005 年 1 月 19 日(第 9 回) 理学部数学科・木村巌. 前回までの復習 共用体( union type ) 共用体( union type ) 列挙 (enumerated type ) 列挙 (enumerated type ) 構造体、構造体のポインタ、
ファイルキャッシュを考慮したディスク監視のオフロード
Unix の ファイルシステム(File System)
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
■パス検索 各種ファイルを操作するには、まずパス名をiノードに変換しなければならない。 以下にパス名をiノードに変換する関数の説明を行う。
Linux インストール      のための基礎知識 物理実験 I 情報実験第9回 2003/12/12 中神 雄一.
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
ファイルシステムの構造 外部記憶装置のパーティション(区画) ファイルシステムとパーティション(区画) ファイルシステムのmount
Ex7. Search for Vacuum Problem
Ex8. Search for Vacuum Problem(2)
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
基礎プログラミングおよび演習 第9回
C言語 配列 2016年 吉田研究室.
数値計算及び実習 第7回 プログラミングの基礎(5).
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
輪講: 詳解TCP/IP ACE B3 suzuk.
プログラミング論 II 電卓,逆ポーランド記法電卓
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
ファイルシステムキャッシュを 考慮したIDSオフロード
Linuxカーネルについて 2014/01.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 構造体, 構造体とポインタの組み合わせ,.
オペレーティングシステム2005 デバイス管理 (1)
二分探索木によるサーチ.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
プログラミング2 関数
Cプログラミング演習 中間まとめ2.
Cプログラミング演習 第6回 ファイル処理と配列.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
アルゴリズムとデータ構造 補足資料4-1 「メモリと配列」
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
デジタル画像とC言語.
情報基礎Ⅱ (第11回) 月曜4限 担当:北川 晃.
演習2の解答例 2006年12月22日 海谷 治彦.
演習1の解答例の解説 2006年11月8日 海谷 治彦.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
Cプログラミング演習 第10回 二分探索木.
先進的計算基盤システムシンポジウム SACSIS2007併設企画 マルチコアプログラミングコンテスト 「Cellスピードチャレンジ2007」
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第4回 ファイル入出力方法.
Ex7. Search for Vacuum Problem
オペレーティングシステム i386アーキテクチャ(1)
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
プログラミング演習I 2003年7月2日(第11回) 木村巌.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
R8C I/Oポートの仕組み SFR定義ファイルの中身.
高度プログラミング演習 (11).
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 2005年10月28日(金).
高度プログラミング演習 (11).
モジュール分割.
ネットワーク・プログラミング 1対多のプロセス間通信.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
ネットワーク・プログラミング プロセスとファイルシステム管理.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
高度プログラミング演習 (10).
Presentation transcript:

オペレーティングシステム2006 ファイル管理 (3) 演習へのヒント他 2006年11月17日 海谷 治彦

目次 Ext2の構造再び 実際のExt2データ(ディスクの中身)を解析 バイトオーダーについて ディレクトリを保持するデータブロックについて iノードの探索 バイトオーダーについて i386とPPCの違い Little Endian vs Big Endian

演習で使うFSの構造 (ブロックグループが1個) 1440個のブロック, ブロックサイズは1024B iノードを184個分 (8×23) 1個 23個 1412個 1 2-2 3 4 5-27 28-1439 ブート ブロック スーパー ブロック グループ ディスクリプタ データ ブロック ビットマップ iノード ビットマップ iノード テーブル データ ブロック 41 カーネル本 p.577 1ブロック 1ブロック 複数ブロック 1ブロック 1ブロック 複数ブロック 複数ブロック ココはExt2で使わない 演習2ではココ(0から数えて41個目)を使う

演習3の大まかな流れ ブロック41を取り出す. その中身を構造体 ext2_dir_entry_2 に従い解析する. サンプル getblock.c (任意のブロックを切り出すもの) その中身を構造体 ext2_dir_entry_2 に従い解析する. この構造体は可変長なのでタチが悪い. 個々のインスタンスの長さは読み込んで,メンバーrec_lenの値を読まないと解らない. よって,まずは本構造体が最大長であると仮定して,ext2_dir_entry_2 構造体に読み込み,rec_len の長さを得て,次のインスタンスまでポインタを進めればよい. 上記がヒントですが,さらに多少の工夫が必要.

ext2_dir_entry_2 型: 1 通常ファイル, 2 ディレクトリ, 7 シンボリックリンク 他 // include/linux/ext2_fs.h の501行目 struct ext2_dir_entry_2 { __u32 inode; // そのディレクトリのiノード番号 __u16 rec_len; // 構造体のサイズ,name[]のため可変 __u8 name_len; // ファイル名の長さ \0 は含まず __u8 file_type; // ファイルの型番号 char name[EXT2_NAME_LEN]; // ファイル名 }; 通常,255 効率化のため4の倍数長になっている.不要な部分には \0 文字が詰めてある.

例: とあるデータブロックの中身 file_type inode番号 rec_len name 21 12 1 2 . \0 \0 \0 22 12 2 2 . . \0 \0 53 16 5 2 h o m e 1 \0 \0 \0 67 28 3 2 u s r \0 16 7 1 o l d f i l e \0 34 12 4 2 s b i n name_len

例: /usr/bin/cal の番号を探す データブロック B0 B1 B2 B3 B4 B5 iノード テーブル user 4 etc 20 boot 31 cal 3 man 44 make 57 bin 9 local 101 X11 202 ファイルの中身 があるブロック群 ファイルの中身 があるブロック群 「/」 はiノード番号2番と決まっている. 1 ファイルの中身 があるブロック群 ファイルの中身 があるブロック群 2 B0 3 B84,85... 4 ここは後述 B5 5 9 B2 前回とはちょっと直してあります

ファイルの格納例 (1) % ls -l exercise01/index.html 4341 exercise01/index.html 構造体ext2_inode i_block[0] 1 1024B データブロック 2 3 直接ブロック5個利用. 最後のブロックは245Bしか使ってないはず. (4341-1024*4=245) 1024B データブロック 4 5 1024B データブロック 6 1024B データブロック 7 8 1024B データブロック 9 10 11 12 13 14

ext2_inodeの一部 include/linux/ext2_fs.h の217行目あたりから 全部で128バイト struct ext2_inode { __u16 i_mode; /* File mode */ __u16 i_uid; /* Owner Uid */ __u32 i_size; /* Size in bytes */ __u32 i_atime; /* Access time */ __u32 i_ctime; /* Creation time */ __u32 i_mtime; /* Modification time */ __u32 i_dtime; /* Deletion Time */ __u16 i_gid; /* Group Id */ __u16 i_links_count; /* Links count */ __u32 i_blocks; /* Blocks count */ __u32 i_flags; /* File flags */ union { // ** 省略 } osd1; /* OS dependent 1 */ __u32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ __u32 i_version; /* File version (for NFS) */ __u32 i_file_acl; /* File ACL */ __u32 i_dir_acl; /* Directory ACL */ __u32 i_faddr; /* Fragment address */ } osd2; /* OS dependent 2 */ }; include/linux/ext2_fs.h の217行目あたりから 全部で128バイト

演習3(かも)の指針 基本的に数ページ前のスライド「例: /usr/bin/calの番号を探す」と同じことをする. そこから,配列 i_block[] の中身を使って,該当するデータブロックを得る.

おまけサンプル readsuper.c 単なるおまけではなく,この手のバイト単位データを解析するプログラムの例題にもなっています. スーパーブロックの情報を読んで画面に出力するもの. バイト単位のデータを扱う参考にしてください. 単なるおまけではなく,この手のバイト単位データを解析するプログラムの例題にもなっています. ので,ちょっとだけ解説します.

いくつかの注意 iノードは1から順番に数えてください. ブロック番号は0から順番に数えてください.

バイトオーダー 2バイト以上のデータを保存したり通信転送したりする場合,最上位のデータから送る場合と,最下位から送るかの違いがCPUによってある. 最上位: Big Endian と呼ぶ PPC (Power PC, Macに搭載)のCPUはこっち 最下位: Little Endian と呼ぶ i386 (WinPC)のCPUはこっち i386の場合は,データ型毎にバイト単位で順序がひっくり返っている!

マクロ rev32 rev16 rev32(x) 4byteのデータのバイトーダーをひっくり返す ext2_os2006.h の最後のほうに入ってます.

オーダー確認プログラム main(){ int x=1; // 0x00000001 if (*(char*)&x) { /* little endian. memory image 01 00 00 00 */ puts("little"); }else{ /* big endian. memory image 00 00 00 01 */ puts("big"); }

今回の演習での注意 今回の練習ではバイト単位のデータファイルを扱うので,バイトオーダーの問題がモロ関係する. マック所有が大多数なので,注意してください. Ext2は Little Endian (非マック型)で保存されています.