This shows you the differences between two versions of the page.
so2:teme:tema3 [2019/04/02 21:41] 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: **Miercuri, 8 Mai 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> |