suchen
HeimSystem-TutorialLINUXBeschreiben Sie die Prinzipien des virtuellen Linux-Dateisystems im Detail

Beschreiben Sie die Prinzipien des virtuellen Linux-Dateisystems im Detail

Feb 15, 2024 am 09:21 AM
linuxlinux教程linux系统linux命令shell脚本eingebettetes LinuxErste Schritte mit LinuxLinux-Lernen

In der Unix-Welt gibt es ein klassisches Sprichwort: Alles ist eine Datei. Dies bedeutet, dass im Unix-Betriebssystem alle Objekte als Dateien behandelt und über die Schnittstelle zum Bearbeiten von Dateien manipuliert werden können. Als Unix-ähnliches Betriebssystem strebt auch Linux dieses Ziel an.

Einführung in das virtuelle Dateisystem

Um 一切皆文件 这个目标,Linux 内核提供了一个中间层:虚拟文件系统(Virtual File System) zu erreichen.

Wenn Sie jemals objektorientierte Programmiersprachen (wie C++/Java usw.) verwendet haben, sollten Sie mit diesem Konzept vertraut sein 接口. Das virtuelle Dateisystem ähnelt der Schnittstelle in der objektorientierten Programmierung, die eine Reihe von Standardschnittstellen definiert. Entwickler müssen nur diesen Satz von Schnittstellen implementieren und können dann die Schnittstelle zum Betreiben von Dateien zum Betreiben von Objekten verwenden. Wie im Bild unten gezeigt:

细说 Linux 虚拟文件系统原理

Der blaue Teil im Bild oben ist der Speicherort des virtuellen Dateisystems.

Wie aus der obigen Abbildung ersichtlich ist, bietet das virtuelle Dateisystem eine einheitliche Schnittstelle für Anwendungen der oberen Ebene. Wenn ein Dateisystem die Schnittstelle eines virtuellen Dateisystems implementiert, können Anwendungen der oberen Schicht Funktionen wie open()read()write() verwenden, um darauf zu arbeiten.

Heute stellen wir das Prinzip und die Implementierung des virtuellen Dateisystems vor.

Prinzip des virtuellen Dateisystems

Bevor wir das Prinzip des virtuellen Dateisystems erklären, stellen wir zunächst ein Java-Beispiel vor. Anhand dieses Java-Beispiels können wir die Prinzipien virtueller Dateisysteme leichter verstehen.

Ein Java-Beispiel

Wenn Sie Java zum Schreiben von Programmen verwendet haben, wird es Ihnen leicht fallen, das virtuelle Dateisystem zu verstehen. Wir verwenden die Java-Schnittstelle, um die Definition eines virtuellen Dateisystems zu simulieren:

public interface VFSFile {
  int open(String file, int mode);
  int read(int fd, byte[] buffer, int size);
  int write(int fd, byte[] buffer, int size);
  ...
}

Das Obige definiert eine Schriftart mit dem Namen VFSFiles Schnittstelle, die einige Methoden wie VFSFile 的接口,接口中定义了一些方法,如 open()read()write() 等。现在我们来定义一个名为 Ext3File usw. definiert. Definieren wir nun eine Schriftart mit dem Namen: #10f5d6c">Ext3File-Objekt, um diese Schnittstelle zu implementieren:

public class Ext3File implements VFSFile {
  @Override
  public int open(String file, int mode) {
    ...
  }
  
  @Override
  public int read(int fd, byte[] buffer, int size) {
    ...
  }
  
  @Override
  public int write(int fd, byte[] buffer, int size) {
    ...
  }
  
  ...
}

Jetzt können wir das VFSFile 接口来操作 Ext3File-Objekt wie folgt verwenden:

public class Main() {
  public static void main(String[] args) {
    VFSFile file = new Ext3File();
    
    int fd = file.open("/tmp/file.txt", 0);
    ...
  }
}

从上面的例子可以看出,底层对象只需要实现 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 才能支持各种各样的文件系统。

Das obige ist der detaillierte Inhalt vonBeschreiben Sie die Prinzipien des virtuellen Linux-Dateisystems im Detail. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Dieser Artikel ist reproduziert unter:良许Linux教程网. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Was sind Linux -Operationen?Was sind Linux -Operationen?Apr 13, 2025 am 12:20 AM

Der Kern des Linux -Betriebssystems ist die Befehlszeilenschnittstelle, die verschiedene Operationen über die Befehlszeile ausführen kann. 1. Datei- und Verzeichnisoperationen verwenden LS, CD, MKDIR, RM und andere Befehle, um Dateien und Verzeichnisse zu verwalten. 2. Benutzer- und Berechtigungsverwaltung sorgt für die Systemsicherheit und die Ressourcenzuweisung über UserAdd, PASSWD, CHMOD und andere Befehle. 3. Process Management verwendet PS, Kill und andere Befehle, um Systemprozesse zu überwachen und zu steuern. 4. Netzwerkoperationen umfassen Ping, IFConfig, SSH und andere Befehle zum Konfigurieren und Verwalten von Netzwerkverbindungen. 5. Systemüberwachung und Wartung Verwenden Sie Befehle wie Top, DF, DU, um den Betriebsstatus und die Ressourcennutzung des Systems zu verstehen.

Steigern Sie die Produktivität mit benutzerdefinierten Befehlskürzungen mithilfe von Linux -AliaseSteigern Sie die Produktivität mit benutzerdefinierten Befehlskürzungen mithilfe von Linux -AliaseApr 12, 2025 am 11:43 AM

Einführung Linux ist ein leistungsstarkes Betriebssystem, das aufgrund seiner Flexibilität und Effizienz von Entwicklern, Systemadministratoren und Stromnutzern bevorzugt wird. Die Verwendung langer und komplexer Befehle kann jedoch mühsam und äh sein

Wofür ist Linux eigentlich gut?Wofür ist Linux eigentlich gut?Apr 12, 2025 am 12:20 AM

Linux eignet sich für Server, Entwicklungsumgebungen und eingebettete Systeme. 1. Als Serverbetriebssystem ist Linux stabil und effizient und wird häufig zur Bereitstellung von Anwendungen mit hoher Konreise verwendet. 2. Als Entwicklungsumgebung bietet Linux effiziente Befehlszeilen -Tools und Paketmanagementsysteme, um die Entwicklungseffizienz zu verbessern. 3. In eingebetteten Systemen ist Linux leicht und anpassbar und für Umgebungen mit begrenzten Ressourcen geeignet.

Wesentliche Tools und Frameworks für das Beherrschen ethischer Hacking unter LinuxWesentliche Tools und Frameworks für das Beherrschen ethischer Hacking unter LinuxApr 11, 2025 am 09:11 AM

Einführung: Sicherung der digitalen Grenze mit Linux-basierten ethischen Hacking In unserer zunehmend miteinander verbundenen Welt ist die Cybersicherheit von größter Bedeutung. Ethische Hacking- und Penetrationstests sind von entscheidender Bedeutung, um Schwachstellen proaktiv zu identifizieren und zu mildern

Wie lerne ich Linux -Grundlagen?Wie lerne ich Linux -Grundlagen?Apr 10, 2025 am 09:32 AM

Zu den Methoden für das grundlegende Linux -Lernen von Grund zu Grund gehören: 1. Verstehen Sie das Dateisystem und die Befehlszeilenschnittstelle, 2. Master Basic -Befehle wie LS, CD, MKDIR, 3. Lernen Sie Dateivorgänge wie Erstellen und Bearbeiten von Dateien, 4. Erklären Sie fortgeschrittene Verwendung wie Pipelines und GREP -Befehle, 5.

Was nutzt Linux am meisten?Was nutzt Linux am meisten?Apr 09, 2025 am 12:02 AM

Linux wird häufig in Servern, eingebetteten Systemen und Desktopumgebungen verwendet. 1) Im Serverfeld ist Linux aufgrund seiner Stabilität und Sicherheit eine ideale Wahl für das Hosting von Websites, Datenbanken und Anwendungen geworden. 2) In eingebetteten Systemen ist Linux für seine hohe Anpassung und Effizienz beliebt. 3) In der Desktop -Umgebung bietet Linux eine Vielzahl von Desktop -Umgebungen, um den Anforderungen verschiedener Benutzer gerecht zu werden.

Was sind die Nachteile von Linux?Was sind die Nachteile von Linux?Apr 08, 2025 am 12:01 AM

Die Nachteile von Linux umfassen Benutzererfahrung, Softwarekompatibilität, Hardwareunterstützung und Lernkurve. 1. Die Benutzererfahrung ist nicht so freundlich wie Windows oder MacOS und basiert auf der Befehlszeilenschnittstelle. 2. Die Softwarekompatibilität ist nicht so gut wie andere Systeme und es fehlen native Versionen vieler kommerzieller Software. 3. Die Hardware -Unterstützung ist nicht so umfassend wie Windows, und die Treiber können manuell zusammengestellt werden. 4. Die Lernkurve ist steil, und die Mastering -Befehlszeilenvorgänge erfordert Zeit und Geduld.

Ist Linux schwer zu lernen?Ist Linux schwer zu lernen?Apr 07, 2025 am 12:01 AM

Linuxisnothardtolearn, ButthedifficultyDependyourbackgroundGoAs.ForthoseWithexperience, insbesondere Command-Linefamiliarität, Linuxisaneasytransition

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool