Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so2:laboratoare:lab08 [2018/04/18 00:11]
anda.nicolae [Funcții și macro-uri folositoare]
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.| 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.| 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 333: Line 333:
 ===== Buffer cache-ul ===== ===== Buffer cache-ul =====
  
-Buffer cache-ul este un subsistem în kernel care se ocupă caching-ul (atât la citire cât și la scriere) blocurilor de pe dispozitivele de tip bloc. Entitatea de bază cu care lucrează buffer cache-ul este [[http://lxr.free-electrons.com/​source/​include/​linux/​buffer_head.h?v=4.9#L62 | struct buffer_head]]. Câmpurile mai importante din această structură sunt:+Buffer cache-ul este un subsistem în kernel care se ocupă caching-ul (atât la citire cât și la scriere) blocurilor de pe dispozitivele de tip bloc. Entitatea de bază cu care lucrează buffer cache-ul este [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​buffer_head.h#​L54 | struct buffer_head]]. Câmpurile mai importante din această structură sunt:
   * ''​b_data'',​ pointer către o zonă din memorie de unde au fost citite sau unde trebuie scrise date   * ''​b_data'',​ pointer către o zonă din memorie de unde au fost citite sau unde trebuie scrise date
   * ''​b_size'',​ dimensiunea buffer-ului   * ''​b_size'',​ dimensiunea buffer-ului
Line 341: Line 341:
  
 Există câteva funcții importante ce lucrează cu astfel de structuri: Există câteva funcții importante ce lucrează cu astfel de structuri:
-  * [[http://lxr.free-electrons.com/​source/​include/​linux/​buffer_head.h?v=4.9#L377 | __bread]]: citește un bloc cu numărul dat și de dimensiune dată într-o structură ''​buffer_head'';​ în caz de succes întoarce un pointer către ''​buffer_head'',​ altfel întoarce ''​NULL'';​ +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​buffer_head.h#​L383 | __bread]]: citește un bloc cu numărul dat și de dimensiune dată într-o structură ''​buffer_head'';​ în caz de succes întoarce un pointer către ''​buffer_head'',​ altfel întoarce ''​NULL'';​ 
-  * [[http://lxr.free-electrons.com/​source/​include/​linux/​buffer_head.h?v=4.9#L298 | sb_bread]]: face același lucru ca și funcția precedentă,​ dimensiunea blocului de citit fiind luată din superbloc, la fel și dispozitivul de pe care se face citirea; +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​buffer_head.h#​L304 | sb_bread]]: face același lucru ca și funcția precedentă,​ dimensiunea blocului de citit fiind luată din superbloc, la fel și dispozitivul de pe care se face citirea; 
-  * [[http://lxr.free-electrons.com/​source/​fs/​buffer.c?v=4.9#L1136 | mark_buffer_dirty]]:​ marchează buffer-ul dirty (setează bitul ''​BH_Dirty''​);​ buffer-ul va fi scris pe disc la un moment ulterior de timp (din când în când kernel thread-ul ''​bdflush''​ se trezește și scrie buffere pe disc); +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​buffer.c#​L1094 | mark_buffer_dirty]]:​ marchează buffer-ul dirty (setează bitul ''​BH_Dirty''​);​ buffer-ul va fi scris pe disc la un moment ulterior de timp (din când în când kernel thread-ul ''​bdflush''​ se trezește și scrie buffere pe disc); 
-  * [[http://lxr.free-electrons.com/source/include/linux/buffer_head.h?v=4.9#L286 | brelse]]: ​ eliberează memoria folosită de buffer, după ce în prealabil a scris buffer-ul pe disc daca era nevoie; +  * [[https://elixir.bootlin.com/linux/v4.15/source/fs/buffer.c#L1152 | brelse]]: ​ eliberează memoria folosită de buffer, după ce în prealabil a scris buffer-ul pe disc daca era nevoie; 
-  * [[http://lxr.free-electrons.com/​source/​include/​linux/​buffer_head.h?v=4.9#L329 | map_bh]]: asociază buffer-head-ul cu sectorul corespunzător.+  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​buffer_head.h#​L341 | map_bh]]: asociază buffer-head-ul cu sectorul corespunzător.
  
 ===== Funcții și macro-uri folositoare ===== ===== Funcții și macro-uri folositoare =====
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.| 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.| 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.| 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]]
  
so2/laboratoare/lab08.1523999517.txt.gz · Last modified: 2018/04/18 00:11 by anda.nicolae
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0