---
title: みかん本輪読会_17
tags: 
author: [こた](https://www.docswell.com/user/kota)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/KJ4M4M2VE1.jpg?width=480
description: みかん本輪読会_17 by こた
published: August 17, 25
canonical: https://www.docswell.com/s/kota/ZQXNW7-mikan-17
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/KJ4M4M2VE1.jpg)

みかん本輪読会
17章
ファイルシステム


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LE1848M47G.jpg)

ファイルとは
p.396
- 任意のバイト列に名前等をつけたもの
ちなみに授業では
- 大量の情報を保持できること
- 情報は使用したプロセスが失われても残ること
- 他の複数のプロセスからも利用できること
→ 上記3つの要求に応える具体的な解答


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GEWZXZ3ZE2.jpg)

ブロックデバイス
p.396
- データの記録にはファイルは必須ではない
- SSDやUSBメモリはデータ領域が固定の大きさをもつブ
ロックに分割されて、ブロック単位で読み書き
→ ブロックデバイスと呼ぶ
- 1ブロックで足りないデータは複数個繋げれば良い
- データの大きさが変化しなければうまく機能する
→ データが大きすぎても小さすぎてもダメ柔軟性なし


# Page. 4

![Page Image](https://bcdn.docswell.com/page/47Z161VLJ3.jpg)

ファイルシステム
p.396
- 管理データの置き方やブロックの割り当て方によって
様々なファイルシステムがある
→ linuxだとext4やbtrfs
windowsだとFAT16/32やNTFS、exFAT
macだとHFS、HFS+、APFS
他にもZFSやColossusなど
- UEFI規格ではFATが標準的に用いられる


# Page. 5

![Page Image](https://bcdn.docswell.com/page/YJ6L2L5MEV.jpg)

ファイル方式のメリット
p.396
- データに名前をつけて管理
- 名前とブロック番号の対応表を使用する
- 対応表のおかげで複数の区画でデータを記録可能
- 動的にブロックの割り当てが可能
→ 名前とブロック番号の対応表を管理する機能を中心と
した仕組みをファイルシステムと呼ぶ


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GJ5121YQ74.jpg)

FATのボリュームイメージを作る
p.396~397
- ddコマンドはifで指定したファイルからofで指定したファ
イルにコピーする
- /dev/zeroはゼロが無限に読み出せる
- bsはddが1度にコピーする大きさ(ブロックサイズ)
- countはコピーするブロックサイズ
- 結局は128MiBだけifからofにコピーされる
- mkfs.fatはFAT形式でフォーマットするコマンド


# Page. 7

![Page Image](https://bcdn.docswell.com/page/9E2141GWJR.jpg)

ボリュームイメージを見てみる
p.397


# Page. 8

![Page Image](https://bcdn.docswell.com/page/D7YZMZV9JM.jpg)

ボリュームイメージに書き込み
p.397~398
- ボリュームをマウントして適当なテキストファイルをコ
ピー
- hexdumpする


# Page. 9

![Page Image](https://bcdn.docswell.com/page/VEN3W3MDE8.jpg)

更にボリュームイメージに書き込み
p.398~399
- 大文字小文字混合の8文字以上のファイル名にする
- ファイル名がOSAKAI~1DATになっている
中身はそのまま


# Page. 10

![Page Image](https://bcdn.docswell.com/page/Y799X9N873.jpg)

BIOS パラメータブロック
p.400
- これまでに作成したボリュームイメージは1つのパー
ティションを表している
→ ブロックデバイスを複数に分割した1つの領域
- パーティションの先頭1ブロックをPBRと呼ぶ
→ パーティションの大きさやどこから始まるかの情報
- PBRの中でもBPBと呼ばれる領域が特に重要 表17.2


# Page. 11

![Page Image](https://bcdn.docswell.com/page/G78929KZJD.jpg)

ディレクトリ
p.402
- ファイルシステムの構成を管理するためのファイル
で、複数のファイルやディレクトリを格納可能
- FATでは特殊なファイルとして表現
- ディレクトリエントリという32バイトのデータ構造が配
列状に並んだ構造


# Page. 12

![Page Image](https://bcdn.docswell.com/page/L7LW2WZ1ER.jpg)

FATファイルシステムでのディレクトリエントリ


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4EM989V57W.jpg)

ボリュームを読み出す
p.403
- BPBの値からルートディレクトリの位置を取得し、その
中身をディレクトリエントリの構造に従って読めばボ
リュームイメージ内のファイルの一覧を得られる
- しかしボリュームイメージをメモリに読み出す方法が
まだ分からない
→ 具体的にはブロックデバイスからの読み出し方法


# Page. 14

![Page Image](https://bcdn.docswell.com/page/PERG5G2Z79.jpg)

ブロックデバイスからの読み出し
p.403
- 一般的なOSではドライバが準備されている
- ドライバを開発するのはすごく大変
→ UEFIにあるBlock I/O Protocolを使う
- OSが起動する前にブロックデバイスのデータをまとめ
て読み出す
- OSはブートローダーがメモリ上に読み出したデータを読
み込む


# Page. 15

![Page Image](https://bcdn.docswell.com/page/P7XXKXD17X.jpg)

ボリュームイメージの読み込み
p.404
- リスト17.1はボリュームイメージを読み出す処理
- 前半は起動メディアにfat_diskがあるか調べる
- なければ全体を読み込みボリュームイメージを探す
- ファイルはkernel.elfを読み込む処理と同じ
- ReadFileにファイルを渡すとvolume_imageに戻す
- fat_diskがない場合はBlock I/O Protocolを用いて起
動メディアの先頭ブロックから読み込む


# Page. 16

![Page Image](https://bcdn.docswell.com/page/37KW5WXM7D.jpg)

Block I/O Protocol
p.404~410
- OpenBlockProtocolForLoadImage()でBlock I/O
Protocolを取得しblock_io変数に設定
- block_io-&gt;Mediaにはブロックデバイスの各種情報
- BlockSizeとLastBlockで最大サイズ(byte)を求める
- volume_byte(全体のサイズ)は16MB
→ 全体を読み込むとメモリがなかったり時間がかかる
- ReadBlocks()でデータを読み込む


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LJ31K152E5.jpg)

lsコマンド
p.410~414
- OSがボリュームイメージを受け取れるようになったので
lsコマンドが作れる
→ ボリュームに含まれるファイルの一覧を出す
- リスト17.10で実装
→ ルートディレクトリの先頭ポインタを取得しforでルート
ディレクトリの中身を順に表示する


