Differences

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

Link to this comparison view

so2:laboratoare:lab08 [2018/04/17 22:11]
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 =====
Line 176: 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 199: 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 215: 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 221: 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 249: 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 260: 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 274: 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 285: 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 322: 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 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 =====
  
 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 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.1523992316.txt.gz · Last modified: 2018/04/17 22: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