Differences

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

Link to this comparison view

so2:laboratoare:lab08 [2018/04/14 15:46]
anda.nicolae [Înregistrarea și deînregistrarea sistemelor de fișiere]
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 =====
  
 În versiunea actuală, kernel-ul Linux are suport pentru un număr în jur de 50 de sisteme de fișiere, dintre care: În versiunea actuală, kernel-ul Linux are suport pentru un număr în jur de 50 de sisteme de fișiere, dintre care:
-  * [[http://​lxr.free-electrons.com/​source/​fs/​ext2/?​v=4.| ext2]]/​[[http://​lxr.free-electrons.com/​source/​fs/​ext4/?​v=4.| ext4]] +  * [[http://​lxr.free-electrons.com/​source/​fs/​ext2/?​v=4.15 | ext2]]/​[[http://​lxr.free-electrons.com/​source/​fs/​ext4/?​v=4.15 | ext4]] 
-  * [[http://​lxr.free-electrons.com/​source/​fs/​reiserfs/?​v=4.| reiserfs]] +  * [[http://​lxr.free-electrons.com/​source/​fs/​reiserfs/?​v=4.15 | reiserfs]] 
-  * [[http://​lxr.free-electrons.com/​source/​fs/​xfs/?​v=4.| xfs]] +  * [[http://​lxr.free-electrons.com/​source/​fs/​xfs/?​v=4.15 | xfs]] 
-  * [[http://​lxr.free-electrons.com/​source/​fs/​fat/?​v=4.| fat]] +  * [[http://​lxr.free-electrons.com/​source/​fs/​fat/?​v=4.15 | fat]] 
-  * [[http://​lxr.free-electrons.com/​source/​fs/​ntfs/?​v=4.| ntfs]] +  * [[http://​lxr.free-electrons.com/​source/​fs/​ntfs/?​v=4.15 | ntfs]] 
-  * [[http://​lxr.free-electrons.com/​source/​fs/​isofs/?​v=4.| iso9660]] +  * [[http://​lxr.free-electrons.com/​source/​fs/​isofs/?​v=4.15 | iso9660]] 
-  * [[http://​lxr.free-electrons.com/​source/​fs/​udf/?​v=4.| udf]] pentru cd-uri și dvd-uri +  * [[http://​lxr.free-electrons.com/​source/​fs/​udf/?​v=4.15 | udf]] pentru cd-uri și dvd-uri 
-  * [[http://​lxr.free-electrons.com/​source/​fs/​hpfs/?​v=4.| hpfs]]+  * [[http://​lxr.free-electrons.com/​source/​fs/​hpfs/?​v=4.15 | hpfs]]
 Pe un singur sistem, însă, este puțin probabil să existe mai mult de 5-6 sisteme de fișiere. Din acest motiv, sistemele de fișiere (sau, mai corect, tipurile de sisteme de fișiere) sunt implementate ca module și pot fi încărcate sau descărcate oricând. Pe un singur sistem, însă, este puțin probabil să existe mai mult de 5-6 sisteme de fișiere. Din acest motiv, sistemele de fișiere (sau, mai corect, tipurile de sisteme de fișiere) sunt implementate ca module și pot fi încărcate sau descărcate oricând.
  
-Pentru a putea încărca / descărca în mod dinamic un modul de sistem de fișiere este necesar un API de înregistrare / deînregistrare a tipului sistemului de fișiere în / din sistem. Structura care descrie un anumit sistem de fișiere este [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L2028 | struct file_system_type]]:​+Pentru a putea încărca / descărca în mod dinamic un modul de sistem de fișiere este necesar un API de înregistrare / deînregistrare a tipului sistemului de fișiere în / din sistem. Structura care descrie un anumit sistem de fișiere este [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L2071 | struct file_system_type]]:​
  
 <code c> <code c>
Line 147: Line 147:
   * Funcția ''​mount''​ citește superblocul de pe disc în memorie la încărcarea sistemului de fișiere. Funcția este proprie fiecărui sistem de fișiere. Pentru mai multe detalii, citiți Secțiunea [[#​functiile_mount_kill_sb | Funcțiile mount kill_sb ]].   * Funcția ''​mount''​ citește superblocul de pe disc în memorie la încărcarea sistemului de fișiere. Funcția este proprie fiecărui sistem de fișiere. Pentru mai multe detalii, citiți Secțiunea [[#​functiile_mount_kill_sb | Funcțiile mount kill_sb ]].
   * Funcția ''​kill_sb''​ eliberează superblocul din memorie, citiți Secțiunea [[#​functiile_mount_kill_sb | Funcțiile mount kill_sb ]].   * Funcția ''​kill_sb''​ eliberează superblocul din memorie, citiți Secțiunea [[#​functiile_mount_kill_sb | Funcțiile mount kill_sb ]].
-  * ''​fs_flags''​ precizează flag-urile cu care trebuie montat sistemul de fișiere. Un exemplu de flag este [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L2031 | FS_REQUIRES_DEV]] care precizează VFS-ului că sistemul de fișiere are nevoie de un disc (nu este un sistem de fișiere virtual).+  * ''​fs_flags''​ precizează flag-urile cu care trebuie montat sistemul de fișiere. Un exemplu de flag este [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L2074 | FS_REQUIRES_DEV]] care precizează VFS-ului că sistemul de fișiere are nevoie de un disc (nu este un sistem de fișiere virtual).
   * ''​fs_supers''​ este o listă ce conține toate superblocurile asociate acestui sistem de fișiere. Dat fiind că același tip de sistem de fișiere poate fi montat de mai multe ori, pentru fiecare mount va exista un superbloc separat.   * ''​fs_supers''​ este o listă ce conține toate superblocurile asociate acestui sistem de fișiere. Dat fiind că același tip de sistem de fișiere poate fi montat de mai multe ori, pentru fiecare mount va exista un superbloc separat.
  
 **Înregistrarea unui sistem de fișiere** în sistem se realizează,​ în general, în funcția de inițializare a modulului. Pentru înregistrare,​ programatorul va trebui să **Înregistrarea unui sistem de fișiere** în sistem se realizează,​ în general, în funcția de inițializare a modulului. Pentru înregistrare,​ programatorul va trebui să
-  - inițializeze o structură de tipul [[http://​lxr.free-electrons.com/​source/​include/​linux/​fs.h?​v=4.9#L2028 | struct file_system_type]] cu numele, flag-urile, funcția care implementează operația de citire a superblocului și referința la structura ce identifică modulul curent +  - inițializeze o structură de tipul [[http://​lxr.free-electrons.com/​source/​include/​linux/​fs.h?​v=4.15#L2074 | struct file_system_type]] cu numele, flag-urile, funcția care implementează operația de citire a superblocului și referința la structura ce identifică modulul curent 
-  - apeleze funcția [[http://lxr.free-electrons.com/​source/​fs/​filesystems.c?v=4.9#L56 | register_filesystem]].+  - apeleze funcția [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​filesystems.c#​L71 | register_filesystem]].
  
-La **descărcarea modulului** trebuie să se deînregistreze sistemul de fișiere prin apelarea funcției [[http://lxr.free-electrons.com/​source/​fs/​filesystems.c?v=4.9#L89 | unregister_filesystem]].+La **descărcarea modulului** trebuie să se deînregistreze sistemul de fișiere prin apelarea funcției [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​filesystems.c#​L103 | unregister_filesystem]].
  
-Un [[http://lxr.free-electrons.com/​source/​fs/​ramfs/​inode.c?v=4.9#L252 | exemplu de înregistrare ​/ deînregistrare]] a unui sistem de fișiere virtual se găsește în codul pentru [[http://​lxr.free-electrons.com/​source/​fs/​ramfs/?​v=4.| ramfs]]:+Un [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​ramfs/​inode.c#​L262 | exemplu de înregistrare]] a unui sistem de fișiere virtual se găsește în codul pentru [[http://​lxr.free-electrons.com/​source/​fs/​ramfs/?​v=4.15 | ramfs]]:
  
 <code c> <code c>
 static struct file_system_type ramfs_fs_type = { static struct file_system_type ramfs_fs_type = {
         .name           = "​ramfs",​         .name           = "​ramfs",​
-        .mount ​        ​= ramfs_mount,​ +        .mount ​         = ramfs_mount,​ 
-        .kill_sb ​       = kill_litter_super,+        .kill_sb ​       = ramfs_kill_sb,​ 
 +        .fs_flags ​      = FS_USERNS_MOUNT,
 }; };
  
 static int __init init_ramfs_fs(void) static int __init init_ramfs_fs(void)
 { {
 +        if (test_and_set_bit(0,​ &once))
 +                return 0;
         return register_filesystem(&​ramfs_fs_type);​         return register_filesystem(&​ramfs_fs_type);​
-} 
- 
-static void __exit exit_ramfs_fs(void) 
-{ 
-        unregister_filesystem(&​ramfs_fs_type);​ 
 } }
 </​code>​ </​code>​
Line 178: Line 176:
 ==== Funcțiile mount, kill_sb ==== ==== Funcțiile mount, kill_sb ====
  
-La montarea sistemului de fișiere, nucleul apelează funcția [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L2036 | mount]] definită în cadrul structurii [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L2028  | struct file_system_type]]. Funcția face un set de inițializări și returnează un dentry (structura [[http://lxr.free-electrons.com/​source/​include/​linux/​dcache.h?v=2.6.35#L89 | struct dentry]]) ce reprezinta directorul punctului de mount. De obicei, ''​mount''​ este o funcție simplă care apelează una din funcțiile:​ +La montarea sistemului de fișiere, nucleul apelează funcția [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L2079 | mount]] definită în cadrul structurii [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L2071  | struct file_system_type]]. Funcția face un set de inițializări și returnează un dentry (structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​dcache.h#​L90 | struct dentry]]) ce reprezinta directorul punctului de mount. De obicei, ''​mount''​ este o funcție simplă care apelează una din funcțiile:​ 
-  * [[http://lxr.free-electrons.com/​source/​fs/​super.c?v=4.9#L1020 | mount_bdev]],​ care montează un sistem de fișiere aflat pe un device de tip bloc +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​super.c#​L1065 | mount_bdev]],​ care montează un sistem de fișiere aflat pe un device de tip bloc 
-  * [[http://lxr.free-electrons.com/​source/​fs/​super.c?v=4.9#L1135 | mount_single]],​ care montează un sistem de fișiere care partajează o instanță între toate operațiile de montare +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​super.c#​L1180 | mount_single]],​ care montează un sistem de fișiere care partajează o instanță între toate operațiile de montare 
-  * [[http://lxr.free-electrons.com/​source/​fs/​super.c?v=4.9#L1110 | mount_nodev]],​ care montează un sistem de fișiere ce nu se afla pe un device fizic +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​super.c#​L1155 | mount_nodev]],​ care montează un sistem de fișiere ce nu se afla pe un device fizic 
-  * [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L2093 | 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ă [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L2038 | 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:​ 
-  * [[http://lxr.free-electrons.com/​source/​fs/​super.c?v=4.9#L1095 | kill_block_super]],​ care demontează un sistem de fișiere aflat pe un device de tip bloc +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​super.c#​L1140 | kill_block_super]],​ care demontează un sistem de fișiere aflat pe un device de tip bloc 
-  * [[http://lxr.free-electrons.com/​source/​fs/​super.c?v=4.9#L939 | kill_anon_super]],​ care demontează un sistem de fișiere virtual (informația este generată în momentul în care este cerută) +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​super.c#​L988 | kill_anon_super]],​ care demontează un sistem de fișiere virtual (informația este generată în momentul în care este cerută) 
-  * [[http://lxr.free-electrons.com/​source/​fs/​super.c?v=4.9#L948 | kill_litter_super]],​ care demontează un sistem de fișiere ce nu se afla pe un device fizic (menține informația în memorie)+  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​super.c#​L997 | kill_litter_super]],​ care demontează un sistem de fișiere ce nu se afla pe un device fizic (menține informația în memorie)
  
-Un **exemplu pentru un sistem de fișiere fără suport pe disc** este funcția [[http://lxr.free-electrons.com/​source/​fs/​ramfs/​inode.c?v=4.9#L240 | ramfs_mount]] din sistemul de fișiere [[http://​lxr.free-electrons.com/​source/​fs/​ramfs/?​v=4.9 | ramfs]]:+Un **exemplu pentru un sistem de fișiere fără suport pe disc** este funcția [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​ramfs/​inode.c#​L250 | ramfs_mount]] din sistemul de fișiere [[http://​lxr.free-electrons.com/​source/​fs/​ramfs/?​v=4.9 | ramfs]]:
  
 <code c> <code c>
Line 201: Line 199:
 </​code>​ </​code>​
  
-Un **exemplu pentru un sistem de fișiere pentru disc** este funcția [[http://lxr.free-electrons.com/​source/​fs/​minix/​inode.c?v=4.9#L651 | minix_mount]] din sistemul de fișiere [[http://​lxr.free-electrons.com/​source/​fs/​minix/?​v=4.| minix]]:+Un **exemplu pentru un sistem de fișiere pentru disc** este funcția [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​minix/​inode.c#​L653 | minix_mount]] din sistemul de fișiere [[http://​lxr.free-electrons.com/​source/​fs/​minix/?​v=4.15 | minix]]:
  
 <code c> <code c>
Line 217: Line 215:
 ==== Structura struct super_block ==== ==== Structura struct super_block ====
  
-O parte din definiția structurii [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L1338 | struct super_block]] este prezentată mai jos:+O parte din definiția structurii [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L1337 | struct super_block]] este prezentată mai jos:
  
 <code c> <code c>
Line 223: Line 221:
         //...         //...
         dev_t                   ​s_dev; ​             /* identifier */         dev_t                   ​s_dev; ​             /* identifier */
 +        unsigned char           ​s_blocksize_bits; ​  /* block size in bits */        ​
         unsigned long           ​s_blocksize; ​       /* block size in bytes */         unsigned long           ​s_blocksize; ​       /* block size in bytes */
-        unsigned char           ​s_blocksize_bits; ​  /* block size in bits */ 
         unsigned char           ​s_dirt; ​            /* dirty flag */         unsigned char           ​s_dirt; ​            /* dirty flag */
-        ​unsigned long long      ​s_maxbytes; ​        /* max file size */+        ​loff_t ​                 ​s_maxbytes; ​        /* max file size */
         struct file_system_type *s_type; ​           /* filesystem type */         struct file_system_type *s_type; ​           /* filesystem type */
         struct super_operations *s_op; ​             /* superblock methods */         struct super_operations *s_op; ​             /* superblock methods */
Line 251: Line 249:
 ==== Operațiile pe superbloc ==== ==== Operațiile pe superbloc ====
  
-Operațiile pe superbloc sunt descrise de structura [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L1786  | struct super_operations]]:​+Operațiile pe superbloc sunt descrise de structura [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L1803  | struct super_operations]]:​
  
 <code c> <code c>
Line 262: Line 260:
        void (*put_super) (struct super_block *);        void (*put_super) (struct super_block *);
        int (*statfs) (struct dentry *, struct kstatfs *);        int (*statfs) (struct dentry *, struct kstatfs *);
-       int (*remount_fs) (struct super_block *sb, int *flags, char *data);+       int (*remount_fs) (struct super_block *, int *, char *);
        //...        //...
 }; };
Line 276: Line 274:
 ===== Funcția fill_super ===== ===== Funcția fill_super =====
  
-După cum s-a specificat, funcția ''​fill_super''​ este apelată pentru terminarea inițializării superblocului. Această inițializare presupune completarea câmpurilor structurii [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L1338 | struct super_block]] și inițializarea inode-ului rădăcină.+După cum s-a specificat, funcția ''​fill_super''​ este apelată pentru terminarea inițializării superblocului. Această inițializare presupune completarea câmpurilor structurii [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L1337 | struct super_block]] și inițializarea inode-ului rădăcină.
  
-Un exemplu de implementare este funcția [[http://lxr.free-electrons.com/​source/​fs/​ramfs/​inode.c?v=4.9#L208 | ramfs_fill_super]] apelată pentru inițializarea câmpurile din superbloc care au mai rămas de inițializat:​+Un exemplu de implementare este funcția [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​ramfs/​inode.c#​L220 | ramfs_fill_super]] apelată pentru inițializarea câmpurile din superbloc care au mai rămas de inițializat:​
  
 <code c> <code c>
Line 287: Line 285:
 static const struct super_operations ramfs_ops = { static const struct super_operations ramfs_ops = {
         .statfs ​        = simple_statfs,​         .statfs ​        = simple_statfs,​
-        .drop_inode ​    ​= ​generic_drop_inode+        .drop_inode ​    ​= ​generic_delete_inode
-        .show_options ​  ​= ​generic_show_options,+        .show_options ​  ​= ​ramfs_show_options,
 }; };
  
Line 324: Line 322:
 </​code>​ </​code>​
  
-În kernel sunt disponibile funcții generice pentru implementarea operațiilor cu structurile sistemelor de fișiere. Funcțiile [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L2730 | generic_drop_inode]] și [[http://lxr.free-electrons.com/​source/​fs/​libfs.c?v=4.9#L33 | simple_statfs]],​ folosite în codul de mai sus, sunt astfel de funcții și pot fi folosite în implementarea driverelor, daca funcționalitatea acestora este suficientă.+În kernel sunt disponibile funcții generice pentru implementarea operațiilor cu structurile sistemelor de fișiere. Funcțiile [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​fs.h#​L2867 | generic_drop_inode]] și [[https://elixir.bootlin.com/​linux/​v4.15/​source/​fs/​libfs.c#​L34 | simple_statfs]],​ folosite în codul de mai sus, sunt astfel de funcții și pot fi folosite în implementarea driverelor, daca funcționalitatea acestora este suficientă.
  
-În mare, funcția [[http://lxr.free-electrons.com/​source/​fs/​ramfs/​inode.c?v=4.9#L208 | 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 [[http://lxr.free-electrons.com/​source/​fs/​ramfs/​inode.c?v=4.9#L53 | ramfs_get_inode]],​ și constă din alocarea unui nou inode folosind [[http://lxr.free-electrons.com/​source/​fs/​inode.c?v=4.9#L900 | new_inode]] și inițializarea acestuia. Pentru eliberarea inode-ului se folosește [[http://lxr.free-electrons.com/​source/​fs/​inode.c?v=4.9#L1518 | iput]], iar pentru alocarea dentry-ului rădăcină [[http://lxr.free-electrons.com/​source/​fs/​dcache.c?v=4.9#L1846 | 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 335: 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 343: 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 =====
  
 Superblocul conține de obicei o hartă a blocurilor ocupate (de inode-uri, dentry, date) sub forma unui bitmap (vector de biți). Pentru lucrul cu aceste hărți se recomandă folosirea următoarelor funcții: Superblocul conține de obicei o hartă a blocurilor ocupate (de inode-uri, dentry, date) sub forma unui bitmap (vector de biți). Pentru lucrul cu aceste hărți se recomandă folosirea următoarelor funcții:
-  * [[http://lxr.free-electrons.com/​source/​lib/​find_bit.c?v=4.9#L100 | find_first_zero_bit]],​ pentru găsirea primului bit zero dintr-o zonă de memorie. Parametrul size semnifică numărul de biți al zonei în care se face căutarea;​ +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​lib/​find_bit.c#​L100 | find_first_zero_bit]],​ pentru găsirea primului bit zero dintr-o zonă de memorie. Parametrul size semnifică numărul de biți al zonei în care se face căutarea;​ 
-  * [[http://lxr.free-electrons.com/​source/​include/​asm-generic/​bitops/​atomic.h?v=4.9#L118 | test_and_set_bit]],​ pentru setarea unui bit și obținerea vechii valori; +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​asm-generic/​bitops/​atomic.h#​L119 | test_and_set_bit]],​ pentru setarea unui bit și obținerea vechii valori; 
-  * [[http://lxr.free-electrons.com/​source/​include/​asm-generic/​bitops/​atomic.h?v=4.9#L142 | test_and_clear_bit]],​ pentru ștergerea unui bit și obținerea vechii valori; +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​asm-generic/​bitops/​atomic.h#​L143 | test_and_clear_bit]],​ pentru ștergerea unui bit și obținerea vechii valori; 
-  * [[http://lxr.free-electrons.com/​source/​include/​asm-generic/​bitops/​atomic.h?v=4.9#L166 | test_and_change_bit]],​ pentru inversarea valorii unui bit și obținerea vechii valori.+  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​asm-generic/​bitops/​atomic.h#​L167 | test_and_change_bit]],​ pentru inversarea valorii unui bit și obținerea vechii valori.
  
 Pentru verificarea tipului unui inode se pot folosi următoarele macrodefiniții:​ Pentru verificarea tipului unui inode se pot folosi următoarele macrodefiniții:​
-  * [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​stat.h?v=4.9#L21 | S_ISDIR]]''​(inode->​i_mode)'',​ pentru a verifica dacă inode-ul este un director; +  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​stat.h#​L23 | S_ISDIR]]''​(inode->​i_mode)'',​ pentru a verifica dacă inode-ul este un director; 
-  * [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​stat.h?v=4.9#L20 | S_ISREG]]''​(inode->​i_mode)'',​ pentru a verifica dacă inode-ul este un fișier clasic (nu de tip link sau device).+  * [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​stat.h#​L22 | S_ISREG]]''​(inode->​i_mode)'',​ pentru a verifica dacă inode-ul este un fișier clasic (nu de tip link sau device).
  
 ===== Resurse utile ===== ===== Resurse utile =====
Line 372: Line 370:
   - [[http://​inglorion.net/​documents/​tutorials/​tutorfs/​|A Linux Filesystem Tutorial]]   - [[http://​inglorion.net/​documents/​tutorials/​tutorfs/​|A Linux Filesystem Tutorial]]
   - [[http://​www.win.tue.nl/​~aeb/​linux/​lk/​lk-8.html|The Linux Virtual File System]]   - [[http://​www.win.tue.nl/​~aeb/​linux/​lk/​lk-8.html|The Linux Virtual File System]]
-  - [[http://​www.nondot.org/​sabre/​os/​articles/​FileSystems/​|File Systems]] 
   - [[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.1523710012.txt.gz · Last modified: 2018/04/14 15:46 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