Differences

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

Link to this comparison view

so2:teme:tema6 [2018/05/19 13:22]
daniel.baluta [e100 private data]
so2:teme:tema6 [2019/05/22 21:08] (current)
daniel.baluta [e100 - driver de rețea]
Line 1: Line 1:
 ===== e100 - driver de rețea ==== ===== e100 - driver de rețea ====
-  * Termen de predare: ​**Miercuri, 23 Mai 2018, ora 23:00 ** \\+  * Termen de predare: ​<tema nu intra in lista oficiala de teme pentru 2019>
 ===== Scopul temei ===== ===== Scopul temei =====
  
Line 10: Line 10:
 ===== Enunț =====  ===== Enunț ===== 
  
-Să se scrie un driver pentru placa de rețea **Intel 82559ER** (device întâlnit şi sub numele de **e100** sau **eepro100**). Modulul va trebui să suporte device-urile de rețea configurate în maşina virtuală qemu. Specificațiile ​acestora le găsiți în următoarele documente: +Să se scrie un driver pentru placa de rețea **Intel 82559ER** (device întâlnit şi sub numele de **e100** sau **eepro100**). Modulul va trebui să suporte device-urile de rețea configurate în maşina virtuală qemu. Specificațiile ​se gasesc in documentul:
-  * [[ http://​application-notes.digchip.com/​027/​27-45688.pdf | Intel 8255x 10/100 Mbps Ethernet Controller Family Open Source Software Developer Manual ]] +
-  * [[http://​www.intel.com/​content/​www/​us/​en/​ethernet-controllers/​82559er-fast-ethernet-pci-datasheet.html | 82559ER Fast Ethernet PCI Controller Datasheet]]+
  
-Nu va trebui să ciți în întregime ​documentele ​de mai sus, ci doar secțiunile indicate în enunț.+  * [[http://​application-notes.digchip.com/​027/​27-45688.pdf| 82559ER Fast Ethernet PCI Controller Software Developer Manual]] 
 + 
 +Nu va trebui să ciți în întregime ​documentul ​de mai sus, ci doar secțiunile indicate în enunț. 
 + 
 +<note important>​Puteți porni implementarea de la zero sau folosi scheletul de cod generat:  
 +      $ LABS=assignments/​6-e100 make skels  
 +</​note>​
  
 ==== Precizări ==== ==== Precizări ====
Line 41: Line 45:
  
 Urmăriți comentariile marcate cu TODO 2: Urmăriți comentariile marcate cu TODO 2:
-  * inițializați device-ul PCI folosind funcția ''​pci_device_enable''​ (activeaza I/O și memoria și trezește device-ul dacă era suspendat)+  * inițializați device-ul PCI folosind funcția ''​pci_enable_device''​ (activeaza I/O și memoria și trezește device-ul dacă era suspendat)
   * rezervați zonele de memorie si I/O pentru device-ul PCI folosind funcția pci_request_regions   * rezervați zonele de memorie si I/O pentru device-ul PCI folosind funcția pci_request_regions
   * device-ul e100 suporta urmatoarele zone (chapter 4.1.10)   * device-ul e100 suporta urmatoarele zone (chapter 4.1.10)
Line 51: Line 55:
 ==== e100 private data ==== ==== e100 private data ====
  
-Structura ''​e100_priv_data''​ va contine informatii specifice fiecarui device de retea gestionat de driver. În primul rând va conține informații despre pci_dev și netdevice-ul curent, apoi informatii de stare, registre, unitatea de transmisie, unitatea de recepție, etc. Spațiul de memorie pentru ''​e100_priv_data''​ se va aloca în funcția ''​alloc_etherdev''​ urmăriți ​capitolul ​[[so2:​teme:​tema6#​structura_net_device]]. ​+Structura ''​e100_priv_data''​ va contine informatii specifice fiecarui device de retea gestionat de driver. În primul rând va conține informații despre pci_dev și netdevice-ul curent, apoi informatii de stare, registre, unitatea de transmisie, unitatea de recepție, etc. Spațiul de memorie pentru ''​e100_priv_data''​ se va aloca în funcția ''​alloc_etherdev''​ urmăriți ​sectiunea ​[[so2:​teme:​tema6#​structura_net_device]]. ​
  
  
Line 59: Line 63:
 Este reprezentarea din kernel a interfeței de rețea din user-space (''​ixeth0'',​ ''​ixeth1'',​ ș.a.m.d) Este reprezentarea din kernel a interfeței de rețea din user-space (''​ixeth0'',​ ''​ixeth1'',​ ș.a.m.d)
  
-Urmăriți comentariile marcate cu TODO 3:+Urmăriți comentariile marcate cu TODO 4:
  
   * structura net_device va fi alocată şi înregistrată (în funcția ''​probe''​) atunci când se descoperă un device de rețea pe magistrala PCI   * structura net_device va fi alocată şi înregistrată (în funcția ''​probe''​) atunci când se descoperă un device de rețea pe magistrala PCI
Line 80: Line 84:
   * transmiterea pachetelor se va face în funcția ''​.ndo_start_xmit''​   * transmiterea pachetelor se va face în funcția ''​.ndo_start_xmit''​
   * driverul va aloca o zonă de memorie DMA (DMA ring) şi va instrui placa de rețea să trimită pachetele din acea zonă.   * driverul va aloca o zonă de memorie DMA (DMA ring) şi va instrui placa de rețea să trimită pachetele din acea zonă.
 +
 +Driverul trebuie sa construiasca un ring DMA in RAM pentru a instrui device-ul e100 unde se găsesc pachetele pe care dorește să le trimită. Secțiunea 6.4 din manual descrie formatul unui DMA ring.
 +
 +Un ring DMA de control este alcătuit din buffere denumite Control Blocks (CB). Un CB generic arată astfel:
 +
 +   ​+--------------+--------------+
 +   ​| ​   CONTROL ​  ​| ​   STATUS ​   |
 +   ​+--------------+--------------+
 +   ​| ​           LINK             |
 +   ​+--------------+--------------+
 +   ​| ​   COMMAND SPECIFIC DATA    |
 +   ​+--------------+--------------+
 +
 +Mai multe detalii despre trimiterea pachetelor citiți in secțiunea ''​Transmitting Packets''​ de [[https://​pdos.csail.mit.edu/​6.828/​2010/​labs/​lab6/​ | aici]]. Urmăriți comentariile marcate cu TODO 5.
  
 ==== Recepționarea pachetelor ==== ==== Recepționarea pachetelor ====
   * recepționarea pachetelor se va face în handlerul de întrerupere   * recepționarea pachetelor se va face în handlerul de întrerupere
   * la primirea unui pachet device-ul ''​e100''​ copiază datele într-o zonă DMA şi generează o întrerupere pentru a informa procesorul de sosirea unui nou pachet.   * la primirea unui pachet device-ul ''​e100''​ copiază datele într-o zonă DMA şi generează o întrerupere pentru a informa procesorul de sosirea unui nou pachet.
- + 
 +Un al doilea DMA ring este necesar pentru recepționarea pachetelor. Fiecare buffer din DMA ring-ul de recepție este denumit 
 +RFD (Receive Frame Descriptor). 
 + 
 +Unitatea de recepție (RU) se ocupă de primirea pachetelor. La primirea unui pachet din rețea, copiaza pachetul în urmator-ul RFD liber, marchează RFD-ul valid și se mută la următorul RFD. 
 + 
 +Mai multe detalii despre trimiterea pachetelor citiți in secțiunea ''​Receiving Packets''​ de [[https://​pdos.csail.mit.edu/​6.828/​2010/​labs/​lab6/​ | aici]]. Urmăriți comentariile cu TODO 6. 
 +===== e100 header ===== 
 + 
 +Antetul e100 conține descrierea in memorie a structurilor importante expuse de device-ul e100. 
 + 
 +   * ''​struct csr'',​ Control/​Status Register descris in secțiunea 6.3.1 
 +   * ''​struct tcb'',​ Transmit Command Block descris in secțiunea 6.4.2.5 
 +   * ''​struct cb'',​ descrie un Command Block generic. 
 ===== Testare ===== ===== Testare =====
  
so2/teme/tema6.1526725325.txt.gz · Last modified: 2018/05/19 13:22 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