Heim System-Tutorial LINUX 24 Stunden, um mehr über den Linux-Kernel und Probleme im Zusammenhang mit der Implementierung des Linux-Dateisystems zu erfahren

24 Stunden, um mehr über den Linux-Kernel und Probleme im Zusammenhang mit der Implementierung des Linux-Dateisystems zu erfahren

Feb 05, 2024 pm 04:00 PM
linux linux教程 linux系统 linux命令 shell脚本 eingebettetes Linux gute Lizenz Erste Schritte mit Linux Linux-Lernen

Der Einsatz von Linux und die Programmierung von User-Space-Programmen stehen in engem Zusammenhang mit dem Dateisystem. Möglicherweise kennen Sie das Konzept des Dateisystems bereits, daher werde ich es nicht zu ausführlich erklären. Denn solange Sie diese Konzepte verstehen, können diejenigen, die mehr wissen möchten, jederzeit über Suchmaschinen wie Baidu mehr Informationen erhalten. Jetzt werde ich mich auf das virtuelle Dateisystem von Linux konzentrieren.

Das virtuelle Dateisystem ist eine der wichtigen Funktionen von Linux, das viele verschiedene Dateisysteme unterstützt. Die Struktur des Dateisystems ist in der folgenden Abbildung dargestellt: [Bild siehe Originaltext] 24 Stunden, um mehr über den Linux-Kernel und Probleme im Zusammenhang mit der Implementierung des Linux-Dateisystems zu erfahren

Das VFS (Virtual File System) im obigen Bild basiert auf Datenstrukturen, um seine allgemeine Darstellung eines Dateisystems zu speichern. Die Datenstrukturen sind wie folgt aufgeführt:

  • Super-Blockstruktur: speichert Informationen zum installierten Dateisystem;

  • Indexknotenstruktur: speichert Informationen über Dateien

  • Dateistruktur: speichert Informationen über vom Prozess geöffnete Dateien;

  • Verzeichniseintragsstruktur: Speichert Informationen über den Pfadnamen und die Datei, auf die der Pfadname verweist.
  • Der Linux-Kernel verwendet globale Variablen, um die Zeiger auf die zuvor erwähnten Strukturen zu speichern. Alle Strukturen werden in doppelt verknüpften Listen gespeichert. Der Kernel speichert den Zeiger auf den Kopf der verknüpften Liste und verwendet ihn als Zugriffspunkt. Diese Strukturen verwenden das Feld list_head, um auf das vorherige Element in der verknüpften Liste zu verweisen. Die folgende Tabelle enthält die vom Kernel gespeicherten globalen Variablen und die Typen der verknüpften Listen, auf die diese Variablen verweisen (globale Variablen im Zusammenhang mit VFS). )

Globale Variablensuper_blocksDateisystemedentry_unusedvfsmntlistinode_in_useinode_unused

Super_block-, file_system_type-, dentry- und vfsmoubt-Strukturen werden alle in ihren eigenen verknüpften Listen gespeichert. Die Indexknoten können sich auf den globalen inode_in_use oder inode_unused oder auf ihren entsprechenden superschnellen lokalen verknüpften Listen befinden.

Zusätzlich zur Haupt-VFS-Struktur gibt es mehrere andere Strukturen, die mit VFS, fs_struct und files_struct, namespace, fd_set interagieren. Die folgende Abbildung erläutert, wie Prozessdeskriptoren mit dateibezogenen Strukturen verknüpft sind.

24 Stunden, um mehr über den Linux-Kernel und Probleme im Zusammenhang mit der Implementierung des Linux-Dateisystems zu erfahren

Lassen Sie uns zunächst die fs_struct-Struktur vorstellen. Der folgende Code kann in include/Linux/fs_struct.h gefunden werden Rat

struct fs_struct{
    atomic_t count;  //保存引用特定fs_struct的进程描述符数目
    rwlock_t lock;
    int umask;  //保存一个掩码,表示将要在打开文件上设置的许可权
    struct dentry * root, *pwd ,*altroot;  //都是指针,,,,
    struct vfsmount * rootmnt, *pwdmnt,  *altrootmnt;  //指针,
};
Nach dem Login kopieren

files_struct enthält Informationen über geöffnete Dateien und ihre Deskriptoren und verwendet diese Sammlungen, um ihre Deskriptoren zu gruppieren. Der folgende Code kann in include/linux/file.h

angezeigt werden
struct files_struct{
    atomic_t count;  //与fs_struct类似
    spinlock_t file_lock;
    int max_fds;  //表示进程能够打开的文件的最大数
    int max_fdset;  //表示描述符的最大数
    int next_fd;  //保存下一个将要分配的文件描述符的值
    struct file ** fd;  //fd数组指向打开的文件对象的数组
    fd_set *close_on_exec; //是指向文件描述符集的一个指针,这些文件描述符在exec()时候就被标志位将要关闭,如果在exec()时候被标志位“打开”的文件描述符数超过close_on_exec_init域的大小,则改变close_on_exec域的值;
    fd_set *open_fds; //是一个指针,指向被标记为“打开”的文件描述符集合,
    fd_set close_on_exec_init;  //保存一个位域,表示打开文件对应的文件描述符
    fd_set open_fds_init;    //这些都是fd_set类型的域,其实都不懂,,,
    struct file *fd_array[NR_OPEN_DEFAULT];//fd_array数组指针指向前32个打开的文件描述法
};
Nach dem Login kopieren

Initialisieren Sie die fs_struct-Struktur mit dem INIT_FILES-Makro:

#define INIT_FILES \
{
    .count = ATOMIC_INIT(1),
    .file_lock = SPIN_LOCK_UNLOCKED,
    .max_fds = NR_OPEN_DEFAULT,
    .max_fdset = __FD_SETSIZE,
    .next_fd = 0,
    .fd = &init_files.fd_array[0];
    .close_on_exec = &init_files.close_on_exec_init,
    .open_fds = &init_files.open_fds_init,
    .close_on_exec_init = {{0, }},
    .open_fda_init = {{0, }},
    .fd_array = {NULL, }
}
Nach dem Login kopieren

Die globale Definition von NR_OPEN_DEFAULT ist auf BITS_PER_LONG eingestellt, was 32 in 32-Bit-Systemen und 64 in 64-Bit-Systemen ist

Lassen Sie uns nun die Seitenpufferung vorstellen. Sehen wir uns nun an, wie sie funktioniert und implementiert wird. Unter Linux ist der Speicher in eine verknüpfte Liste aktiver Seiten und eine inaktive verknüpfte Liste unterteilt. Wenn die Seite inaktiv ist, wird sie auf die Festplatte zurückgeschrieben

24 Stunden, um mehr über den Linux-Kernel und Probleme im Zusammenhang mit der Implementierung des Linux-Dateisystems zu erfahrenimage-20240202221039708

Der Kern der Seitenpufferung ist das Objekt „address_space“, dessen Code in include/linux/fs.h eingesehen werden kann (ich verstehe diesen Code nicht sehr gut, bitte geben Sie mir einen Rat):

struct address_space{    
    struct inode *host;
    struct radix_tree_root page_tree;
    spinlock_t tree_lock;
    unsigned long nrpages;
    pgoff_t writeback;
    struct address_space_operations *a_ops;
    struct prio_tree_root i_map;
    unsigned inr i_map_lock;
    struct list_head i_mmap_nonlinear;
    spinlock_t i_mmap_lock;
    atomic_t truncate_count;
    unsigned long flags;
    struct backing_dev_info *backing_dev_info;
    spinlock_t private_lock;
    struct list_head private_list;
    struct address_space *assoc_mapping;
};

Nach dem Login kopieren

Der Linux-Kernel stellt außerdem jeden Sektor auf dem Blockgerät als buffer_head-Struktur dar. Der von der buffer_head-Struktur verwendete physische Bereich ist der logische Block b_blocknr des Geräts b_dev. Der referenzierte physische Speicher ist b_data-Speicherdaten, beginnend mit der Blockgröße von b_size Bytes. Dieser Speicherblock befindet sich auf der physischen Seite b_page und seine Struktur ist wie folgt:

24 Stunden, um mehr über den Linux-Kernel und Probleme im Zusammenhang mit der Implementierung des Linux-Dateisystems zu erfahrenLassen Sie uns abschließend über den VFS-Systemaufruf und die Dateisystemebene sprechen und deren Ausführung bis zur Kernelebene verfolgen. Zunächst müssen wir vier Funktionen verstehen: open(), close(), read() und write().

open()-Funktion:

open-Funktion wird zum Öffnen und Erstellen von Dateien verwendet. Im Folgenden finden Sie eine kurze Beschreibung der Öffnungsfunktion

#include 
int open(const char *pathname, int oflag, ... );
Nach dem Login kopieren

Rückgabewert: Bei Erfolg den Dateideskriptor zurückgeben, andernfalls -1 zurückgeben

Für die Öffnungsfunktion wird der dritte Parameter (...) nur beim Erstellen einer neuen Datei verwendet und dient zur Angabe der Zugriffsberechtigungsbits der Datei. Pfadname ist der Pfadname der zu öffnenden/erstellenden Datei (z. B. C:/cpp/a.cpp); oflag wird verwendet, um den Öffnungs-/Erstellungsmodus der Datei anzugeben (definiert). in fcntl.h) durch logisches ODER.

  • O_RDONLY schreibgeschützter Modus

  • O_WRONLY Nur-Schreibmodus

  • O_RDWR Lese- und Schreibmodus

  • Beim Öffnen/Erstellen einer Datei müssen Sie mindestens eine der oben genannten drei Konstanten verwenden. Die folgenden Konstanten sind optional:

  • O_APPEND Jeder Schreibvorgang wird an das Ende der Datei geschrieben

  • O_CREAT Wenn die angegebene Datei nicht existiert, erstellen Sie diese Datei

  • O_EXCL Wenn die zu erstellende Datei bereits vorhanden ist, geben Sie -1 zurück und ändern Sie den Wert von errno

  • O_TRUNC Wenn die Datei vorhanden ist und im Nur-Schreib-/Lese-/Schreibmodus geöffnet wird, löschen Sie den gesamten Inhalt der Datei

  • O_NOCTTY Wenn der Pfadname auf ein Endgerät verweist, verwenden Sie dieses Gerät nicht als steuerndes Endgerät.

  • O_NONBLOCK Wenn der Pfadname auf FIFO/Blockdatei/Zeichendatei verweist, stellen Sie das Öffnen der Datei und die anschließende E/A auf den nicht blockierenden Modus (nicht blockierenden Modus) ein

  • Die folgenden drei Konstanten werden ebenfalls ausgewählt, sie dienen der Synchronisierung von Ein- und Ausgabe

  • O_DSYNC wartet vor dem Schreiben auf den Abschluss der physischen E/A. Warten Sie nicht auf Dateiattributaktualisierungen, ohne das Lesen neu geschriebener Daten zu beeinträchtigen.

  • O_RSYNC read wartet, bis alle Schreibvorgänge in denselben Bereich abgeschlossen sind, bevor es fortfährt

  • O_SYNC wartet vor dem Schreiben auf das Ende der physischen E/A, einschließlich E/A zum Aktualisieren von Dateiattributen

    Der von open zurückgegebene Dateideskriptor muss der kleinste nicht verwendete Deskriptor sein.

    Wenn NAME_MAX (maximale Länge des Dateinamens, ausgenommen '

    POSIX.1 引入常量 _POSIX_NO_TRUNC 用于决定是否截断长文件名/长路径名。如果_POSIX_NO_TRUNC 设定为禁止截断,并且路径名长度超过 PATH_MAX(包括 ‘\0’),或者组成路径名的任意文件名长度超过 NAME_MAX,则返回错误信息,并且把 errno 置为 ENAMETOOLONG。

close()函数

进程使用完文件后,发出close()系统调用:

sysopsis

#include 
int close(int fd);
Nach dem Login kopieren

参数:fd文件描述符

函数返回值:0成功,-1出错

参数fd是要关闭的文件描述符。需要说明的是:当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。

read()函数

当用户级别程序调用read()函数时,Linux把它转换成系统调sys_read():

功能描述:从文件读取数据。
所需头文件: #include

函数原型:ssize_t read(int fd, void *buf, size_t count);

参数

  • fd: 将要读取数据的文件描述词。

  • buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。

  • count:表示调用一次read操作,应该读多少数量的字符。

  • 返回值:返回所读取的字节数;0(读到EOF);-1(出错)。

  • 以下几种情况会导致读取到的字节数小于 count :

  • 读取普通文件时,读到文件末尾还不够 count 字节。例:如果文件只有 30 字节,而我们想读取 100,字节,那么实际读到的只有 30 字节, 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0

  • 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。

  • 从网络读取时,网络缓存可能导致读取的字节数小于 count字节。

  • 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 count 。

  • 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。

  • 在读取了部分数据时被信号中断,读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。

    例程如下(程序是网上找的例子,贴下来以以供大家理解一下)::

#include 
#include 
#include 
#include 
#include 
#include 
int main(void)
{
    void* buf ;
    int handle;
    int bytes ;
    buf=malloc(10);
    /*
    LooksforafileinthecurrentdirectorynamedTEST.$$$andattempts
    toread10bytesfromit.Tousethisexampleyoushouldcreatethe
    fileTEST.$$$
    */
    handle=open("TEST.$$$",O_RDONLY|O_BINARY,S_IWRITE|S_IREAD);
    if(handle==-1)
    {
        printf("ErrorOpeningFile\n");
        exit(1);
    }
    bytes=read(handle,buf,10);
    if(bytes==-1)
    {
        printf("ReadFailed.\n");
        exit(1);
    }
    else 
    {
        printf("Read:%dbytesread.\n",bytes);
    }
    return0 ;
}
Nach dem Login kopieren

write()函数

功能描述:向文件写入数据。
所需头文件: #include

函数原型:ssize_t write(int fd, void *buf, size_t count);

返回值:写入文件的字节数(成功);-1(出错)

功能:write 函数向 filedes 中写入 count 字节数据,数据来源为 buf 。返回值一般总是等于 count,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。

例程如下(程序是网上找的例子,贴下来以以供大家理解一下):

#include 
#include 
#include 
#include 
#include 
#include 
int main(void)
{
int *handle; char string[40];
int length, res;/* Create a file named "TEST.$$$" in the current directory and write a string to it. If "TEST.$$$" already exists, it will be overwritten. */
if ((handle = open("TEST.$$$", O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE)) == -1)
{
printf("Error opening file.\n");
exit(1);
}
strcpy(string, "Hello, world!\n");
length = strlen(string);
if ((res = write(handle, string, length)) != length)
{
printf("Error writing to the file.\n");
exit(1);
}
printf("Wrote %d bytes to the file.\n", res);
close(handle); return 0; }
Nach dem Login kopieren

小结

今天看的代码不多,差不多都是网上找的代码,有些解释也是查阅资料写上去的,有些还是不懂,希望各路大神指教,这里我总结了有关Linux文件系统实现的问题,但是具体的细节方面并没有提及到,大家看了之后应该只能有一个大致的最Linux文件系统的了解,有读者问我看的是哪些书,这里我说明一下,看了Linux内核编程,还有深入理解Linux内核以及网上各种资料或者其他大牛写的好的博客。这里我是总结了一下,并且把自己不懂的还有觉得重要的说了一下,希望各位大神给些建议,thanks~

Strukturtyp
super_block
file_systems_type
Zahnmedizin
vfsmount
inode
inode

Das obige ist der detaillierte Inhalt von24 Stunden, um mehr über den Linux-Kernel und Probleme im Zusammenhang mit der Implementierung des Linux-Dateisystems zu erfahren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

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)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Deepseek Web Version Eingang Deepseek Offizielle Website Eingang Deepseek Web Version Eingang Deepseek Offizielle Website Eingang Feb 19, 2025 pm 04:54 PM

Deepseek ist ein leistungsstarkes Intelligent -Such- und Analyse -Tool, das zwei Zugriffsmethoden bietet: Webversion und offizielle Website. Die Webversion ist bequem und effizient und kann ohne Installation verwendet werden. Unabhängig davon, ob Einzelpersonen oder Unternehmensnutzer, können sie massive Daten über Deepseek problemlos erhalten und analysieren, um die Arbeitseffizienz zu verbessern, die Entscheidungsfindung zu unterstützen und Innovationen zu fördern.

So installieren Sie Deepseek So installieren Sie Deepseek Feb 19, 2025 pm 05:48 PM

Es gibt viele Möglichkeiten, Deepseek zu installieren, einschließlich: kompilieren Sie von Quelle (für erfahrene Entwickler) mit vorberechtigten Paketen (für Windows -Benutzer) mit Docker -Containern (für bequem am besten, um die Kompatibilität nicht zu sorgen), unabhängig von der Methode, die Sie auswählen, bitte lesen Die offiziellen Dokumente vorbereiten sie sorgfältig und bereiten sie voll und ganz vor, um unnötige Schwierigkeiten zu vermeiden.

Bitget Offizielle Website -Installation (2025 Anfängerhandbuch) Bitget Offizielle Website -Installation (2025 Anfängerhandbuch) Feb 21, 2025 pm 08:42 PM

Bitget ist eine Kryptowährungsbörse, die eine Vielzahl von Handelsdienstleistungen anbietet, darunter Spot -Handel, Vertragshandel und Derivate. Der 2018 gegründete Austausch hat seinen Hauptsitz in Singapur und verpflichtet sich, den Benutzern eine sichere und zuverlässige Handelsplattform zu bieten. Bitget bietet eine Vielzahl von Handelspaaren, einschließlich BTC/USDT, ETH/USDT und XRP/USDT. Darüber hinaus hat der Austausch einen Ruf für Sicherheit und Liquidität und bietet eine Vielzahl von Funktionen wie Premium -Bestellarten, gehebelter Handel und Kundenunterstützung rund um die Uhr.

Ouyi OKX Installationspaket ist direkt enthalten Ouyi OKX Installationspaket ist direkt enthalten Feb 21, 2025 pm 08:00 PM

Ouyi Okx, die weltweit führende digitale Asset Exchange, hat jetzt ein offizielles Installationspaket gestartet, um ein sicheres und bequemes Handelserlebnis zu bieten. Auf das OKX -Installationspaket von Ouyi muss nicht über einen Browser zugegriffen werden. Der Installationsprozess ist einfach und einfach zu verstehen.

Holen Sie sich das Installationspaket Gate.io kostenlos Holen Sie sich das Installationspaket Gate.io kostenlos Feb 21, 2025 pm 08:21 PM

Gate.io ist ein beliebter Kryptowährungsaustausch, den Benutzer verwenden können, indem sie sein Installationspaket herunterladen und auf ihren Geräten installieren. Die Schritte zum Abholen des Installationspakets sind wie folgt: Besuchen Sie die offizielle Website von Gate.io, klicken Sie auf "Download", wählen Sie das entsprechende Betriebssystem (Windows, Mac oder Linux) und laden Sie das Installationspaket auf Ihren Computer herunter. Es wird empfohlen, die Antiviren -Software oder -Firewall während der Installation vorübergehend zu deaktivieren, um eine reibungslose Installation zu gewährleisten. Nach Abschluss muss der Benutzer ein Gate.io -Konto erstellen, um es zu verwenden.

Ouyi Exchange Download Official Portal Ouyi Exchange Download Official Portal Feb 21, 2025 pm 07:51 PM

Ouyi, auch bekannt als OKX, ist eine weltweit führende Kryptowährungsplattform. Der Artikel enthält ein Download -Portal für das offizielle Installationspaket von Ouyi, mit dem Benutzer den Ouyi -Client auf verschiedenen Geräten installiert werden können. Dieses Installationspaket unterstützt Windows, Mac, Android und iOS -Systeme. Nach Abschluss der Installation können sich Benutzer registrieren oder sich beim Ouyi -Konto anmelden, Kryptowährungen mit dem Handel mit den von der Plattform erbrachten Diensten anmelden.

Gate.io Official Website Registration Installation Paket Link Gate.io Official Website Registration Installation Paket Link Feb 21, 2025 pm 08:15 PM

Gate.io ist eine hochgelobte Kryptowährungshandelsplattform, die für ihre umfangreiche Token-Auswahl, niedrige Transaktionsgebühren und eine benutzerfreundliche Schnittstelle bekannt ist. Mit seinen fortschrittlichen Sicherheitsfunktionen und dem hervorragenden Kundenservice bietet Gate.io Händlern ein zuverlässiges und bequemes Handelsumfeld für Kryptowährung. Wenn Sie sich mit gate.io anschließen möchten, klicken Sie bitte auf den Link zum Herunterladen des offiziellen Registrierungsinstallationspakets, um Ihre Kryptowährungshandelsreise zu starten.

Wie installiere ich PhpMyAdmin mit Nginx auf Ubuntu? Wie installiere ich PhpMyAdmin mit Nginx auf Ubuntu? Feb 07, 2025 am 11:12 AM

Dieses Tutorial führt Sie durch die Installation und Konfiguration von Nginx und PhpMyAdmin auf einem Ubuntu -System, möglicherweise neben einem vorhandenen Apache -Server. Wir werden das Einrichten von NGINX abdecken, potenzielle Portkonflikte mit Apache auflösen, MariADB (installieren

See all articles