This shows you the differences between two versions of the page.
so2:laboratoare:lab08 [2018/04/18 00:18] anda.nicolae [Buffer cache-ul] |
so2:laboratoare:lab08 [2018/04/18 00:39] (current) anda.nicolae [Resurse utile] |
||
---|---|---|---|
Line 54: | Line 54: | ||
Localizare: | Localizare: | ||
* În cazul sistemelor de fișiere pentru discuri, superblocul are un corespondent în primul bloc al acestora (Filesystem Control Block). | * În cazul sistemelor de fișiere pentru discuri, superblocul are un corespondent în primul bloc al acestora (Filesystem Control Block). | ||
- | * În **VFS**, toate superbloc-urile sistemelor de fișiere sunt reținute într-o listă de structuri [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1338 | struct super_block]] și metodele în [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1786 | struct super_operations ]] | + | * În **VFS**, toate superbloc-urile sistemelor de fișiere sunt reținute într-o listă de structuri [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1337 | struct super_block]] și metodele în [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1803 | struct super_operations ]] |
==== inode ==== | ==== inode ==== | ||
Line 67: | Line 67: | ||
<note> | <note> | ||
- | În general, inode-ul nu deține numele fișierului. Numele este reținut de entitatea [[http://lxr.free-electrons.com/source/include/linux/dcache.h?v=4.9#L83 | dentry]]. Astfel, un inode poate avea mai multe nume (hardlink-uri). | + | În general, inode-ul nu deține numele fișierului. Numele este reținut de entitatea [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/dcache.h#L90 | dentry]]. Astfel, un inode poate avea mai multe nume (hardlink-uri). |
</note> | </note> | ||
Localizare: | Localizare: | ||
- | * La fel ca și superblocul, inode-ul are un corespondent pe disc. inode-urile de pe disc sunt, în general, grupate într-o zonă specializată (zonă de inode-uri), separată de zona de blocuri de date; în unele sisteme de fișiere, structurile echivalente inode-urilor sunt răspândite în structura sistemului de fișiere ([[http://lxr.free-electrons.com/source/fs/fat/?v=4.9 | FAT]]); | + | * La fel ca și superblocul, inode-ul are un corespondent pe disc. inode-urile de pe disc sunt, în general, grupate într-o zonă specializată (zonă de inode-uri), separată de zona de blocuri de date; în unele sisteme de fișiere, structurile echivalente inode-urilor sunt răspândite în structura sistemului de fișiere ([[http://lxr.free-electrons.com/source/fs/fat/?v=4.15 | FAT]]); |
- | * ca entitate **VFS**, inode-ul este reprezentat de structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L604 | struct inode]] și de operațiile cu aceasta definite în structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1736| struct inode_operations]]. | + | * ca entitate **VFS**, inode-ul este reprezentat de structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L565 | struct inode]] și de operațiile cu aceasta definite în structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1733| struct inode_operations]]. |
Fiecare inode este în general identificat de un număr. Pe Linux, argumentul ''-i'' la comanda ''ls'' precizează numărului inode-ului asociat fișierului: | Fiecare inode este în general identificat de un număr. Pe Linux, argumentul ''-i'' la comanda ''ls'' precizează numărului inode-ului asociat fișierului: | ||
Line 94: | Line 94: | ||
Localizare: | Localizare: | ||
- | * Structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L880 | struct file]] reprezintă entitatea VFS asociată, iar structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1696 | struct file_operations]] operațiile cu aceasta. | + | * Structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L852 | struct file]] reprezintă entitatea VFS asociată, iar structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1692 | struct file_operations]] operațiile cu aceasta. |
==== dentry ==== | ==== dentry ==== | ||
Line 108: | Line 108: | ||
* dentry are un corespondent pe disc, dar corespondența nu este directă deoarece fiecare sistem de fișiere păstrează dentry-urile într-un mod specific | * dentry are un corespondent pe disc, dar corespondența nu este directă deoarece fiecare sistem de fișiere păstrează dentry-urile într-un mod specific | ||
- | * în VFS, entitatea dentry este reprezentată de structura [[http://lxr.free-electrons.com/source/include/linux/dcache.h?v=4.9#L83 | struct dentry]] și de operațiile cu aceasta definite în structura [[http://lxr.free-electrons.com/source/include/linux/dcache.h?v=4.9#L129 | struct dentry_operations]]. | + | * în VFS, entitatea dentry este reprezentată de structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/dcache.h#L90 | struct dentry]] și de operațiile cu aceasta definite în structura [[hhttps://elixir.bootlin.com/linux/v4.15/source/include/linux/dcache.h#L136 | struct dentry_operations]]. |
===== Înregistrarea și deînregistrarea sistemelor de fișiere ===== | ===== Înregistrarea și deînregistrarea sistemelor de fișiere ===== | ||
Line 182: | Line 182: | ||
* [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2152 | mount_pseudo]], o funcție ajutătoare pentru pseudo-sistemele de fișiere (''sockfs'', ''pipefs'', în general sisteme de fișiere care nu pot fi montate) | * [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2152 | mount_pseudo]], o funcție ajutătoare pentru pseudo-sistemele de fișiere (''sockfs'', ''pipefs'', în general sisteme de fișiere care nu pot fi montate) | ||
- | Aceste funcții primesc ca parametru un pointer spre o funcție [[http://lxr.free-electrons.com/source/security/inode.c?v=4.9#L28 | fill_super]] care va fi apelată după inițializarea superblocului pentru terminarea inițializării acestuia de către driver. Un exemplu de o astfel de funcție găsiți în [[#functia_fill_super |secțiunea fill_super]]. | + | Aceste funcții primesc ca parametru un pointer spre o funcție [[https://elixir.bootlin.com/linux/v4.15/source/security/inode.c#L42 | fill_super]] care va fi apelată după inițializarea superblocului pentru terminarea inițializării acestuia de către driver. Un exemplu de o astfel de funcție găsiți în [[#functia_fill_super |secțiunea fill_super]]. |
La demontare nucleul apelează [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2081 | kill_sb]], care face operații de tip cleanup și apelează una din funcțiile: | La demontare nucleul apelează [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2081 | kill_sb]], care face operații de tip cleanup și apelează una din funcțiile: | ||
Line 326: | Line 326: | ||
În mare, funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L220 | ramfs_fill_super]] din codul de mai sus setează câteva câmpuri din superbloc, apoi citește inode-ul rădăcină și alocă dentry-ul rădăcină. Citirea inode-ului radăcină se face în funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L61 | ramfs_get_inode]], și constă din alocarea unui nou inode folosind [[https://elixir.bootlin.com/linux/v4.15/source/fs/inode.c#L901 | new_inode]] și inițializarea acestuia. Pentru eliberarea inode-ului se folosește [[https://elixir.bootlin.com/linux/v4.15/source/fs/inode.c#L1518 | iput]], iar pentru alocarea dentry-ului rădăcină [[https://elixir.bootlin.com/linux/v4.15/source/fs/dcache.c#L1885 | d_make_root]]. | În mare, funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L220 | ramfs_fill_super]] din codul de mai sus setează câteva câmpuri din superbloc, apoi citește inode-ul rădăcină și alocă dentry-ul rădăcină. Citirea inode-ului radăcină se face în funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L61 | ramfs_get_inode]], și constă din alocarea unui nou inode folosind [[https://elixir.bootlin.com/linux/v4.15/source/fs/inode.c#L901 | new_inode]] și inițializarea acestuia. Pentru eliberarea inode-ului se folosește [[https://elixir.bootlin.com/linux/v4.15/source/fs/inode.c#L1518 | iput]], iar pentru alocarea dentry-ului rădăcină [[https://elixir.bootlin.com/linux/v4.15/source/fs/dcache.c#L1885 | d_make_root]]. | ||
- | Un exemplu de implementare pentru un sistem de fișiere pentru disc este funcția [[http://lxr.free-electrons.com/source/fs/minix/inode.c?v=4.9#L158 | minix_fill_super]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/minix/?v=4.9 | minix]]. | + | Un exemplu de implementare pentru un sistem de fișiere pentru disc este funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/minix/inode.c#L158 | minix_fill_super]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/minix/?v=4.15 | minix]]. |
- | Funcționalitatea pentru sistemul de fișiere pentru disc este similară cu cea a sistemului de fișiere virtual, cu deosebirea folosirii buffer cache-ului. De asemenea, sistemul de fișiere ''minix'' păstrează date private de forma [[http://lxr.free-electrons.com/source/fs/minix/minix.h?v=4.9#L27 | struct minix_sb_info]]. Mare parte a acestei funcții se ocupa cu inițializarea acestor date private (care nu sunt incluse în extrasul de cod de mai sus, pentru claritate). Datele private sunt alocate folosind funcția [[http://lxr.free-electrons.com/source/include/linux/slab.h?v=4.9#L629| kzalloc]] și sunt păstrate în câmpul ''s_fs_info'' al superblocului. | + | Funcționalitatea pentru sistemul de fișiere pentru disc este similară cu cea a sistemului de fișiere virtual, cu deosebirea folosirii buffer cache-ului. De asemenea, sistemul de fișiere ''minix'' păstrează date private de forma [[https://elixir.bootlin.com/linux/v4.15/source/fs/minix/minix.h#L28 | struct minix_sb_info]]. Mare parte a acestei funcții se ocupa cu inițializarea acestor date private (care nu sunt incluse în extrasul de cod de mai sus, pentru claritate). Datele private sunt alocate folosind funcția [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/slab.h#L681| kzalloc]] și sunt păstrate în câmpul ''s_fs_info'' al superblocului. |
Funcțiile VFS-ului primesc de obicei ca parametru superblocul, un inode sau/și un dentry, care conțin un pointer către superbloc, astfel încât aceste date private pot fi accesate ușor. | Funcțiile VFS-ului primesc de obicei ca parametru superblocul, un inode sau/și un dentry, care conțin un pointer către superbloc, astfel încât aceste date private pot fi accesate ușor. | ||
Line 372: | Line 372: | ||
- [[http://lxr.free-electrons.com/source/Documentation/filesystems/vfs.txt|Documentation/filesystems/vfs.txt]] | - [[http://lxr.free-electrons.com/source/Documentation/filesystems/vfs.txt|Documentation/filesystems/vfs.txt]] | ||
- [[http://lxr.free-electrons.com/source/fs/|Sursele sistemelor de fișiere]] | - [[http://lxr.free-electrons.com/source/fs/|Sursele sistemelor de fișiere]] | ||
- | * [[http://lxr.free-electrons.com/source/fs/proc/?v=4.9 | procfs]] (//Process File System//) - [[http://lxr.free-electrons.com/source/fs/proc/?v=4.9|sursele sistemului de fișiere procfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/proc.txt?v=4.9|documentația]] | + | * [[http://lxr.free-electrons.com/source/fs/proc/?v=4.15 | procfs]] (//Process File System//) - [[http://lxr.free-electrons.com/source/fs/proc/?v=4.15|sursele sistemului de fișiere procfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/proc.txt?v=4.15|documentația]] |
- | * [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.9 | ramfs]] (//Random Access Memory Filing System//) - [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.9|sursele sistemului de fișiere ramfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/ramfs-rootfs-initramfs.txt?v=4.9|documentația]] | + | * [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.15 | ramfs]] (//Random Access Memory Filing System//) - [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.15|sursele sistemului de fișiere ramfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/ramfs-rootfs-initramfs.txt?v=4.15|documentația]] |
- | * [[http://en.wikipedia.org/wiki/Romfs|romfs]] (//Read-Only Memory File System//) - [[http://lxr.free-electrons.com/source/fs/romfs/?v=4.9|sursele sistemului de fișiere romfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/romfs.txt?v=4.9|documentația]] | + | * [[http://en.wikipedia.org/wiki/Romfs|romfs]] (//Read-Only Memory File System//) - [[http://lxr.free-electrons.com/source/fs/romfs/?v=4.15|sursele sistemului de fișiere romfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/romfs.txt?v=4.15|documentația]] |
- | * [[http://lxr.free-electrons.com/source/fs/minix/?v=4.9 | minix]] - [[http://lxr.free-electrons.com/source/fs/minix/?v=4.9|sursele sistemului de fișiere minix]] și informații: [[http://www.minix3.org/index.html|Minix Homepage]], Operating Systems Design and Implementation, Third Edition - Chapter 5. File Systems | + | * [[http://lxr.free-electrons.com/source/fs/minix/?v=4.15 | minix]] - [[http://lxr.free-electrons.com/source/fs/minix/?v=4.15|sursele sistemului de fișiere minix]] și informații: [[http://www.minix3.org/index.html|Minix Homepage]], Operating Systems Design and Implementation, Third Edition - Chapter 5. File Systems |
- | * [[http://en.wikipedia.org/wiki/Boot_File_System|bfs]] (//UnixWare Boot FileSystem//)- [[http://lxr.free-electrons.com/source/fs/bfs/?v=4.9|sursele sistemului de fișiere bfs]], [[http://lxr.free-electrons.com/source/Documentation/filesystems/bfs.txt|documentația]] și informații: [[http://www.nondot.org/sabre/os/files/FileSystems/bfs-structure.html|The BFS filesystem structure]], [[http://tldp.org/LDP/lki/lki-3.html#ss3.7|Linux Kernel 2.4 Internals - 3.7. Example Disk Filesystem: BFS]] | + | * [[http://en.wikipedia.org/wiki/Boot_File_System|bfs]] (//UnixWare Boot FileSystem//)- [[http://lxr.free-electrons.com/source/fs/bfs/?v=4.15|sursele sistemului de fișiere bfs]], [[http://lxr.free-electrons.com/source/Documentation/filesystems/bfs.txt|documentația]] și informații: [[http://www.nondot.org/sabre/os/files/FileSystems/bfs-structure.html|The BFS filesystem structure]], [[http://tldp.org/LDP/lki/lki-3.html#ss3.7|Linux Kernel 2.4 Internals - 3.7. Example Disk Filesystem: BFS]] |