0から作るソフトウェア開発

日々勉強中。。。

Tips
リンク

ファイルシステム >

0から作るLinuxプログラム Ext2ファイルシステム ステップ1 Ext2ファイルシステムタイプとマウントメソッド

Ext2ファイルシステム

Linuxのファイルシステムのうち基本的なファイルシステムであるExt2について
みていきます。

それでは、順番に見ていきます。

目次 Ext2ファイルシステム

  1. ファイルシステムの概要

  2. ファイルシステムへのアクセス

  3. カーネルサイドから見たシステムコール

  4. ファイルシステム関連のシステムコール

  5. 仮想ファイルシステム(VFS)

  6. ステップ0 Ext2ファイルシステムと簡単なモジュールの実装

  7. (現在のページ) ステップ1 Ext2ファイルシステムタイプとマウントメソッド

  8. ステップ2 Ext2スーパーブロックの読み込み

  9. ステップ3 スーパーブロック管理情報

  10. ステップ4 マウントとスーパーブロックオブジェクト

  11. ステップ5 スーパーブロックオブジェクトと管理情報のセットアップ

  12. ステップ6 ブロックグループディスクリプターの読み込み

  13. ステップ7 ルートディレクトリのinode読み込み

  14. ステップ8 簡単なディレクトリの読み込み

  15. ステップ9 ディレクトリ読み込みとページキャッシュとaddress_space

  16. ステップ10 inodeオブジェクトのlookupメソッド

  17. ステップ11 inodeオブジェクトのmkdirメソッドとper-cpuカウンター

  18. ステップ12 簡単なブロックの新規割り当て処理

  19. ステップ13 スーパーブロックオブジェクトのwrite_inodeメソッド

  20. ステップ14 Orlov方式による新規ディレクトリのinodeを割り当てるブロックグループ選択

  21. ステップ15 inodeオブジェクトのrmdirメソッドとunlinkメソッド

  22. ステップ16 inodeオブジェクトのrenameメソッド

  23. ステップ17 inodeオブジェクトのcreateメソッドとファイルオブジェクトの汎用メソッド

  24. ステップ18 inodeオブジェクトのlinkメソッド

  25. ステップ19 シンボリックとinodeオブジェクトのsymlinkメソッド

  26. ステップ20 inodeオブジェクトのmknodメソッドとtmpfileメソッド

  27. ステップ21 スーパーブロックオブジェクトのevict_inodeメソッド

  28. ステップ22 スーパーブロックオブジェクトのsync_fsメソッド

  29. ステップ23 スーパーブロックオブジェクトのstatfsメソッドとメモリーバリアー/フェンス

  30. ステップ24 スーパーブロックオブジェクトのremount_fsメソッドとマウントオプション解析

  31. ステップ25 スーパーブロックオブジェクトのshow_optionsメソッドとprocfs

  32. ステップ26 カーネルオブジェクトとsysfs

  33. ステップ27 スーパーブロックオブジェクトのfreeze_fs/unfreeze_fsメソッド

  34. ステップ28 ファイルオブジェクトのioctlメソッド

  35. ステップ29 ファイルオブジェクトのsetattrメソッド

  36. ステップ30 address_spaceのdirect_IOメソッド

  37. ステップ31 リザベーションウィンドウ

  38. ステップ32 拡張アトリビュートその1 ハンドラーの呼び出し

  39. ステップ33 拡張アトリビュートその2 コア処理

  40. ステップ34 POSIX ACLその1 ハンドラーの呼び出し

  41. ステップ35 POSIX ACLその2 コア処理

  42. ステップ36 ディスククォータ

Ext2ファイルシステムタイプ

ここまでで、簡単なモジュールを作成することができるようになりました。ここからは、

作成したモジュールを拡張してExt2ファイルシステムの実装をしていきたいと思います。



ここでは、仮想ファイルシステムで見てきましたファイルシステムタイプオブジェクト

を実装していきます。ユーザー空間からマウントを行うときにmountシステムコール

でファイルシステムタイプを指定していました。カーネルはユーザーが指定したファイル

システムタイプがあるかファイルシステムタイプオブジェクトを走査して探します。このため、

各ファイルシステムはマウントされるために必ずファイルシステムタイプオブジェクトの

登録
を行っておく必要があります。また、ファイルシステムをモジュールとして作成

している場合、モジュールの削除したときにファイルシステムタイプオブジェクトの削除

をする必要があります。


お気づきの方もいらっしゃるかと思いますが、簡単なモジュールの作り方で見てきました

module_initで登録した初期化関数(initMe2fs関数を作りました)でファイルシステム

タイプオブジェクトの登録を行い、module_exitで登録した終了処理関数(exitMe2fs

関数を作りました)でファイルシステムタイプオブジェクトの削除を行えばよいことがわかります。


では、ファイルシステムタイプオブジェクトとはいったいどのようなものなのかを見ていきましょう。

ファイルシステムタイプオブジェクト

ファイルシステムタイプオブジェクトの簡単な説明は仮想ファイルシステムで見てきました。

ここでは、どのように定義されているのかその構造体を見ていきます。次のような構造体で

定義されています。


struct file_system_type {
    const char *name;
    int fs_flags;

    struct dentry *(*mount) (struct file_system_type *, int,
               const char *, void *);
    void (*kill_sb) (struct super_block *);
    struct module *owner;
    struct file_system_type * next;
    struct hlist_head fs_supers;

    struct lock_class_key s_lock_key;
    struct lock_class_key s_umount_key;
    struct lock_class_key s_vfs_rename_key;
    struct lock_class_key s_writers_key[SB_FREEZE_LEVELS];

    struct lock_class_key i_lock_key;
    struct lock_class_key i_mutex_key;
    struct lock_class_key i_mutex_dir_key;
};



file_system_type構造体
メンバー 説明
const char *name ファイルシステム名となります。マウント時にここに定義されている名前でファイルシステムを特定します。つまり、mountシステムコールでユーザーが指定するファイルシステムタイプとなります。
intfs_flags ファイルシステムタイプのフラグです。ファイルシステムをマウントするときの挙動をVFSに通知します。次のようなフラグが指定でき、OR結合で複数のフラグを指定することができます。
				
#define FS_REQUIRES_DEV         1 
#define FS_BINARY_MOUNTDATA     2
#define FS_HAS_SUBTYPE          4
#define FS_USERNS_MOUNT         8  /* Can be mounted by userns root */
#define FS_USERNS_DEV_MOUNT     16 /* A userns mount does not imply MNT_NODEV */
#define FS_RENAME_DOES_D_MOVE   32768 /* FS will handle d_move() during rename()
                                         internally. */

ファイルシステムタイプのフラグ
フラグ 説明
FS_REQUIRES_DEV マウントを行うのにブロックデバイスが必要なファイルシステムです。
FS_BINARY_MOUNTDATA マウントオプションをバイナリーで解釈します。セキュリティ関連で使用します。
FS_HAS_SUBTYPE fuseとfuseblkで作成したファイルシステムタイプを区別するのに使用します。"."でサブタイプを区切ります。
FS_USERNS_MOUNT ユーザー名前空間のルートとしてマウントすることができます。
FS_USERNS_DEV_MOUNT ユーザー名前空間のマウントでデバイスファイルにアクセスすることができます。
FS_RENAME_DOES_D_MOVE ファイルシステムはリネームを行っているときにその内部でd_moveを行います。

struct dentry *(*)(...)mount マウントメソッドです。詳細はこの後見ていきます。
void (*)(struct super_block* )kill_sb スーパーブロックオブジェクトを破棄するメソッドです。詳細はこの後見ていきます。
struct module *owner ファイルシステムのカーネルモジュールを参照します。
struct file_system_type *next ファイルシステムタイプの連結リストです。次のファイルシステムタイプを参照します。
struct hlist_headfs_supers このファイルシステムタイプでマウントされているスーパーブロックオブジェクトのハッシュリストです。例えば、ext2ファイルシステムが複数のマウントポイントにマウントされているときに、それぞれのスーパーブロックオブジェクトがハッシュリストに登録されます。
struct lock_class_key各メンバー lockdepによりスピンロック、ミューテクス、セマフォーなどの依存性をチェックしてデッドロックなどのを検出するためのカーネルデバッグ用メンバーとなります。


ファイルシステムタイプオブジェクトは仮想ファイルシステムで次のように連結されています。

ファイルシステムタイプオブジェクト

ファイルシステムタイプオブジェクトを登録すると前図のリストに連結され、仮想ファイルシステムで

管理されるようになります(mount時にマウントメソッドが呼ばれるようになります)。また、削除すると

連結リストから取り除かれ、仮想ファイルシステムの管理対象外となります。

ファイルシステムタイプオブジェクトのメソッド

file_system_type構造体に定義されている、mountがマウントメソッドで、kill_sbがスーパーブロック

オブジェクトを破棄するメソッドとなります。ファイルシステムタイプオブジェクトを登録後にmount

システムコールが呼び出されると、仮想ファイルシステムはファイルシステムタイプオブジェクト

のマウントメソッドを呼び出し、ファイルシステム固有のマウント処理が開始されます。また、

unmountシステムコールが呼び出されると、仮想ファイルシステムはファイルシステム

タイプオブジェクトのスーパーブロックオブジェクトを破棄するメソッドを呼び出し、ファイルシステム

固有のアンマウント処理が開始されます。

ファイルシステムタイプオブジェクトのメソッド呼び出し

それではメッソドに登録するExt2ファイルシステムの処理を実装していきましょう。

マウント(mount)メソッド

マウントメソッドは次のような型の関数を定義します。


struct dentry *( *mount )( struct file_system_type *fs_type,
                           int flags,
                           const char *dev_name,
                           void *data );



mountメソッドの引数
名前 説明
struct file_system_type *fs_type ファイルシステムタイプオブジェクトのポインターです。mountシステムコールで指定されたファイルシステムタイプのオブジェクトとなります。
intflags mountシステムコールで指定されたマウントフラグです。
const char *dev_name mountシステムコールで指定されたデバイス名です。
void *data mountシステムコールで指定されたマウントオプションです。


マウントメソッドの戻り値は次のようになります。

mountメソッドの戻り値
説明
struct dentry * ファイルシステムのルートのdエントリーを返します。


基本的にユーザーがシステムコールで指定したものが渡されます。

今回は次のように簡単に実装してみます。


/*
==================================================================================
    Function    :me2fs_mount
    Input       :struct file_system_type *fs_type
                 < file system type >
                 int flags
                 < flags for mounting >
                 const char *dev_name
                 < device file name >
                 void *data
                 < options >
    Output      :void
    Return      :dentry *
                 < root dentry object >

    Description :mount a ext2 fs
==================================================================================
*/
static struct dentry *me2fs_mount( struct file_system_type *fs_type,
                                  int flags,
                                  const char *dev_name,
                                  void *data )
{
    DBGPRINT( "<ME2FS>: i am not yet implemented.\n" );
    return( NULL );
}



今回は関数が呼び出されたことを確認するためにデバッグ情報を出力し、ルートdエントリーは

NULLを返します。NULLを返すとマウントが失敗します。

スーパーブロックオブジェクトを破棄する(kill_sb)メソッド

スーパーブロックオブジェクトを破棄するメソッドは次のような型の関数を定義します。


void ( *kill_sb )( struct super_block *sb );



kill_sbメソッドの引数
名前 説明
struct super_block *sb 破棄するスーパーブロックオブジェクトのポインターです。スーパーブロックオブジェクトの構造体は後ほど詳しく見ていきます。


kill_sbメソッドには戻り値はありません。


kill_sbメソッドはExt2ファイルシステムでは特に行うことはありませんが、

スーパーブロックオブジェクトの破棄は行う必要があります。この処理は通常

ブロックデバイスをマウントするファイルシステム共通処理となりますので仮想

ファイルシステム層で処理が用意されています。ですので、共通処理となる

kill_block_superを呼び出すことになります。

補足
ブロックデバイスを持つファイルシステムではkill_block_superを

呼び出すことになります。kill_block_superは共通処理のため、

実装は仮想ファイルシステム層となります。fs/super.cに処理の

実体がありますので、興味があれば参照してみてください。



今回はkill_sbを実装していません。ステップ4で実装していきます。

Ext2ファイルシステムタイプオブジェクトの実装

ファイルシステムタイプオブジェクトの構造体定義がわかりましたので、その実体である

Ext2のファイルシステムタイプオブジェクトを実装していきましょう。


ファイルシステムタイプオブジェクトは基本的に仮想ファイルシステムが管理を行います

ので、ファイルシステム固有となるメンバーのみ値を定義していけばO.K.となります。

具体的には、先ほど見てきましたname、fs_flags、mount、kill_sbとなり

ます(今回はkill_sbは定義していません。ここではNULLとなります)。次のように

実装します。


/*
---------------------------------------------------------------------------------
    File system type
---------------------------------------------------------------------------------
*/
static struct file_system_type me2fs_fstype =
{
    .name       = "me2fs",
    .mount      = me2fs_mount,
    .fs_flags   = FS_REQUIRES_DEV,
};




名前はme2fsにしています。この名前をmountシステムコールに指定することで

マウントできるようになります。(処理自体はExt2のマウントを行っていきます)。実際には

Ext2の実装となりますので、ブロックデバイスが必要となります。仮想ファイルシステムに

通知するためにfs_flagsにはFS_REQUIRES_DEVを指定します。後はマウントメソッドに

先ほど実装しましたme2fs_mount関数のアドレスを定義しておきます。これでマウント処理が

行われるとme2fs_mount関数が呼び出されます。



Me2fs(Ext2)ファイルシステムタイプオブジェクトができましたので、これを登録していく必要が

あります。

ファイルシステムタイプオブジェクトの登録と削除

ファイルシステムタイプオブジェクトは登録と削除を行う必要があると最初の方で

書いていたと思います。ここでは、登録と削除の方法を見ていきます。といいましても

驚くほど簡単です。登録と削除はファイルシステム共通処理となるため、仮想

ファイルシステム層の関数を呼び出します。


ファイルシステムタイプオブジェクトの登録

次の関数にファイルシステムタイプオブジェクトを指定して呼び出すことで登録できます。


#include <linux/fs.h>

int register_filesystem( struct file_system_type * fs );



引数にファイルシステムタイプオブジェクトを指定するだけとなります。また戻り値は成功時

0を返します。登録したいファイルシステムタイプが既に登録されている場合は-EBUSYを

返します。登録を行うと仮想ファイルシステムで管理している連結リストに連結されますので

指定したオブジェクトのメモリーを動的に確保している場合は、削除するまでメモリーを

解放しないでください。(通常ファイルシステムタイプオブジェクトのメモリーは静的にメモリーに

配置します)。

補足
カーネル内の関数は基本的に成功時に0を返します。0以外のときは

エラーと判断してください。



この関数をモジュール初期化関数で1度だけ呼び出すことで、ファイルシステムモジュール

をロードしたときに、登録処理が完了します。

		
/*
==================================================================================
    Function    :initMe2fs
    Input       :void
    Output      :void
    Return      :void

    Description :initialize Me2fs module
==================================================================================
*/
static int __init initMe2fs( void )
{
    DBGPRINT( "(Me2FS)Hello, world\n" );

    return( register_filesystem( &me2fs_fstype ) );
}



ファイルシステムタイプオブジェクトの削除

次の関数にファイルシステムタイプオブジェクトを指定して呼び出すことで削除できます。


#include <linux/fs.h>

int unregister_filesystem( struct file_system_type * fs );



登録済みのファイルシステムタイプオブジェクトが削除できた場合(成功時)0を返します。

指定したファイルシステムタイプオブジェクトが見つからなかったときは-EINVALをかえします。

関数呼び出しが成功した後は、ファイルシステムタイプオブジェクトのメモリーを再利用

したり、解放できます。


この関数をモジュール終了関数で呼び出すことで、ファイルシステムモジュール

をカーネルから削除したときに、ファイルシステムタイプの削除処理が完了します。

次のように実装します。


/*
==================================================================================
    Function    :exitMe2fs
    Input       :void
    Output      :void
    Return      :void

    Description :clean up me2fs module
==================================================================================
*/
static void __exit exitMe2fs( void )
{
    DBGPRINT( "(Me2FS)Good-bye!\n" );

    unregister_filesystem( &me2fs_fstype );
}



今回の実装はここまでです。まだ実装しているプログラムは短いので一旦全体を

見ていきましょう。

ここまでのプログラムまとめ

ここまでで、me2fs_main.cのみの変更となります。me2fs_main.cは次のように

なりました。


/********************************************************************************
    File            : me2fs_main.c
    Description     : my ext2 file sytem main routine

********************************************************************************/
#include <linux/module.h>
#include <linux/fs.h>

#include "me2fs.h"
#include "me2fs_util.h"


/*
=================================================================================

    Prototype Statement

=================================================================================
*/
static struct dentry *me2fs_mount( struct file_system_type *fs_type,
                                  int flags,
                                  const char *dev_name,
                                  void *data );

/*
=================================================================================

    DEFINES

=================================================================================
*/

#define ME2FS_VERSION_STRING        "me2fs_0.01"

#define ME2FS_PROC_MODULE_NAME      "me2fs"

#define ME2FS_MODULE_DESC           "My ex2 file system (me2fs)"
#define ME2FS_MODULE_AUTHOR         "yabusame2001 <mail@address>"

/*
==================================================================================

    Management

==================================================================================
*/
/*
---------------------------------------------------------------------------------
    File system type
---------------------------------------------------------------------------------
*/
static struct file_system_type me2fs_fstype =
{
    .name       = "me2fs",
    .mount      = me2fs_mount,
    .fs_flags   = FS_REQUIRES_DEV,
};

/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    < Open Functions >

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
/*
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
    Function    :void
    Input       :void
    Output      :void
    Return      :void

    Description :void
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
*/

/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    < Local Functions >

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
/*
==================================================================================
    Function    :me2fs_mount
    Input       :struct file_system_type *fs_type
                 < file system type >
                 int flags
                 < flags for mounting >
                 const char *dev_name
                 < device file name >
                 void *data
                 < options >
    Output      :void
    Return      :dentry *
                 < root dentry object >

    Description :mount a ext2 fs
==================================================================================
*/
static struct dentry *me2fs_mount( struct file_system_type *fs_type,
                                  int flags,
                                  const char *dev_name,
                                  void *data )
{
    DBGPRINT( "<ME2FS>: i am not yet implemented.\n" );
    return( NULL );
}

/*
==================================================================================
    Function    :initMe2fs
    Input       :void
    Output      :void
    Return      :void

    Description :initialize Me2fs module
==================================================================================
*/
static int __init initMe2fs( void )
{
    DBGPRINT( "(Me2FS)Hello, world\n" );

    return( register_filesystem( &me2fs_fstype ) );
}

/*
==================================================================================
    Function    :exitMe2fs
    Input       :void
    Output      :void
    Return      :void

    Description :clean up me2fs module
==================================================================================
*/
static void __exit exitMe2fs( void )
{
    DBGPRINT( "(Me2FS)Good-bye!\n" );

    unregister_filesystem( &me2fs_fstype );
}

/*
==================================================================================
    Function    :void
    Input       :void
    Output      :void
    Return      :void

    Description :void
==================================================================================
*/

/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    < Kernel Registrations >

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
/*
---------------------------------------------------------------------------------
    General Module Information
---------------------------------------------------------------------------------
*/
module_init( initMe2fs );
module_exit( exitMe2fs );

MODULE_AUTHOR( ME2FS_MODULE_AUTHOR );
MODULE_DESCRIPTION( ME2FS_MODULE_DESC );
MODULE_LICENSE( "GPL" );



それでは動作を確認してみましょう。

ファイルシステムイメージの作成と動作確認

makeでコンパイルしたme2fs.koの動作確認を行います。今回はマウント処理と

なりますので、マウントするデバイスが必要となります。ですが、本当にデバイスを使って

いるとデバッグのときに大変ですので、今回はループバックデバイスを使ってマウントを

行っていきます。ループバックによるマウントはファイルを指定したディレクトリにマウント

することができます。ファイルはファイルシステムイメージである必要があります。まず、

そのファイルシステムイメージを作ってみましょう。

Ext2ファイルシステムイメージの作成

最初にマウントポイントとなるディレクトリを作成します。

次のようにコマンドを実行します。前回のモジュールがロードされたままの場合、

rmmodしてモジュールを削除してから再度コンパイルしたモジュールをロードしてください。

今回はモジュールをコンパイルしたディレクトリの親ディレクトリ配下にあるmntディレクトリ

にマウントする例となります(結局失敗します)。

(この例では、プログラムを保存しているディレクトリがカレントディレクトリとしています。)

				
$ sudo rmmod me2fs
$ sudo insmod me2fs.ko
$ mkdir ../mnt



次に、Ext2ファイルシステムのイメージファイルを作成します。次のように実行します。

とりあえず今回は20MiBのファイルシステムを作ります。(MiBはMebiByteの略で

2の20乗バイトとなります)容量は大きな方がいいかと思いますが、好きなサイズで

試してください。(この例では、プログラムを保存しているディレクトリの親ディレクトリに

イメージファイルを作成します。)


$ cd ..			
$ dd if=/dev/zero of=./ext2.img bs=1K count=20000



ddコマンドはファイルをコピーするコマンドです。この例では入力として/dev/zeroを

出力としてカレントディレクトリのext2.imgに1KiBブロックサイズを20000個コピー

(合計で20MiB=1024×20000バイトとなります)しています。/dev/zeroは読み

出すと常に0の値が出力されます。これにより、20MiBのext2.imgができあがります。


次にExt2ファイルシステムを作ります。次のように実行します。


$ mkfs -t ext2 -b 1024 ext2.img



mkfsのtオプションに゛ext2”を指定しましょう。-bオプションは1ブロックのサイズを指定

しています。今回は1024バイトを指定しています。コマンドを実行するとext2.imgにExt2

ファイルシステムが作成されます。これで準備が完了しました。

マウントの動作確認

それでは、マウントの動作を確認してみましょう。今回はmountコマンドを使います。

mountシステムコールを使って自分でコマンドを実装しても楽しいです)。

プログラムを保存しているディレクトリに移動してmountコマンドを実行して、ループ

バックデバイスでext2.imgをマウントしてみます。


$ sudo mount -t me2fs -o loop ../ext2.img ../mnt



mountとinsmodコマンドMakefileに追記しておくと便利です。適宜自分のやり

やすいように変更してください。

[Makefile]

insmod:
	sudo insmod me2fs.ko

rmmod:
	sudo rmmod me2fs.ko

mount:
	sudo mount -t me2fs -o loop ../ext2.img ../mnt

umount:
	sudo umount ../mnt



me2fs.koをinsmodしてからmountした後は次のようにエラーとなりマウントが

失敗します。現時点でこのようにエラーとなりますので問題ありません。


sudo mount -t me2fs -o loop ../ext2.img ../mnt
make: *** [mount] Error 137



そしてdmesgを確認してみましょう。


$ dmesg

-省略-
[61251.690758] (Me2FS)Hello, world
[61259.490412] <ME2FS>: i am not yet implemented.
[61259.490419] BUG: unable to handle kernel NULL pointer dereference at 0000000000000068
[61259.490421] IP: [<ffffffff811d7908>] mount_fs+0x48/0x1b0
[61259.490425] PGD 566da067 PUD 6ebaf067 PMD 0 
[61259.490428] Oops: 0000 [#1] SMP 
[61259.490429] Modules linked in: me2fs(OE) isofs vboxsf(OE) joydev ppdev serio_raw lp parport_pc vboxguest(OE) parport e1000 ahci psmouse libahci

-省略-



me2fs_mount関数が呼び出されていることが確認できました。


カーネルモジュールが正しく動作しないとカーネルの動作もおかしくなることがあります。

そうなるとデバッグもできなくなってしまいますので、再起動してください。


$ sudo reboot



それでは次にme2fs_mount関数の中身を実装していきましょう。ファイルシステムの

スーパーブロックを読み込んでいきます。

PR 説明

ディベロッパー・エクスペリエンス Linux Ext2ファイルシステム
0から作るLinuxプログラム Linux Ext2ファイルシステムの完全説明版(Kindleのみ)となります。実装するステップ数は36ステップあります。少しずつステップを実装して、実際に動かして学習していきます。ファイルシステムの機能を呼び出すシステムコールの実装から、仮想ファイルシステムが呼び出すExt2ファイルシステムの実装を行っていきます。ファイルシステムの開発体験を通すことで、実際にカーネルが行っているファイルシステムの基礎的な動作を理解することができます。ぜひお試しください!

inserted by FC2 system