検索
ホームページシステムチュートリアルLinuxLinux仮想ファイルシステムの原理を詳しく説明する

Linux仮想ファイルシステムの原理を詳しく説明する

Feb 15, 2024 am 09:21 AM
linuxLinuxチュートリアルLinuxシステムLinuxコマンドシェルスクリプト埋め込みLinuxLinux を始めるLinux学習

Unix の世界には、「すべてはファイルである」という古典的な格言があります。これが意味するのは、Unix オペレーティング システムでは、すべてのオブジェクトをファイルとして扱うことができ、ファイルを操作するためのインターフェイスを使用してオブジェクトを操作できるということです。 Linux も Unix に似たオペレーティング システムとして、この目標の達成に努めています。

仮想ファイル システムの概要

「すべてはファイルである」という目標を達成するために、Linux カーネルは中間層 仮想ファイル システム (仮想ファイル システム) を提供します。 オブジェクト指向プログラミング言語 (C/Java など) を使用したことがある場合は、

Interface

の概念に精通しているはずです。仮想ファイル システムは、一連の標準インターフェイスを定義するオブジェクト指向プログラミングのインターフェイスに似ています。開発者は、この一連のインターフェイスを実装するだけで、ファイルを操作するためのインターフェイスを使用してオブジェクトを操作できます。以下に示すように:

上の図の青い部分は、仮想ファイル システムの場所です。 细说 Linux 虚拟文件系统原理

上の図からわかるように、仮想ファイル システムは上位層アプリケーションに統合インターフェイスを提供します。ファイル システムが仮想ファイル システムのインターフェイスを実装している場合、上位層アプリケーションは

open()

read()write() などの関数を使用できます。 などの関数で操作します。 今日は、仮想ファイルシステムの原理と実装について紹介します。

仮想ファイルシステムの原理

仮想ファイル システムの原理を説明する前に、まず Java の例を紹介します。この Java の例を通じて、仮想ファイル システムの原理をより簡単に理解できます。

#Java の例

Java を使用してプログラムを作成したことがある場合は、仮想ファイル システムを簡単に理解できます。 Java のインターフェイスを使用して、仮想ファイル システムの定義をシミュレートします。 リーリー

上記では、

VFSFile

という名前のインターフェイスが定義されており、

open()read() write() などのいくつかのメソッドが定義されています。 など次に、このインターフェイスを実装するために Ext3File という名前のオブジェクトを定義します。 リーリー これで、次のように VFSFile インターフェイスを使用して

Ext3File

オブジェクトを操作できるようになります: <pre class='brush:php;toolbar:false;'>public class Main() {   public static void main(String[] args) {     VFSFile file = new Ext3File();          int fd = file.open(&quot;/tmp/file.txt&quot;, 0);     ...   } } </pre> <p>从上面的例子可以看出,底层对象只需要实现 <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin: 0 2px;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;color: #10f5d6c">VFSFile 接口,就可以使用 VFSFile 接口相关的方法来操作对象,用户完全不需要了解底层对象的实现过程。

虚拟文件系统原理

上面的 Java 例子已经大概说明虚拟文件系统的原理,但由于 Linux 是使用 C 语言来编写的,而 C 语言并没有接口这个概念。所以,Linux 内核使用了一些技巧来模拟接口这个概念。

下面来介绍一下 Linux 内核是如何实现的。

1. file结构

为了模拟接口,Linux 内核定义了一个名为 file 的结构体,其定义如下:

struct file {
    ...
    const struct file_operations *f_op;
    ...
};

在 file 结构中,最为重要的一个字段就是 f_op,其类型为 file_operations 结构。而 file_operations 结构是由一组函数指针组成,其定义如下:

struct file_operations {
    ...
    loff_t (*llseek) (struct file *, loff_t, int);
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
    ...
    int (*open) (struct inode *, struct file *);
    ...
};

file_operations 结构的定义可以隐约看到接口的影子,所以可以猜想出,如果实现了 file_operations 结构中的方法,应该就能接入到虚拟文件系统中。

在 Linux 内核中,file 结构代表着一个被打开的文件。所以,只需要将 file 结构的 f_op 字段设置成不同文件系统实现好的方法集,那么就能够使用不同文件系统的功能。

这个过程在 __dentry_open() 函数中实现,如下所示:

static struct file *
__dentry_open(struct dentry *dentry, 
              struct vfsmount *mnt, 
              truct file *f, 
              int (*open)(struct inode *, struct file *), 
              const struct cred *cred)
{
    ...
    inode = dentry->d_inode;
    ...
    // 设置file结构的f_op字段为底层文件系统实现的方法集
    f->f_op = fops_get(inode->i_fop);
    ...
    return f;
}

设置好 file 结构的 f_op 字段后,虚拟文件系统就能够使用通用的接口来操作此文件了。调用过程如下:

细说 Linux 虚拟文件系统原理

2. file_operations结构

底层文件系统需要实现虚拟文件系统的接口,才能被虚拟文件系统使用。也就是说,底层文件系统需要实现 file_operations 结构中的方法集。

一般底层文件系统会在其内部定义好 file_operations 结构,并且填充好其方法集中的函数指针。如 minix文件系统 就定义了一个名为 minix_file_operationsfile_operations 结构。其定义如下:

// 文件:fs/minix/file.c

const struct file_operations minix_file_operations = {
    .llseek         = generic_file_llseek,
    .read           = do_sync_read,
    .aio_read       = generic_file_aio_read,
    .write          = do_sync_write,
    .aio_write      = generic_file_aio_write,
    .mmap           = generic_file_mmap,
    .fsync          = generic_file_fsync,
    .splice_read    = generic_file_splice_read,
};

也就是说,如果当前使用的是 minix 文件系统,当使用 read() 函数读取其文件的内容时,那么最终将会调用 do_sync_read() 函数来读取文件的内容。

3. dentry结构

到这里,虚拟文件系统的原理基本分析完毕,但还有两个非常重要的结构要介绍一下的:dentryinode

dentry 结构表示一个打开的目录项,当我们打开文件 /usr/local/lib/libc.so 文件时,内核会为文件路径中的每个目录创建一个 dentry 结构。如下图所示:

细说 Linux 虚拟文件系统原理

由于 /usr/local/lib/libc.so/tmp/libc.so 指向同一个文件,所以它们都使用同一个 inode 对象。

inode 结构保存了文件的所有属性值,如文件的创建时间、文件所属用户和文件的大小等。其定义如下所示:

struct inode {
    ...
    uid_t           i_uid;               // 文件所属用户
    gid_t           i_gid;               // 文件所属组
    ...
    struct timespec i_atime;             // 最后访问时间
    struct timespec i_mtime;             // 最后修改时间
    struct timespec i_ctime;             // 文件创建时间
    ...
    unsigned short  i_bytes;             // 文件大小
    ...
    const struct file_operations *i_fop; // 文件操作方法集(用于设置file结构)
    ...
};

我们注意到 inode 结构有个类型为 file_operations 结构的字段 i_fop,这个字段保存了文件的操作方法集。当用户调用 open() 系统调用打开文件时,内核将会使用 inode 结构的 i_fop 字段赋值给 file 结构的 f_op 字段。我们再来重温下赋值过程:

static struct file *
__dentry_open(struct dentry *dentry, 
              struct vfsmount *mnt, 
              truct file *f, 
              int (*open)(struct inode *, struct file *), 
              const struct cred *cred)
{
    ...
    // 文件对应的inode对象
    inode = dentry->d_inode;
    ...
    // 使用inode结构的i_fop字段赋值给file结构的f_op字段
    f->f_op = fops_get(inode->i_fop);
    ...
    return f;
}

总结

本文主要介绍了 虚拟文件系统 的基本原理,从分析中可以发现,虚拟文件系统使用了类似于面向对象编程语言中的接口概念。正是有了 虚拟文件系统,Linux 才能支持各种各样的文件系统。

以上がLinux仮想ファイルシステムの原理を詳しく説明するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は良许Linux教程网で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
5 LinuxのWord Docコンバーターから5ベスト無料のPDF5 LinuxのWord Docコンバーターから5ベスト無料のPDFMay 16, 2025 am 10:00 AM

ポータブルドキュメント形式(PDF)は、さまざまなプラットフォームとデバイス、互換性、コンパクトサイズにわたる一貫した標準により、広く使用されているファイル形式のままです。

コンピューターにLinux Mint 22メイトをインストールする方法コンピューターにLinux Mint 22メイトをインストールする方法May 16, 2025 am 09:44 AM

Linux Mint 22、コードネーム「Wilma」は、2024年7月25日にLinux Mintの大幅な更新として公式に発売されました。LinuxMint22は、Ubuntu 24.04に基づいてLTS(長期サービス)リリースであり、2029年4月までサポートを受けます。

セキュリティを強化するために独自のLinuxシステムをハッキングする方法セキュリティを強化するために独自のLinuxシステムをハッキングする方法May 16, 2025 am 09:39 AM

パスワードは、ルートパスワードがシステムを完全に制御するLinuxを含むさまざまなシステムの主要なセキュリティ測定として機能します。これらは、BIOS、ログイン、ディスク、アプリケーションなどを確保するために不可欠です。Linuxは広く見なされています

6データ暗号化を備えた6ベストLinuxソフトウェアとアプリ6データ暗号化を備えた6ベストLinuxソフトウェアとアプリMay 16, 2025 am 09:33 AM

データ暗号化は、最新のサイバーセキュリティの重要なコンポーネントであり、データのエンコードを許可されていないユーザーにとって読み取れないようにすることができます。オンラインセキュリティを強化するには、この重要な機能をスタンとして組み込んだソフトウェアの選択を検討してください

コンピューターにLinuxミント22 XFCEをインストールする方法コンピューターにLinuxミント22 XFCEをインストールする方法May 16, 2025 am 09:28 AM

コードネーム「ウィルマ」を備えたLinux Mint 22が正式に発売され、ダウンロードの準備が整いました。 Ubuntu 24.04に建てられ、2029年までサポートを提供し、Cinnamon、Mate、およびXFCEの3つのフレーバーがあります。

2024年のLinux用の16ベストオープンソースクラウドストレージソフトウェア2024年のLinux用の16ベストオープンソースクラウドストレージソフトウェアMay 16, 2025 am 09:15 AM

「クラウド」という用語は、広大さと広大さの感覚を呼び起こします。テクノロジーセクターでは、「クラウド」は、エンドユーザーにサービスを提供する仮想プラットフォームを示し、データストレージ、アプリケーションホスティング、およびVirtualizを網羅しています

コンピューターにLinux Mint 22シナモンをインストールする方法コンピューターにLinux Mint 22シナモンをインストールする方法May 16, 2025 am 09:10 AM

Linux Mintは、よく知られているUbuntu Linuxディストリビューションに基づいて構築された、現代的でユーザーフレンドリーで、コミュニティ主導のGNU/Linuxデスクトップディストリビューションです。これは、WindowsまたはMacOSからLinux Env​​ironment.linuxに移行するユーザーに最適です。

LinuxでPDFフォームを作成するための4つの最適なツールLinuxでPDFフォームを作成するための4つの最適なツールMay 16, 2025 am 09:08 AM

はじめに:この記事では、LinuxでPDFファイル(インタラクティブテーブルとも呼ばれる)を作成するのに最適なアプリケーションがあります。 LinuxでPDFファイルを作成および編集するための強力なツールが必要な場合は、選択できる多くのアプリケーションがあります。これらのアプリケーションは、ページのマージ、ページのトリミング、コメントの追加、さらには高度な機能を提供するなどの基本的な編集操作を実行できます。ただし、すべてのPDFエディターがPDFフォームを作成できるわけではありません。つまり、他のユーザーが入力できるインタラクティブフィールドを備えた編集可能なPDFファイルです。このようなドキュメントは、アンケート、入場フォーム、販売契約などを作成するために必要な状況で役立ちます。次のリストには、さまざまなLinuxディストリビューションで実行できるソリューションが含まれています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境