Differences

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

Link to this comparison view

so2:teme:tema3 [2019/02/27 09:32]
daniel.baluta [Tema 3 - Software RAID]
so2:teme:tema3 [2020/04/12 23:05] (current)
lucian.teodorescu [Sfaturi]
Line 1: Line 1:
 ====== Tema 3 - Software RAID ====== ====== Tema 3 - Software RAID ======
  
-  * Termen de predare: **Miercuri30 Aprilie 2019, ora 23:00**+  * Termen de predare: **Duminică3 Mai 2020, ora 23:00**
  
 ===== Scopul temei===== ===== Scopul temei=====
Line 40: Line 40:
   * modulul de kernel va avea numele **ssr.ko**   * modulul de kernel va avea numele **ssr.ko**
   * dispozitivul logic va fi accesat ca un dispozitiv de tip bloc cu majorul ''​SSR_MAJOR''​ și minorul ''​SSR_FIRST_MINOR''​ sub numele ''/​dev/​ssr''​ (prin macro-ul ''​LOGICAL_DISK_NAME''​)   * dispozitivul logic va fi accesat ca un dispozitiv de tip bloc cu majorul ''​SSR_MAJOR''​ și minorul ''​SSR_FIRST_MINOR''​ sub numele ''/​dev/​ssr''​ (prin macro-ul ''​LOGICAL_DISK_NAME''​)
-  * dispozitivul virtual (''​LOGICAL_DISK_NAME''​ - ''/​dev/​ssr''​) va avea capacitatea de ''​LOGICAL_DISK_SECTORS''​ (folosiți [[http://lxr.free-electrons.com/​source/​include/​linux/​genhd.h?v=4.9#L451 | set_capacity]] pe structura [[http://lxr.free-electrons.com/​source/​include/​linux/​genhd.h?v=4.9#L180 | struct gendisk]])+  * dispozitivul virtual (''​LOGICAL_DISK_NAME''​ - ''/​dev/​ssr''​) va avea capacitatea de ''​LOGICAL_DISK_SECTORS''​ (folosiți [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​genhd.h#​L445 | set_capacity]] pe structura [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​genhd.h#​L174 | struct gendisk]])
   * cele două discuri sunt reprezentate de dispozitivele ''/​dev/​vdb'',​ respectiv ''/​dev/​vdc'',​ definite prin intermediul macro-urilor ''​PHYSICAL_DISK1_NAME'',​ respectiv ''​PHYSICAL_DISK2_NAME''​   * cele două discuri sunt reprezentate de dispozitivele ''/​dev/​vdb'',​ respectiv ''/​dev/​vdc'',​ definite prin intermediul macro-urilor ''​PHYSICAL_DISK1_NAME'',​ respectiv ''​PHYSICAL_DISK2_NAME''​
-  * pentru lucrul cu structura [[http://lxr.free-electrons.com/​source/​include/​linux/​fs.h?v=4.9#L457 | struct block_device]] asociată unui dispozitiv fizic, puteți utiliza funcțiile [[http://lxr.free-electrons.com/​source/​fs/​block_dev.c?v=4.9#L1467 | blkdev_get_by_path]] și [[http://lxr.free-electrons.com/​source/​fs/​block_dev.c?v=4.9#L1619 | blkdev_put]] +  * pentru lucrul cu structura [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​fs.h#​L432 | struct block_device]] asociată unui dispozitiv fizic, puteți utiliza funcțiile [[https://elixir.bootlin.com/​linux/​v4.19/​source/​fs/​block_dev.c#​L1685 | blkdev_get_by_path]] și [[https://elixir.bootlin.com/​linux/​v4.19/​source/​fs/​block_dev.c#​L1814 | blkdev_put]] 
-  * pentru tratarea cererilor din user space, recomandăm să nu vă folosiți de o coadă de cereri, ci să faceți prelucrare la nivel de structuri [[http://lxr.free-electrons.com/​source/​include/​linux/​blk_types.h?v=4.9#L21 | struct bio]]; puteți înregistra o rutină corespunzătoare folosind apelul [[http://lxr.free-electrons.com/​source/​block/​blk-settings.c?v=4.9#L136 | blk_queue_make_request]] +  * pentru tratarea cererilor din user space, recomandăm să nu vă folosiți de o coadă de cereri, ci să faceți prelucrare la nivel de structuri [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​blk_types.h#​L144 | struct bio]]; puteți înregistra o rutină corespunzătoare folosind apelul [[https://elixir.bootlin.com/​linux/​v4.19/​source/​block/​blk-settings.c#​L163 | blk_queue_make_request]] 
-  * rutina de tipul [[http://lxr.free-electrons.com/​source/​include/​linux/​blkdev.h?v=4.9#L225 | make_request_fn]] poate fi apelată în paralel+  * rutina de tipul [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​blkdev.h#​L315 | make_request_fn]] poate fi apelată în paralel
   * întrucât sectoarele de date sunt separate de sectoarele de CRC-uri va trebui să construiți structuri bio separate pentru date și pentru valorile CRC   * întrucât sectoarele de date sunt separate de sectoarele de CRC-uri va trebui să construiți structuri bio separate pentru date și pentru valorile CRC
-  * pentru alocarea unui bio pentru discurile fizice puteți folosi [[http://lxr.free-electrons.com/​source/​include/​linux/​bio.h?v=4.9#L391|bio_alloc]];​ pentru adăugarea de pagini de date în bio folosiți [[http://lxr.free-electrons.com/​source/​include/​linux/​gfp.h?v=4.9#L484|alloc_page]] și [[http://lxr.free-electrons.com/​source/​block/​bio.c?v=4.9#L799|bio_add_page]] +  * pentru alocarea unui bio pentru discurile fizice puteți folosi [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​bio.h#​L435|bio_alloc]];​ pentru adăugarea de pagini de date în bio folosiți [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​gfp.h#​L524|alloc_page]] și [[https://elixir.bootlin.com/​linux/​v4.19/​source/​block/​bio.c#​L818|bio_add_page]] 
-  * pentru eliberarea spațiului alocat de un bio este nevoie să eliberați paginile alocate bio-ului (folosind macro-ul [[http://lxr.free-electrons.com/​source/​include/​linux/​gfp.h?v=4.9#L513 | __free_page]]) și să apelați [[http://lxr.free-electrons.com/​source/​block/​bio.c?v=4.9#L529|bio_put]]+  * pentru eliberarea spațiului alocat de un bio este nevoie să eliberați paginile alocate bio-ului (folosind macro-ul [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​gfp.h#​L554 | __free_page]]) și să apelați [[https://elixir.bootlin.com/​linux/​v4.19/​source/​block/​bio.c#​L558|bio_put]]
   * când generați o structură bio, luați în considerare că aceasta trebuie să aibă dimensiunea multiplu de dimensiunea sectorului de disc (''​KERNEL_SECTOR_SIZE''​)   * când generați o structură bio, luați în considerare că aceasta trebuie să aibă dimensiunea multiplu de dimensiunea sectorului de disc (''​KERNEL_SECTOR_SIZE''​)
-  * pentru a transmite o cerere către un dispozitiv de tip bloc și a aștepta încheierea acesteia, puteți utiliza funcția [[http://lxr.free-electrons.com/​source/​block/​bio.c?v=4.9#L863 | submit_bio_wait]] +  * pentru a transmite o cerere către un dispozitiv de tip bloc și a aștepta încheierea acesteia, puteți utiliza funcția [[https://elixir.bootlin.com/​linux/​v4.19/​source/​block/​bio.c#​L922 | submit_bio_wait]] 
-  * folosiți [[http://lxr.free-electrons.com/​source/​block/​bio.c?v=4.9#L1734 | bio_endio]] pentru a semnala terminarea prelucrării unei structuri bio +  * folosiți [[https://elixir.bootlin.com/​linux/​v4.19/​source/​block/​bio.c#​L1740 | bio_endio]] pentru a semnala terminarea prelucrării unei structuri bio 
-  * pentru calculul CRC32 puteți utiliza macro-ul [[http://lxr.free-electrons.com/​source/​include/​linux/​crc32.h?v=4.9#L66 | crc32]] pus la dispoziție de kernel+  * pentru calculul CRC32 puteți utiliza macro-ul [[https://elixir.bootlin.com/​linux/​v4.19/​source/​include/​linux/​crc32.h#​L66 | crc32]] pus la dispoziție de kernel
   * macrodefinițiile utile se găsesc în [[http://​elf.cs.pub.ro/​so2/​res/​teme/​ssr.h|header-ul de suport al temei]]   * macrodefinițiile utile se găsesc în [[http://​elf.cs.pub.ro/​so2/​res/​teme/​ssr.h|header-ul de suport al temei]]
   * **recomandăm** != **este obligatoriu** (orice rezolvare care respectă cerințele temei este acceptată)   * **recomandăm** != **este obligatoriu** (orice rezolvare care respectă cerințele temei este acceptată)
Line 57: Line 57:
  
 <note important>​ <note important>​
-O singură funcție de prelucrare a cererilor pentru dispozitive de tip bloc poate fi activă la un moment dat în cadrul unei stive de apeluri (mai multe detalii [[http://lxr.free-electrons.com/​source/​block/​blk-core.c?v=4.9#L2003 | aici]]). Va trebui să submiteți cererile pentru dispozitivele fizice dintr-un kernel thread; recomandăm folosirea [[http://​ocw.cs.pub.ro/​courses/​so2/​laboratoare/​lab06#​workqueues | workqueues]].+O singură funcție de prelucrare a cererilor pentru dispozitive de tip bloc poate fi activă la un moment dat în cadrul unei stive de apeluri (mai multe detalii [[https://elixir.bootlin.com/​linux/​v4.19/​source/​block/​blk-core.c#​L2404 | aici]]). Va trebui să submiteți cererile pentru dispozitivele fizice dintr-un kernel thread; recomandăm folosirea [[http://​ocw.cs.pub.ro/​courses/​so2/​laboratoare/​lab06#​workqueues | workqueues]].
 </​note>​ </​note>​
  
Line 94: Line 94:
 ==== Sfaturi ==== ==== Sfaturi ====
  
-Pentru a vă mări șansele de a obține nota maximă, citiți și respectați coding style-ul kernelului Linux descris din documentul [[http://lxr.free-electrons.com/​source/​Documentation/​process/​coding-style.rst | Coding Style]].+Pentru a vă mări șansele de a obține nota maximă, citiți și respectați coding style-ul kernelului Linux descris din documentul [[https://elixir.bootlin.com/​linux/​v4.19/​source/​Documentation/​process/​coding-style.rst | Coding Style]].
  
 De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul: De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul:
Line 125: Line 125:
 ===== Resurse ====== ===== Resurse ======
  
-  * implementarea de [[http://lxr.free-electrons.com/​source/​drivers/​md/?​v=4.9 ​| software RAID]] din nucleul Linux.+  * implementarea de [[https://elixir.bootlin.com/​linux/​v4.19/​source/​drivers/​md | software RAID]] din nucleul Linux.
  
 <note important>​ <note important>​
so2/teme/tema3.1551252742.txt.gz · Last modified: 2019/02/27 09:32 by daniel.baluta
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